diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index ed3ab0375c..13b90f8f80 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -6,7 +6,7 @@ /mkdocs.yml @lstein @blessedcoolant # nodes -/invokeai/app/ @Kyle0654 @blessedcoolant +/invokeai/app/ @Kyle0654 @blessedcoolant @psychedelicious @brandonrising # installation and configuration /pyproject.toml @lstein @blessedcoolant @@ -22,7 +22,7 @@ /invokeai/backend @blessedcoolant @psychedelicious @lstein @maryhipp # generation, model management, postprocessing -/invokeai/backend @damian0815 @lstein @blessedcoolant @jpphoto @gregghelt2 @StAlKeR7779 +/invokeai/backend @damian0815 @lstein @blessedcoolant @gregghelt2 @StAlKeR7779 @brandonrising # front ends /invokeai/frontend/CLI @lstein diff --git a/.github/workflows/mkdocs-material.yml b/.github/workflows/mkdocs-material.yml index d6388bce8d..da9feedf33 100644 --- a/.github/workflows/mkdocs-material.yml +++ b/.github/workflows/mkdocs-material.yml @@ -43,7 +43,7 @@ jobs: --verbose - name: deploy to gh-pages - if: ${{ github.ref == 'refs/heads/v2.3' }} + if: ${{ github.ref == 'refs/heads/main' }} run: | python -m \ mkdocs gh-deploy \ diff --git a/README.md b/README.md index 5ad2b47509..393cb34782 100644 --- a/README.md +++ b/README.md @@ -132,8 +132,10 @@ and go to http://localhost:9090. ### Command-Line Installation (for developers and users familiar with Terminals) -You must have Python 3.9 or 3.10 installed on your machine. Earlier or later versions are -not supported. +You must have Python 3.9 or 3.10 installed on your machine. Earlier or +later versions are not supported. +Node.js also needs to be installed along with yarn (can be installed with +the command `npm install -g yarn` if needed) 1. Open a command-line window on your machine. The PowerShell is recommended for Windows. 2. Create a directory to install InvokeAI into. You'll need at least 15 GB of free space: @@ -197,11 +199,18 @@ not supported. 7. Launch the web server (do it every time you run InvokeAI): ```terminal - invokeai --web + invokeai-web ``` -8. Point your browser to http://localhost:9090 to bring up the web interface. -9. Type `banana sushi` in the box on the top left and click `Invoke`. +8. Build Node.js assets + + ```terminal + cd invokeai/frontend/web/ + yarn vite build + ``` + +9. Point your browser to http://localhost:9090 to bring up the web interface. +10. Type `banana sushi` in the box on the top left and click `Invoke`. Be sure to activate the virtual environment each time before re-launching InvokeAI, using `source .venv/bin/activate` or `.venv\Scripts\activate`. diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index ff9edde30a..ca765b3ca6 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -617,8 +617,6 @@ sections describe what's new for InvokeAI. - `dream.py` script renamed `invoke.py`. A `dream.py` script wrapper remains for backward compatibility. - Completely new WebGUI - launch with `python3 scripts/invoke.py --web` -- Support for [inpainting](deprecated/INPAINTING.md) and - [outpainting](features/OUTPAINTING.md) - img2img runs on all k\* samplers - Support for [negative prompts](features/PROMPTS.md#negative-and-unconditioned-prompts) diff --git a/docs/assets/invoke-web-server-1.png b/docs/assets/invoke-web-server-1.png index e97697ba70..1834bce32e 100644 Binary files a/docs/assets/invoke-web-server-1.png and b/docs/assets/invoke-web-server-1.png differ diff --git a/docs/contributing/LOCAL_DEVELOPMENT.md b/docs/contributing/LOCAL_DEVELOPMENT.md index 956ef5ec03..b2a5cd581d 100644 --- a/docs/contributing/LOCAL_DEVELOPMENT.md +++ b/docs/contributing/LOCAL_DEVELOPMENT.md @@ -81,3 +81,193 @@ pytest --cov; open ./coverage/html/index.html --8<-- "invokeai/frontend/web/README.md" + +## Developing InvokeAI in VSCode + +VSCode offers some nice tools: + +- python debugger +- automatic `venv` activation +- remote dev (e.g. run InvokeAI on a beefy linux desktop while you type in + comfort on your macbook) + +### Setup + +You'll need the +[Python](https://marketplace.visualstudio.com/items?itemName=ms-python.python) +and +[Pylance](https://marketplace.visualstudio.com/items?itemName=ms-python.vscode-pylance) +extensions installed first. + +It's also really handy to install the `Jupyter` extensions: + +- [Jupyter](https://marketplace.visualstudio.com/items?itemName=ms-toolsai.jupyter) +- [Jupyter Cell Tags](https://marketplace.visualstudio.com/items?itemName=ms-toolsai.vscode-jupyter-cell-tags) +- [Jupyter Notebook Renderers](https://marketplace.visualstudio.com/items?itemName=ms-toolsai.jupyter-renderers) +- [Jupyter Slide Show](https://marketplace.visualstudio.com/items?itemName=ms-toolsai.vscode-jupyter-slideshow) + +#### InvokeAI workspace + +Creating a VSCode workspace for working on InvokeAI is highly recommended. It +can hold InvokeAI-specific settings and configs. + +To make a workspace: + +- Open the InvokeAI repo dir in VSCode +- `File` > `Save Workspace As` > save it _outside_ the repo + +#### Default python interpreter (i.e. automatic virtual environment activation) + +- Use command palette to run command + `Preferences: Open Workspace Settings (JSON)` +- Add `python.defaultInterpreterPath` to `settings`, pointing to your `venv`'s + python + +Should look something like this: + +```jsonc +{ + // I like to have all InvokeAI-related folders in my workspace + "folders": [ + { + // repo root + "path": "InvokeAI" + }, + { + // InvokeAI root dir, where `invokeai.yaml` lives + "path": "/path/to/invokeai_root" + } + ], + "settings": { + // Where your InvokeAI `venv`'s python executable lives + "python.defaultInterpreterPath": "/path/to/invokeai_root/.venv/bin/python" + } +} +``` + +Now when you open the VSCode integrated terminal, or do anything that needs to +run python, it will automatically be in your InvokeAI virtual environment. + +Bonus: When you create a Jupyter notebook, when you run it, you'll be prompted +for the python interpreter to run in. This will default to your `venv` python, +and so you'll have access to the same python environment as the InvokeAI app. + +This is _super_ handy. + +#### Debugging configs with `launch.json` + +Debugging configs are managed in a `launch.json` file. Like most VSCode configs, +these can be scoped to a workspace or folder. + +Follow the [official guide](https://code.visualstudio.com/docs/python/debugging) +to set up your `launch.json` and try it out. + +Now we can create the InvokeAI debugging configs: + +```jsonc +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + // Run the InvokeAI backend & serve the pre-built UI + "name": "InvokeAI Web", + "type": "python", + "request": "launch", + "program": "scripts/invokeai-web.py", + "args": [ + // Your InvokeAI root dir (where `invokeai.yaml` lives) + "--root", + "/path/to/invokeai_root", + // Access the app from anywhere on your local network + "--host", + "0.0.0.0" + ], + "justMyCode": true + }, + { + // Run the nodes-based CLI + "name": "InvokeAI CLI", + "type": "python", + "request": "launch", + "program": "scripts/invokeai-cli.py", + "justMyCode": true + }, + { + // Run tests + "name": "InvokeAI Test", + "type": "python", + "request": "launch", + "module": "pytest", + "args": ["--capture=no"], + "justMyCode": true + }, + { + // Run a single test + "name": "InvokeAI Single Test", + "type": "python", + "request": "launch", + "module": "pytest", + "args": [ + // Change this to point to the specific test you are working on + "tests/nodes/test_invoker.py" + ], + "justMyCode": true + }, + { + // This is the default, useful to just run a single file + "name": "Python: File", + "type": "python", + "request": "launch", + "program": "${file}", + "justMyCode": true + } + ] +} +``` + +You'll see these configs in the debugging configs drop down. Running them will +start InvokeAI with attached debugger, in the correct environment, and work just +like the normal app. + +Enjoy debugging InvokeAI with ease (not that we have any bugs of course). + +#### Remote dev + +This is very easy to set up and provides the same very smooth experience as +local development. Environments and debugging, as set up above, just work, +though you'd need to recreate the workspace and debugging configs on the remote. + +Consult the +[official guide](https://code.visualstudio.com/docs/remote/remote-overview) to +get it set up. + +Suggest using VSCode's included settings sync so that your remote dev host has +all the same app settings and extensions automagically. + +##### One remote dev gotcha + +I've found the automatic port forwarding to be very flakey. You can disable it +in `Preferences: Open Remote Settings (ssh: hostname)`. Search for +`remote.autoForwardPorts` and untick the box. + +To forward ports very reliably, use SSH on the remote dev client (e.g. your +macbook). Here's how to forward both backend API port (`9090`) and the frontend +live dev server port (`5173`): + +```bash +ssh \ + -L 9090:localhost:9090 \ + -L 5173:localhost:5173 \ + user@remote-dev-host +``` + +The forwarding stops when you close the terminal window, so suggest to do this +_outside_ the VSCode integrated terminal in case you need to restart VSCode for +an extension update or something + +Now, on your remote dev client, you can open `localhost:9090` and access the UI, +now served from the remote dev host, just the same as if it was running on the +client. diff --git a/docs/features/CONFIGURATION.md b/docs/features/CONFIGURATION.md new file mode 100644 index 0000000000..68c5ced59b --- /dev/null +++ b/docs/features/CONFIGURATION.md @@ -0,0 +1,287 @@ +--- +title: Configuration +--- + +# :material-tune-variant: InvokeAI Configuration + +## Intro + +InvokeAI has numerous runtime settings which can be used to adjust +many aspects of its operations, including the location of files and +directories, memory usage, and performance. These settings can be +viewed and customized in several ways: + +1. By editing settings in the `invokeai.yaml` file. +2. By setting environment variables. +3. On the command-line, when InvokeAI is launched. + +In addition, the most commonly changed settings are accessible +graphically via the `invokeai-configure` script. + +### How the Configuration System Works + +When InvokeAI is launched, the very first thing it needs to do is to +find its "root" directory, which contains its configuration files, +installed models, its database of images, and the folder(s) of +generated images themselves. In this document, the root directory will +be referred to as ROOT. + +#### Finding the Root Directory + +To find its root directory, InvokeAI uses the following recipe: + +1. It first looks for the argument `--root ` on the command line +it was launched from, and uses the indicated path if present. + +2. Next it looks for the environment variable INVOKEAI_ROOT, and uses +the directory path found there if present. + +3. If neither of these are present, then InvokeAI looks for the +folder containing the `.venv` Python virtual environment directory for +the currently active environment. This directory is checked for files +expected inside the InvokeAI root before it is used. + +4. Finally, InvokeAI looks for a directory in the current user's home +directory named `invokeai`. + +#### Reading the InvokeAI Configuration File + +Once the root directory has been located, InvokeAI looks for a file +named `ROOT/invokeai.yaml`, and if present reads configuration values +from it. The top of this file looks like this: + +``` +InvokeAI: + Web Server: + host: localhost + port: 9090 + allow_origins: [] + allow_credentials: true + allow_methods: + - '*' + allow_headers: + - '*' + Features: + esrgan: true + internet_available: true + log_tokenization: false + nsfw_checker: false + patchmatch: true + restore: true +... +``` + +This lines in this file are used to establish default values for +Invoke's settings. In the above fragment, the Web Server's listening +port is set to 9090 by the `port` setting. + +You can edit this file with a text editor such as "Notepad" (do not +use Word or any other word processor). When editing, be careful to +maintain the indentation, and do not add extraneous text, as syntax +errors will prevent InvokeAI from launching. A basic guide to the +format of YAML files can be found +[here](https://circleci.com/blog/what-is-yaml-a-beginner-s-guide/). + +You can fix a broken `invokeai.yaml` by deleting it and running the +configuration script again -- option [7] in the launcher, "Re-run the +configure script". + +#### Reading Environment Variables + +Next InvokeAI looks for defined environment variables in the format +`INVOKEAI_`, for example `INVOKEAI_port`. Environment +variable values take precedence over configuration file variables. On +a Macintosh system, for example, you could change the port that the +web server listens on by setting the environment variable this way: + +``` +export INVOKEAI_port=8000 +invokeai-web +``` + +Please check out these +[Macintosh](https://phoenixnap.com/kb/set-environment-variable-mac) +and +[Windows](https://phoenixnap.com/kb/windows-set-environment-variable) +guides for setting temporary and permanent environment variables. + +#### Reading the Command Line + +Lastly, InvokeAI takes settings from the command line, which override +everything else. The command-line settings have the same name as the +corresponding configuration file settings, preceded by a `--`, for +example `--port 8000`. + +If you are using the launcher (`invoke.sh` or `invoke.bat`) to launch +InvokeAI, then just pass the command-line arguments to the launcher: + +``` +invoke.bat --port 8000 --host 0.0.0.0 +``` + +The arguments will be applied when you select the web server option +(and the other options as well). + +If, on the other hand, you prefer to launch InvokeAI directly from the +command line, you would first activate the virtual environment (known +as the "developer's console" in the launcher), and run `invokeai-web`: + +``` +> C:\Users\Fred\invokeai\.venv\scripts\activate +(.venv) > invokeai-web --port 8000 --host 0.0.0.0 +``` + +You can get a listing and brief instructions for each of the +command-line options by giving the `--help` argument: + +``` +(.venv) > invokeai-web --help +usage: InvokeAI [-h] [--host HOST] [--port PORT] [--allow_origins [ALLOW_ORIGINS ...]] [--allow_credentials | --no-allow_credentials] + [--allow_methods [ALLOW_METHODS ...]] [--allow_headers [ALLOW_HEADERS ...]] [--esrgan | --no-esrgan] + [--internet_available | --no-internet_available] [--log_tokenization | --no-log_tokenization] + [--nsfw_checker | --no-nsfw_checker] [--patchmatch | --no-patchmatch] [--restore | --no-restore] + [--always_use_cpu | --no-always_use_cpu] [--free_gpu_mem | --no-free_gpu_mem] [--max_cache_size MAX_CACHE_SIZE] + [--max_vram_cache_size MAX_VRAM_CACHE_SIZE] [--precision {auto,float16,float32,autocast}] + [--sequential_guidance | --no-sequential_guidance] [--xformers_enabled | --no-xformers_enabled] + [--tiled_decode | --no-tiled_decode] [--root ROOT] [--autoimport_dir AUTOIMPORT_DIR] [--lora_dir LORA_DIR] + [--embedding_dir EMBEDDING_DIR] [--controlnet_dir CONTROLNET_DIR] [--conf_path CONF_PATH] [--models_dir MODELS_DIR] + [--legacy_conf_dir LEGACY_CONF_DIR] [--db_dir DB_DIR] [--outdir OUTDIR] [--from_file FROM_FILE] + [--use_memory_db | --no-use_memory_db] [--model MODEL] [--log_handlers [LOG_HANDLERS ...]] + [--log_format {plain,color,syslog,legacy}] [--log_level {debug,info,warning,error,critical}] +... +``` + +## The Configuration Settings + +The configuration settings are divided into several distinct +groups in `invokeia.yaml`: + +### Web Server + +| Setting | Default Value | Description | +|----------|----------------|--------------| +| `host` | `localhost` | Name or IP address of the network interface that the web server will listen on | +| `port` | `9090` | Network port number that the web server will listen on | +| `allow_origins` | `[]` | A list of host names or IP addresses that are allowed to connect to the InvokeAI API in the format `['host1','host2',...]` | +| `allow_credentials | `true` | Require credentials for a foreign host to access the InvokeAI API (don't change this) | +| `allow_methods` | `*` | List of HTTP methods ("GET", "POST") that the web server is allowed to use when accessing the API | +| `allow_headers` | `*` | List of HTTP headers that the web server will accept when accessing the API | + +The documentation for InvokeAI's API can be accessed by browsing to the following URL: [http://localhost:9090/docs]. + +### Features + +These configuration settings allow you to enable and disable various InvokeAI features: + +| Setting | Default Value | Description | +|----------|----------------|--------------| +| `esrgan` | `true` | Activate the ESRGAN upscaling options| +| `internet_available` | `true` | When a resource is not available locally, try to fetch it via the internet | +| `log_tokenization` | `false` | Before each text2image generation, print a color-coded representation of the prompt to the console; this can help understand why a prompt is not working as expected | +| `nsfw_checker` | `true` | Activate the NSFW checker to blur out risque images | +| `patchmatch` | `true` | Activate the "patchmatch" algorithm for improved inpainting | +| `restore` | `true` | Activate the facial restoration features (DEPRECATED; restoration features will be removed in 3.0.0) | + +### Memory/Performance + +These options tune InvokeAI's memory and performance characteristics. + +| Setting | Default Value | Description | +|----------|----------------|--------------| +| `always_use_cpu` | `false` | Use the CPU to generate images, even if a GPU is available | +| `free_gpu_mem` | `false` | Aggressively free up GPU memory after each operation; this will allow you to run in low-VRAM environments with some performance penalties | +| `max_cache_size` | `6` | Amount of CPU RAM (in GB) to reserve for caching models in memory; more cache allows you to keep models in memory and switch among them quickly | +| `max_vram_cache_size` | `2.75` | Amount of GPU VRAM (in GB) to reserve for caching models in VRAM; more cache speeds up generation but reduces the size of the images that can be generated. This can be set to zero to maximize the amount of memory available for generation. | +| `precision` | `auto` | Floating point precision. One of `auto`, `float16` or `float32`. `float16` will consume half the memory of `float32` but produce slightly lower-quality images. The `auto` setting will guess the proper precision based on your video card and operating system | +| `sequential_guidance` | `false` | Calculate guidance in serial rather than in parallel, lowering memory requirements at the cost of some performance loss | +| `xformers_enabled` | `true` | If the x-formers memory-efficient attention module is installed, activate it for better memory usage and generation speed| +| `tiled_decode` | `false` | If true, then during the VAE decoding phase the image will be decoded a section at a time, reducing memory consumption at the cost of a performance hit | + +### Paths + +These options set the paths of various directories and files used by +InvokeAI. Relative paths are interpreted relative to INVOKEAI_ROOT, so +if INVOKEAI_ROOT is `/home/fred/invokeai` and the path is +`autoimport/main`, then the corresponding directory will be located at +`/home/fred/invokeai/autoimport/main`. + +| Setting | Default Value | Description | +|----------|----------------|--------------| +| `autoimport_dir` | `autoimport/main` | At startup time, read and import any main model files found in this directory | +| `lora_dir` | `autoimport/lora` | At startup time, read and import any LoRA/LyCORIS models found in this directory | +| `embedding_dir` | `autoimport/embedding` | At startup time, read and import any textual inversion (embedding) models found in this directory | +| `controlnet_dir` | `autoimport/controlnet` | At startup time, read and import any ControlNet models found in this directory | +| `conf_path` | `configs/models.yaml` | Location of the `models.yaml` model configuration file | +| `models_dir` | `models` | Location of the directory containing models installed by InvokeAI's model manager | +| `legacy_conf_dir` | `configs/stable-diffusion` | Location of the directory containing the .yaml configuration files for legacy checkpoint models | +| `db_dir` | `databases` | Location of the directory containing InvokeAI's image, schema and session database | +| `outdir` | `outputs` | Location of the directory in which the gallery of generated and uploaded images will be stored | +| `use_memory_db` | `false` | Keep database information in memory rather than on disk; this will not preserve image gallery information across restarts | + +Note that the autoimport directories will be searched recursively, +allowing you to organize the models into folders and subfolders in any +way you wish. In addition, while we have split up autoimport +directories by the type of model they contain, this isn't +necessary. You can combine different model types in the same folder +and InvokeAI will figure out what they are. So you can easily use just +one autoimport directory by commenting out the unneeded paths: + +``` +Paths: + autoimport_dir: autoimport +# lora_dir: null +# embedding_dir: null +# controlnet_dir: null +``` + +### Logging + +These settings control the information, warning, and debugging +messages printed to the console log while InvokeAI is running: + +| Setting | Default Value | Description | +|----------|----------------|--------------| +| `log_handlers` | `console` | This controls where log messages are sent, and can be a list of one or more destinations. Values include `console`, `file`, `syslog` and `http`. These are described in more detail below | +| `log_format` | `color` | This controls the formatting of the log messages. Values are `plain`, `color`, `legacy` and `syslog` | +| `log_level` | `debug` | This filters messages according to the level of severity and can be one of `debug`, `info`, `warning`, `error` and `critical`. For example, setting to `warning` will display all messages at the warning level or higher, but won't display "debug" or "info" messages | + +Several different log handler destinations are available, and multiple destinations are supported by providing a list: + +``` + log_handlers: + - console + - syslog=localhost + - file=/var/log/invokeai.log +``` + +* `console` is the default. It prints log messages to the command-line window from which InvokeAI was launched. + +* `syslog` is only available on Linux and Macintosh systems. It uses + the operating system's "syslog" facility to write log file entries + locally or to a remote logging machine. `syslog` offers a variety + of configuration options: + +``` + syslog=/dev/log` - log to the /dev/log device + syslog=localhost` - log to the network logger running on the local machine + syslog=localhost:512` - same as above, but using a non-standard port + syslog=fredserver,facility=LOG_USER,socktype=SOCK_DRAM` + - Log to LAN-connected server "fredserver" using the facility LOG_USER and datagram packets. +``` + +* `http` can be used to log to a remote web server. The server must be + properly configured to receive and act on log messages. The option + accepts the URL to the web server, and a `method` argument + indicating whether the message should be submitted using the GET or + POST method. + +``` + http=http://my.server/path/to/logger,method=POST +``` + +The `log_format` option provides several alternative formats: + +* `color` - default format providing time, date and a message, using text colors to distinguish different log severities +* `plain` - same as above, but monochrome text only +* `syslog` - the log level and error message only, allowing the syslog system to attach the time and date +* `legacy` - a format similar to the one used by the legacy 2.3 InvokeAI releases. diff --git a/docs/features/NODES.md b/docs/features/NODES.md new file mode 100644 index 0000000000..1f276d2012 --- /dev/null +++ b/docs/features/NODES.md @@ -0,0 +1,206 @@ +# Nodes Editor (Experimental) + +🚨 +*The node editor is experimental. We've made it accessible because we use it to develop the application, but we have not addressed the many known rough edges. It's very easy to shoot yourself in the foot, and we cannot offer support for it until it sees full release (ETA v3.1). Everything is subject to change without warning.* +🚨 + +The nodes editor is a blank canvas allowing for the use of individual functions and image transformations to control the image generation workflow. The node processing flow is usually done from left (inputs) to right (outputs), though linearity can become abstracted the more complex the node graph becomes. Nodes inputs and outputs are connected by dragging connectors from node to node. + +To better understand how nodes are used, think of how an electric power bar works. It takes in one input (electricity from a wall outlet) and passes it to multiple devices through multiple outputs. Similarly, a node could have multiple inputs and outputs functioning at the same (or different) time, but all node outputs pass information onward like a power bar passes electricity. Not all outputs are compatible with all inputs, however - Each node has different constraints on how it is expecting to input/output information. In general, node outputs are colour-coded to match compatible inputs of other nodes. + +## Anatomy of a Node + +Individual nodes are made up of the following: + +- Inputs: Edge points on the left side of the node window where you connect outputs from other nodes. +- Outputs: Edge points on the right side of the node window where you connect to inputs on other nodes. +- Options: Various options which are either manually configured, or overridden by connecting an output from another node to the input. + +## Diffusion Overview + +Taking the time to understand the diffusion process will help you to understand how to set up your nodes in the nodes editor. + +There are two main spaces Stable Diffusion works in: image space and latent space. + +Image space represents images in pixel form that you look at. Latent space represents compressed inputs. It’s in latent space that Stable Diffusion processes images. A VAE (Variational Auto Encoder) is responsible for compressing and encoding inputs into latent space, as well as decoding outputs back into image space. + +When you generate an image using text-to-image, multiple steps occur in latent space: +1. Random noise is generated at the chosen height and width. The noise’s characteristics are dictated by the chosen (or not chosen) seed. This noise tensor is passed into latent space. We’ll call this noise A. +1. Using a model’s U-Net, a noise predictor examines noise A, and the words tokenized by CLIP from your prompt (conditioning). It generates its own noise tensor to predict what the final image might look like in latent space. We’ll call this noise B. +1. Noise B is subtracted from noise A in an attempt to create a final latent image indicative of the inputs. This step is repeated for the number of sampler steps chosen. +1. The VAE decodes the final latent image from latent space into image space. + +image-to-image is a similar process, with only step 1 being different: +1. The input image is decoded from image space into latent space by the VAE. Noise is then added to the input latent image. Denoising Strength dictates how much noise is added, 0 being none, and 1 being all-encompassing. We’ll call this noise A. The process is then the same as steps 2-4 in the text-to-image explanation above. + +Furthermore, a model provides the CLIP prompt tokenizer, the VAE, and a U-Net (where noise prediction occurs given a prompt and initial noise tensor). + +A noise scheduler (eg. DPM++ 2M Karras) schedules the subtraction of noise from the latent image across the sampler steps chosen (step 3 above). Less noise is usually subtracted at higher sampler steps. + +## Node Types (Base Nodes) + +| Node | Function | +| ---------------------------------- | --------------------------------------------------------------------------------------| +| Add | Adds two numbers | +| CannyImageProcessor | Canny edge detection for ControlNet | +| ClipSkip | Skip layers in clip text_encoder model | +| Collect | Collects values into a collection | +| Prompt (Compel) | Parse prompt using compel package to conditioning | +| ContentShuffleImageProcessor | Applies content shuffle processing to image | +| ControlNet | Collects ControlNet info to pass to other nodes | +| CvInpaint | Simple inpaint using opencv | +| Divide | Divides two numbers | +| DynamicPrompt | Parses a prompt using adieyal/dynamic prompt's random or combinatorial generator | +| FloatLinearRange | Creates a range | +| HedImageProcessor | Applies HED edge detection to image | +| ImageBlur | Blurs an image | +| ImageChannel | Gets a channel from an image | +| ImageCollection | Load a collection of images and provide it as output | +| ImageConvert | Converts an image to a different mode | +| ImageCrop | Crops an image to a specified box. The box can be outside of the image. | +| ImageInverseLerp | Inverse linear interpolation of all pixels of an image | +| ImageLerp | Linear interpolation of all pixels of an image | +| ImageMultiply | Multiplies two images together using `PIL.ImageChops.Multiply()` | +| ImagePaste | Pastes an image into another image | +| ImageProcessor | Base class for invocations that reprocess images for ControlNet | +| ImageResize | Resizes an image to specific dimensions | +| ImageScale | Scales an image by a factor | +| ImageToLatents | Scales latents by a given factor | +| InfillColor | Infills transparent areas of an image with a solid color | +| InfillPatchMatch | Infills transparent areas of an image using the PatchMatch algorithm | +| InfillTile | Infills transparent areas of an image with tiles of the image | +| Inpaint | Generates an image using inpaint | +| Iterate | Iterates over a list of items | +| LatentsToImage | Generates an image from latents | +| LatentsToLatents | Generates latents using latents as base image | +| LeresImageProcessor | Applies leres processing to image | +| LineartAnimeImageProcessor | Applies line art anime processing to image | +| LineartImageProcessor | Applies line art processing to image | +| LoadImage | Load an image and provide it as output | +| Lora Loader | Apply selected lora to unet and text_encoder | +| Model Loader | Loads a main model, outputting its submodels | +| MaskFromAlpha | Extracts the alpha channel of an image as a mask | +| MediapipeFaceProcessor | Applies mediapipe face processing to image | +| MidasDepthImageProcessor | Applies Midas depth processing to image | +| MlsdImageProcessor | Applied MLSD processing to image | +| Multiply | Multiplies two numbers | +| Noise | Generates latent noise | +| NormalbaeImageProcessor | Applies NormalBAE processing to image | +| OpenposeImageProcessor | Applies Openpose processing to image | +| ParamFloat | A float parameter | +| ParamInt | An integer parameter | +| PidiImageProcessor | Applies PIDI processing to an image | +| Progress Image | Displays the progress image in the Node Editor | +| RandomInit | Outputs a single random integer | +| RandomRange | Creates a collection of random numbers | +| Range | Creates a range of numbers from start to stop with step | +| RangeOfSize | Creates a range from start to start + size with step | +| ResizeLatents | Resizes latents to explicit width/height (in pixels). Provided dimensions are floor-divided by 8. | +| RestoreFace | Restores faces in the image | +| ScaleLatents | Scales latents by a given factor | +| SegmentAnythingProcessor | Applies segment anything processing to image | +| ShowImage | Displays a provided image, and passes it forward in the pipeline | +| StepParamEasing | Experimental per-step parameter for easing for denoising steps | +| Subtract | Subtracts two numbers | +| TextToLatents | Generates latents from conditionings | +| TileResampleProcessor | Bass class for invocations that preprocess images for ControlNet | +| Upscale | Upscales an image | +| VAE Loader | Loads a VAE model, outputting a VaeLoaderOutput | +| ZoeDepthImageProcessor | Applies Zoe depth processing to image | + +## Node Grouping Concepts + +There are several node grouping concepts that can be examined with a narrow focus. These (and other) groupings can be pieced together to make up functional graph setups, and are important to understanding how groups of nodes work together as part of a whole. Note that the screenshots below aren't examples of complete functioning node graphs (see Examples). + +### Noise + +As described, an initial noise tensor is necessary for the latent diffusion process. As a result, all non-image *ToLatents nodes require a noise node input. + +groupsnoise + +### Conditioning + +As described, conditioning is necessary for the latent diffusion process, whether empty or not. As a result, all non-image *ToLatents nodes require positive and negative conditioning inputs. Conditioning is reliant on a CLIP tokenizer provided by the Model Loader node. + +groupsconditioning + +### Image Space & VAE + +The ImageToLatents node doesn't require a noise node input, but requires a VAE input to convert the image from image space into latent space. In reverse, the LatentsToImage node requires a VAE input to convert from latent space back into image space. + +groupsimgvae + +### Defined & Random Seeds + +It is common to want to use both the same seed (for continuity) and random seeds (for variance). To define a seed, simply enter it into the 'Seed' field on a noise node. Conversely, the RandomInt node generates a random integer between 'Low' and 'High', and can be used as input to the 'Seed' edge point on a noise node to randomize your seed. + +groupsrandseed + +### Control + +Control means to guide the diffusion process to adhere to a defined input or structure. Control can be provided as input to non-image *ToLatents nodes from ControlNet nodes. ControlNet nodes usually require an image processor which converts an input image for use with ControlNet. + +groupscontrol + +### LoRA + +The Lora Loader node lets you load a LoRA (say that ten times fast) and pass it as output to both the Prompt (Compel) and non-image *ToLatents nodes. A model's CLIP tokenizer is passed through the LoRA into Prompt (Compel), where it affects conditioning. A model's U-Net is also passed through the LoRA into a non-image *ToLatents node, where it affects noise prediction. + +groupslora + +### Scaling + +Use the ImageScale, ScaleLatents, and Upscale nodes to upscale images and/or latent images. The chosen method differs across contexts. However, be aware that latents are already noisy and compressed at their original resolution; scaling an image could produce more detailed results. + +groupsallscale + +### Iteration + Multiple Images as Input + +Iteration is a common concept in any processing, and means to repeat a process with given input. In nodes, you're able to use the Iterate node to iterate through collections usually gathered by the Collect node. The Iterate node has many potential uses, from processing a collection of images one after another, to varying seeds across multiple image generations and more. This screenshot demonstrates how to collect several images and pass them out one at a time. + +groupsiterate + +### Multiple Image Generation + Random Seeds + +Multiple image generation in the node editor is done using the RandomRange node. In this case, the 'Size' field represents the number of images to generate. As RandomRange produces a collection of integers, we need to add the Iterate node to iterate through the collection. + +To control seeds across generations takes some care. The first row in the screenshot will generate multiple images with different seeds, but using the same RandomRange parameters across invocations will result in the same group of random seeds being used across the images, producing repeatable results. In the second row, adding the RandomInt node as input to RandomRange's 'Seed' edge point will ensure that seeds are varied across all images across invocations, producing varied results. + +groupsmultigenseeding + +## Examples + +With our knowledge of node grouping and the diffusion process, let’s break down some basic graphs in the nodes editor. Note that a node's options can be overridden by inputs from other nodes. These examples aren't strict rules to follow and only demonstrate some basic configurations. + +### Basic text-to-image Node Graph + +nodest2i + +- Model Loader: A necessity to generating images (as we’ve read above). We choose our model from the dropdown. It outputs a U-Net, CLIP tokenizer, and VAE. +- Prompt (Compel): Another necessity. Two prompt nodes are created. One will output positive conditioning (what you want, ‘dog’), one will output negative (what you don’t want, ‘cat’). They both input the CLIP tokenizer that the Model Loader node outputs. +- Noise: Consider this noise A from step one of the text-to-image explanation above. Choose a seed number, width, and height. +- TextToLatents: This node takes many inputs for converting and processing text & noise from image space into latent space, hence the name TextTo**Latents**. In this setup, it inputs positive and negative conditioning from the prompt nodes for processing (step 2 above). It inputs noise from the noise node for processing (steps 2 & 3 above). Lastly, it inputs a U-Net from the Model Loader node for processing (step 2 above). It outputs latents for use in the next LatentsToImage node. Choose number of sampler steps, CFG scale, and scheduler. +- LatentsToImage: This node takes in processed latents from the TextToLatents node, and the model’s VAE from the Model Loader node which is responsible for decoding latents back into the image space, hence the name LatentsTo**Image**. This node is the last stop, and once the image is decoded, it is saved to the gallery. + +### Basic image-to-image Node Graph + +nodesi2i + +- Model Loader: Choose a model from the dropdown. +- Prompt (Compel): Two prompt nodes. One positive (dog), one negative (dog). Same CLIP inputs from the Model Loader node as before. +- ImageToLatents: Upload a source image directly in the node window, via drag'n'drop from the gallery, or passed in as input. The ImageToLatents node inputs the VAE from the Model Loader node to decode the chosen image from image space into latent space, hence the name ImageTo**Latents**. It outputs latents for use in the next LatentsToLatents node. It also outputs the source image's width and height for use in the next Noise node if the final image is to be the same dimensions as the source image. +- Noise: A noise tensor is created with the width and height of the source image, and connected to the next LatentsToLatents node. Notice the width and height fields are overridden by the input from the ImageToLatents width and height outputs. +- LatentsToLatents: The inputs and options are nearly identical to TextToLatents, except that LatentsToLatents also takes latents as an input. Considering our source image is already converted to latents in the last ImageToLatents node, and text + noise are no longer the only inputs to process, we use the LatentsToLatents node. +- LatentsToImage: Like previously, the LatentsToImage node will use the VAE from the Model Loader as input to decode the latents from LatentsToLatents into image space, and save it to the gallery. + +### Basic ControlNet Node Graph + +nodescontrol + +- Model Loader +- Prompt (Compel) +- Noise: Width and height of the CannyImageProcessor ControlNet image is passed in to set the dimensions of the noise passed to TextToLatents. +- CannyImageProcessor: The CannyImageProcessor node is used to process the source image being used as a ControlNet. Each ControlNet processor node applies control in different ways, and has some different options to configure. Width and height are passed to noise, as mentioned. The processed ControlNet image is output to the ControlNet node. +- ControlNet: Select the type of control model. In this case, canny is chosen as the CannyImageProcessor was used to generate the ControlNet image. Configure the control node options, and pass the control output to TextToLatents. +- TextToLatents: Similar to the basic text-to-image example, except ControlNet is passed to the control input edge point. +- LatentsToImage diff --git a/docs/features/WEB.md b/docs/features/WEB.md index ef541736d9..7707a824c6 100644 --- a/docs/features/WEB.md +++ b/docs/features/WEB.md @@ -76,10 +76,10 @@ From top to bottom, these are: with outpainting,and modify interior portions of the image with inpainting, erase portions of a starting image and have the AI fill in the erased region from a text prompt. -4. Workflow Management (not yet implemented) - this panel will allow you to create +4. Node Editor - this panel allows you to create pipelines of common operations and combine them into workflows. -5. Training (not yet implemented) - this panel will provide an interface to [textual - inversion training](TEXTUAL_INVERSION.md) and fine tuning. +5. Model Manager - this panel allows you to import and configure new + models using URLs, local paths, or HuggingFace diffusers repo_ids. The inpainting, outpainting and postprocessing tabs are currently in development. However, limited versions of their features can already be accessed diff --git a/docs/features/index.md b/docs/features/index.md index 12539ca98f..b690d0b158 100644 --- a/docs/features/index.md +++ b/docs/features/index.md @@ -37,7 +37,7 @@ guide also covers optimizing models to load quickly. Teach an old model new tricks. Merge 2-3 models together to create a new model that combines characteristics of the originals. -## * [Textual Inversion](TEXTUAL_INVERSION.md) +## * [Textual Inversion](TRAINING.md) Personalize models by adding your own style or subjects. # Other Features diff --git a/docs/index.md b/docs/index.md index 3af8571df9..229cb6cf05 100644 --- a/docs/index.md +++ b/docs/index.md @@ -146,13 +146,15 @@ This method is recommended for those familiar with running Docker containers - [Installing](installation/050_INSTALLING_MODELS.md) - [Model Merging](features/MODEL_MERGING.md) - [Style/Subject Concepts and Embeddings](features/CONCEPTS.md) -- [Textual Inversion](features/TEXTUAL_INVERSION.md) - [Not Safe for Work (NSFW) Checker](features/NSFW.md) ### Prompt Engineering - [Prompt Syntax](features/PROMPTS.md) - [Generating Variations](features/VARIATIONS.md) +### InvokeAI Configuration +- [Guide to InvokeAI Runtime Settings](features/CONFIGURATION.md) + ## :octicons-log-16: Important Changes Since Version 2.3 ### Nodes diff --git a/docs/installation/010_INSTALL_AUTOMATED.md b/docs/installation/010_INSTALL_AUTOMATED.md index c710ed17b1..d4b4a4d64a 100644 --- a/docs/installation/010_INSTALL_AUTOMATED.md +++ b/docs/installation/010_INSTALL_AUTOMATED.md @@ -354,8 +354,8 @@ experimental versions later. 12. **InvokeAI Options**: You can launch InvokeAI with several different command-line arguments that customize its behavior. For example, you can change the location of the - image output directory, or select your favorite sampler. See the - [Command-Line Interface](../features/CLI.md) for a full list of the options. + image output directory or balance memory usage vs performance. See + [Configuration](../features/CONFIGURATION.md) for a full list of the options. - To set defaults that will take effect every time you launch InvokeAI, use a text editor (e.g. Notepad) to exit the file diff --git a/docs/installation/020_INSTALL_MANUAL.md b/docs/installation/020_INSTALL_MANUAL.md index 670b62e1ed..75309c5fea 100644 --- a/docs/installation/020_INSTALL_MANUAL.md +++ b/docs/installation/020_INSTALL_MANUAL.md @@ -256,7 +256,7 @@ manager, please follow these steps: 10. Render away! - Browse the [features](../features/CLI.md) section to learn about all the + Browse the [features](../features/index.md) section to learn about all the things you can do with InvokeAI. @@ -270,7 +270,7 @@ manager, please follow these steps: 12. Other scripts - The [Textual Inversion](../features/TEXTUAL_INVERSION.md) script can be launched with the command: + The [Textual Inversion](../features/TRAINING.md) script can be launched with the command: ```bash invokeai-ti --gui diff --git a/docs/installation/050_INSTALLING_MODELS.md b/docs/installation/050_INSTALLING_MODELS.md index 9c8a83489f..ce2004e841 100644 --- a/docs/installation/050_INSTALLING_MODELS.md +++ b/docs/installation/050_INSTALLING_MODELS.md @@ -43,24 +43,7 @@ InvokeAI comes with support for a good set of starter models. You'll find them listed in the master models file `configs/INITIAL_MODELS.yaml` in the InvokeAI root directory. The subset that are currently installed are found in -`configs/models.yaml`. As of v2.3.1, the list of starter models is: - -|Model Name | HuggingFace Repo ID | Description | URL | -|---------- | ---------- | ----------- | --- | -|stable-diffusion-1.5|runwayml/stable-diffusion-v1-5|Stable Diffusion version 1.5 diffusers model (4.27 GB)|https://huggingface.co/runwayml/stable-diffusion-v1-5 | -|sd-inpainting-1.5|runwayml/stable-diffusion-inpainting|RunwayML SD 1.5 model optimized for inpainting, diffusers version (4.27 GB)|https://huggingface.co/runwayml/stable-diffusion-inpainting | -|stable-diffusion-2.1|stabilityai/stable-diffusion-2-1|Stable Diffusion version 2.1 diffusers model, trained on 768 pixel images (5.21 GB)|https://huggingface.co/stabilityai/stable-diffusion-2-1 | -|sd-inpainting-2.0|stabilityai/stable-diffusion-2-inpainting|Stable Diffusion version 2.0 inpainting model (5.21 GB)|https://huggingface.co/stabilityai/stable-diffusion-2-inpainting | -|analog-diffusion-1.0|wavymulder/Analog-Diffusion|An SD-1.5 model trained on diverse analog photographs (2.13 GB)|https://huggingface.co/wavymulder/Analog-Diffusion | -|deliberate-1.0|XpucT/Deliberate|Versatile model that produces detailed images up to 768px (4.27 GB)|https://huggingface.co/XpucT/Deliberate | -|d&d-diffusion-1.0|0xJustin/Dungeons-and-Diffusion|Dungeons & Dragons characters (2.13 GB)|https://huggingface.co/0xJustin/Dungeons-and-Diffusion | -|dreamlike-photoreal-2.0|dreamlike-art/dreamlike-photoreal-2.0|A photorealistic model trained on 768 pixel images based on SD 1.5 (2.13 GB)|https://huggingface.co/dreamlike-art/dreamlike-photoreal-2.0 | -|inkpunk-1.0|Envvi/Inkpunk-Diffusion|Stylized illustrations inspired by Gorillaz, FLCL and Shinkawa; prompt with "nvinkpunk" (4.27 GB)|https://huggingface.co/Envvi/Inkpunk-Diffusion | -|openjourney-4.0|prompthero/openjourney|An SD 1.5 model fine tuned on Midjourney; prompt with "mdjrny-v4 style" (2.13 GB)|https://huggingface.co/prompthero/openjourney | -|portrait-plus-1.0|wavymulder/portraitplus|An SD-1.5 model trained on close range portraits of people; prompt with "portrait+" (2.13 GB)|https://huggingface.co/wavymulder/portraitplus | -|seek-art-mega-1.0|coreco/seek.art_MEGA|A general use SD-1.5 "anything" model that supports multiple styles (2.1 GB)|https://huggingface.co/coreco/seek.art_MEGA | -|trinart-2.0|naclbit/trinart_stable_diffusion_v2|An SD-1.5 model finetuned with ~40K assorted high resolution manga/anime-style images (2.13 GB)|https://huggingface.co/naclbit/trinart_stable_diffusion_v2 | -|waifu-diffusion-1.4|hakurei/waifu-diffusion|An SD-1.5 model trained on 680k anime/manga-style images (2.13 GB)|https://huggingface.co/hakurei/waifu-diffusion | +`configs/models.yaml`. Note that these files are covered by an "Ethical AI" license which forbids certain uses. When you initially download them, you are asked @@ -71,8 +54,7 @@ with the model terms by visiting the URLs in the table above. ## Community-Contributed Models -There are too many to list here and more are being contributed every -day. [HuggingFace](https://huggingface.co/models?library=diffusers) +[HuggingFace](https://huggingface.co/models?library=diffusers) is a great resource for diffusers models, and is also the home of a [fast-growing repository](https://huggingface.co/sd-concepts-library) of embedding (".bin") models that add subjects and/or styles to your @@ -86,310 +68,106 @@ only `.safetensors` and `.ckpt` models, but they can be easily loaded into InvokeAI and/or converted into optimized `diffusers` models. Be aware that CIVITAI hosts many models that generate NSFW content. -!!! note - - InvokeAI 2.3.x does not support directly importing and - running Stable Diffusion version 2 checkpoint models. You may instead - convert them into `diffusers` models using the conversion methods - described below. - ## Installation -There are multiple ways to install and manage models: +There are two ways to install and manage models: -1. The `invokeai-configure` script which will download and install them for you. +1. The `invokeai-model-install` script which will download and install +them for you. In addition to supporting main models, you can install +ControlNet, LoRA and Textual Inversion models. -2. The command-line tool (CLI) has commands that allows you to import, configure and modify - models files. - -3. The web interface (WebUI) has a GUI for importing and managing +2. The web interface (WebUI) has a GUI for importing and managing models. -### Installation via `invokeai-configure` +3. By placing models (or symbolic links to models) inside one of the +InvokeAI root directory's `autoimport` folder. -From the `invoke` launcher, choose option (6) "re-run the configure -script to download new models." This will launch the same script that -prompted you to select models at install time. You can use this to add -models that you skipped the first time around. It is all right to -specify a model that was previously downloaded; the script will just -confirm that the files are complete. +### Installation via `invokeai-model-install` -### Installation via the CLI +From the `invoke` launcher, choose option [5] "Download and install +models." This will launch the same script that prompted you to select +models at install time. You can use this to add models that you +skipped the first time around. It is all right to specify a model that +was previously downloaded; the script will just confirm that the files +are complete. -You can install a new model, including any of the community-supported ones, via -the command-line client's `!import_model` command. +The installer has different panels for installing main models from +HuggingFace, models from Civitai and other arbitrary web sites, +ControlNet models, LoRA/LyCORIS models, and Textual Inversion +embeddings. Each section has a text box in which you can enter a new +model to install. You can refer to a model using its: -#### Installing individual `.ckpt` and `.safetensors` models +1. Local path to the .ckpt, .safetensors or diffusers folder on your local machine +2. A directory on your machine that contains multiple models +3. A URL that points to a downloadable model +4. A HuggingFace repo id -If the model is already downloaded to your local disk, use -`!import_model /path/to/file.ckpt` to load it. For example: +Previously-installed models are shown with checkboxes. Uncheck a box +to unregister the model from InvokeAI. Models that are physically +installed inside the InvokeAI root directory will be deleted and +purged (after a confirmation warning). Models that are located outside +the InvokeAI root directory will be unregistered but not deleted. -```bash -invoke> !import_model C:/Users/fred/Downloads/martians.safetensors +Note: The installer script uses a console-based text interface that requires +significant amounts of horizontal and vertical space. If the display +looks messed up, just enlarge the terminal window and/or relaunch the +script. + +If you wish you can script model addition and deletion, as well as +listing installed models. Start the "developer's console" and give the +command `invokeai-model-install --help`. This will give you a series +of command-line parameters that will let you control model +installation. Examples: + +``` +# (list all controlnet models) +invokeai-model-install --list controlnet + +# (install the model at the indicated URL) +invokeai-model-install --add http://civitai.com/2860 + +# (delete the named model) +invokeai-model-install --delete sd-1/main/analog-diffusion ``` -!!! tip "Forward Slashes" - On Windows systems, use forward slashes rather than backslashes - in your file paths. - If you do use backslashes, - you must double them like this: - `C:\\Users\\fred\\Downloads\\martians.safetensors` +### Installation via the Web GUI -Alternatively you can directly import the file using its URL: +To install a new model using the Web GUI, do the following: -```bash -invoke> !import_model https://example.org/sd_models/martians.safetensors -``` +1. Open the InvokeAI Model Manager (cube at the bottom of the +left-hand panel) and navigate to *Import Models* -For this to work, the URL must not be password-protected. Otherwise -you will receive a 404 error. +2. In the field labeled *Location* type in the path to the model you +wish to install. You may use a URL, HuggingFace repo id, or a path on +your local disk. -When you import a legacy model, the CLI will first ask you what type -of model this is. You can indicate whether it is a model based on -Stable Diffusion 1.x (1.4 or 1.5), one based on Stable Diffusion 2.x, -or a 1.x inpainting model. Be careful to indicate the correct model -type, or it will not load correctly. You can correct the model type -after the fact using the `!edit_model` command. +3. Alternatively, the *Scan for Models* button allows you to paste in +the path to a folder somewhere on your machine. It will be scanned for +importable models and prompt you to add the ones of your choice. -The system will then ask you a few other questions about the model, -including what size image it was trained on (usually 512x512), what -name and description you wish to use for it, and whether you would -like to install a custom VAE (variable autoencoder) file for the -model. For recent models, the answer to the VAE question is usually -"no," but it won't hurt to answer "yes". +4. Press *Add Model* and wait for confirmation that the model +was added. -After importing, the model will load. If this is successful, you will -be asked if you want to keep the model loaded in memory to start -generating immediately. You'll also be asked if you wish to make this -the default model on startup. You can change this later using -`!edit_model`. +To delete a model, Select *Model Manager* to list all the currently +installed models. Press the trash can icons to delete any models you +wish to get rid of. Models whose weights are located inside the +InvokeAI `models` directory will be purged from disk, while those +located outside will be unregistered from InvokeAI, but not deleted. -#### Importing a batch of `.ckpt` and `.safetensors` models from a directory +You can see where model weights are located by clicking on the model name. +This will bring up an editable info panel showing the model's characteristics, +including the `Model Location` of its files. -You may also point `!import_model` to a directory containing a set of -`.ckpt` or `.safetensors` files. They will be imported _en masse_. +### Installation via the `autoimport` function -!!! example +In the InvokeAI root directory you will find a series of folders under +`autoimport`, one each for main models, controlnets, embeddings and +Loras. Any models that you add to these directories will be scanned +at startup time and registered automatically. - ```console - invoke> !import_model C:/Users/fred/Downloads/civitai_models/ - ``` +You may create symbolic links from these folders to models located +elsewhere on disk and they will be autoimported. You can also create +subfolders and organize them as you wish. -You will be given the option to import all models found in the -directory, or select which ones to import. If there are subfolders -within the directory, they will be searched for models to import. - -#### Installing `diffusers` models - -You can install a `diffusers` model from the HuggingFace site using -`!import_model` and the HuggingFace repo_id for the model: - -```bash -invoke> !import_model andite/anything-v4.0 -``` - -Alternatively, you can download the model to disk and import it from -there. The model may be distributed as a ZIP file, or as a Git -repository: - -```bash -invoke> !import_model C:/Users/fred/Downloads/andite--anything-v4.0 -``` - -!!! tip "The CLI supports file path autocompletion" - Type a bit of the path name and hit ++tab++ in order to get a choice of - possible completions. - -!!! tip "On Windows, you can drag model files onto the command-line" - Once you have typed in `!import_model `, you can drag the - model file or directory onto the command-line to insert the model path. This way, you don't need to - type it or copy/paste. However, you will need to reverse or - double backslashes as noted above. - -Before installing, the CLI will ask you for a short name and -description for the model, whether to make this the default model that -is loaded at InvokeAI startup time, and whether to replace its -VAE. Generally the answer to the latter question is "no". - -### Converting legacy models into `diffusers` - -The CLI `!convert_model` will convert a `.safetensors` or `.ckpt` -models file into `diffusers` and install it.This will enable the model -to load and run faster without loss of image quality. - -The usage is identical to `!import_model`. You may point the command -to either a downloaded model file on disk, or to a (non-password -protected) URL: - -```bash -invoke> !convert_model C:/Users/fred/Downloads/martians.safetensors -``` - -After a successful conversion, the CLI will offer you the option of -deleting the original `.ckpt` or `.safetensors` file. - -### Optimizing a previously-installed model - -Lastly, if you have previously installed a `.ckpt` or `.safetensors` -file and wish to convert it into a `diffusers` model, you can do this -without re-downloading and converting the original file using the -`!optimize_model` command. Simply pass the short name of an existing -installed model: - -```bash -invoke> !optimize_model martians-v1.0 -``` - -The model will be converted into `diffusers` format and replace the -previously installed version. You will again be offered the -opportunity to delete the original `.ckpt` or `.safetensors` file. - -### Related CLI Commands - -There are a whole series of additional model management commands in -the CLI that you can read about in [Command-Line -Interface](../features/CLI.md). These include: - -* `!models` - List all installed models -* `!switch ` - Switch to the indicated model -* `!edit_model ` - Edit the indicated model to change its name, description or other properties -* `!del_model ` - Delete the indicated model - -### Manually editing `configs/models.yaml` - - -If you are comfortable with a text editor then you may simply edit `models.yaml` -directly. - -You will need to download the desired `.ckpt/.safetensors` file and -place it somewhere on your machine's filesystem. Alternatively, for a -`diffusers` model, record the repo_id or download the whole model -directory. Then using a **text** editor (e.g. the Windows Notepad -application), open the file `configs/models.yaml`, and add a new -stanza that follows this model: - -#### A legacy model - -A legacy `.ckpt` or `.safetensors` entry will look like this: - -```yaml -arabian-nights-1.0: - description: A great fine-tune in Arabian Nights style - weights: ./path/to/arabian-nights-1.0.ckpt - config: ./configs/stable-diffusion/v1-inference.yaml - format: ckpt - width: 512 - height: 512 - default: false -``` - -Note that `format` is `ckpt` for both `.ckpt` and `.safetensors` files. - -#### A diffusers model - -A stanza for a `diffusers` model will look like this for a HuggingFace -model with a repository ID: - -```yaml -arabian-nights-1.1: - description: An even better fine-tune of the Arabian Nights - repo_id: captahab/arabian-nights-1.1 - format: diffusers - default: true -``` - -And for a downloaded directory: - -```yaml -arabian-nights-1.1: - description: An even better fine-tune of the Arabian Nights - path: /path/to/captahab-arabian-nights-1.1 - format: diffusers - default: true -``` - -There is additional syntax for indicating an external VAE to use with -this model. See `INITIAL_MODELS.yaml` and `models.yaml` for examples. - -After you save the modified `models.yaml` file relaunch -`invokeai`. The new model will now be available for your use. - -### Installation via the WebUI - -To access the WebUI Model Manager, click on the button that looks like -a cube in the upper right side of the browser screen. This will bring -up a dialogue that lists the models you have already installed, and -allows you to load, delete or edit them: - -
- -![model-manager](../assets/installing-models/webui-models-1.png) - -
- -To add a new model, click on **+ Add New** and select to either a -checkpoint/safetensors model, or a diffusers model: - -
- -![model-manager-add-new](../assets/installing-models/webui-models-2.png) - -
- -In this example, we chose **Add Diffusers**. As shown in the figure -below, a new dialogue prompts you to enter the name to use for the -model, its description, and either the location of the `diffusers` -model on disk, or its Repo ID on the HuggingFace web site. If you -choose to enter a path to disk, the system will autocomplete for you -as you type: - -
- -![model-manager-add-diffusers](../assets/installing-models/webui-models-3.png) - -
- -Press **Add Model** at the bottom of the dialogue (scrolled out of -site in the figure), and the model will be downloaded, imported, and -registered in `models.yaml`. - -The **Add Checkpoint/Safetensor Model** option is similar, except that -in this case you can choose to scan an entire folder for -checkpoint/safetensors files to import. Simply type in the path of the -directory and press the "Search" icon. This will display the -`.ckpt` and `.safetensors` found inside the directory and its -subfolders, and allow you to choose which ones to import: - -
- -![model-manager-add-checkpoint](../assets/installing-models/webui-models-4.png) - -
- -## Model Management Startup Options - -The `invoke` launcher and the `invokeai` script accept a series of -command-line arguments that modify InvokeAI's behavior when loading -models. These can be provided on the command line, or added to the -InvokeAI root directory's `invokeai.init` initialization file. - -The arguments are: - -* `--model ` -- Start up with the indicated model loaded -* `--ckpt_convert` -- When a checkpoint/safetensors model is loaded, convert it into a `diffusers` model in memory. This does not permanently save the converted model to disk. -* `--autoconvert ` -- Scan the indicated directory path for new checkpoint/safetensors files, convert them into `diffusers` models, and import them into InvokeAI. - -Here is an example of providing an argument on the command line using -the `invoke.sh` launch script: - -```bash -invoke.sh --autoconvert /home/fred/stable-diffusion-checkpoints -``` - -And here is what the same argument looks like in `invokeai.init`: - -```bash ---outdir="/home/fred/invokeai/outputs ---no-nsfw_checker ---autoconvert /home/fred/stable-diffusion-checkpoints -``` +The location of the autoimport directories are controlled by settings +in `invokeai.yaml`. See [Configuration](../features/CONFIGURATION.md). \ No newline at end of file diff --git a/installer/create_installer.sh b/installer/create_installer.sh index eac0028493..1ab82254a4 100755 --- a/installer/create_installer.sh +++ b/installer/create_installer.sh @@ -24,7 +24,8 @@ read -e -p "Tag this repo with '${VERSION}' and '${LATEST_TAG}'? [n]: " input RESPONSE=${input:='n'} if [ "$RESPONSE" == 'y' ]; then - if ! git tag $VERSION ; then + git push origin :refs/tags/$VERSION + if ! git tag -fa $VERSION ; then echo "Existing/invalid tag" exit -1 fi diff --git a/installer/install.bat.in b/installer/install.bat.in index 8f729e758d..ffe96d4355 100644 --- a/installer/install.bat.in +++ b/installer/install.bat.in @@ -38,7 +38,7 @@ echo https://learn.microsoft.com/en-US/cpp/windows/latest-supported-vc-redist echo. echo See %INSTRUCTIONS% for more details. echo. -echo "For the best user experience we suggest enlarging or maximizing this window now." +echo FOR THE BEST USER EXPERIENCE WE SUGGEST MAXIMIZING THIS WINDOW NOW. pause @rem ---------------------------- check Python version --------------- diff --git a/installer/templates/invoke.bat.in b/installer/templates/invoke.bat.in index 7900eac1cf..5c6465ee3a 100644 --- a/installer/templates/invoke.bat.in +++ b/installer/templates/invoke.bat.in @@ -19,7 +19,7 @@ echo 8. Open the developer console echo 9. Update InvokeAI echo 10. Command-line help echo Q - Quit -set /P choice="Please enter 1-10, Q: [2] " +set /P choice="Please enter 1-10, Q: [1] " if not defined choice set choice=1 IF /I "%choice%" == "1" ( echo Starting the InvokeAI browser-based UI.. diff --git a/invokeai/app/api/dependencies.py b/invokeai/app/api/dependencies.py index cb867354a5..555c60a383 100644 --- a/invokeai/app/api/dependencies.py +++ b/invokeai/app/api/dependencies.py @@ -11,6 +11,7 @@ from invokeai.app.services.board_images import ( ) from invokeai.app.services.board_record_storage import SqliteBoardRecordStorage from invokeai.app.services.boards import BoardService, BoardServiceDependencies +from invokeai.app.services.config import InvokeAIAppConfig from invokeai.app.services.image_record_storage import SqliteImageRecordStorage from invokeai.app.services.images import ImageService, ImageServiceDependencies from invokeai.app.services.resource_name import SimpleNameService @@ -20,7 +21,6 @@ from invokeai.version.invokeai_version import __version__ from ..services.default_graphs import create_system_graphs from ..services.latent_storage import DiskLatentsStorage, ForwardCacheLatentsStorage -from ..services.restoration_services import RestorationServices from ..services.graph import GraphExecutionState, LibraryGraph from ..services.image_file_storage import DiskImageFileStorage from ..services.invocation_queue import MemoryInvocationQueue @@ -57,8 +57,8 @@ class ApiDependencies: invoker: Invoker = None @staticmethod - def initialize(config, event_handler_id: int, logger: Logger = logger): - logger.debug(f'InvokeAI version {__version__}') + def initialize(config: InvokeAIAppConfig, event_handler_id: int, logger: Logger = logger): + logger.debug(f"InvokeAI version {__version__}") logger.debug(f"Internet connectivity is {config.internet_available}") events = FastAPIEventService(event_handler_id) @@ -117,7 +117,7 @@ class ApiDependencies: ) services = InvocationServices( - model_manager=ModelManagerService(config,logger), + model_manager=ModelManagerService(config, logger), events=events, latents=latents, images=images, @@ -129,7 +129,6 @@ class ApiDependencies: ), graph_execution_manager=graph_execution_manager, processor=DefaultInvocationProcessor(), - restoration=RestorationServices(config, logger), configuration=config, logger=logger, ) diff --git a/invokeai/app/api/routers/images.py b/invokeai/app/api/routers/images.py index a0428e772e..3da94df7f4 100644 --- a/invokeai/app/api/routers/images.py +++ b/invokeai/app/api/routers/images.py @@ -19,6 +19,9 @@ from ..dependencies import ApiDependencies images_router = APIRouter(prefix="/v1/images", tags=["images"]) +# images are immutable; set a high max-age +IMAGE_MAX_AGE = 31536000 + @images_router.post( "/", @@ -155,12 +158,14 @@ async def get_image_full( if not ApiDependencies.invoker.services.images.validate_path(path): raise HTTPException(status_code=404) - return FileResponse( + response = FileResponse( path, media_type="image/png", filename=image_name, content_disposition_type="inline", ) + response.headers["Cache-Control"] = f"max-age={IMAGE_MAX_AGE}" + return response except Exception as e: raise HTTPException(status_code=404) @@ -189,9 +194,11 @@ async def get_image_thumbnail( if not ApiDependencies.invoker.services.images.validate_path(path): raise HTTPException(status_code=404) - return FileResponse( + response = FileResponse( path, media_type="image/webp", content_disposition_type="inline" ) + response.headers["Cache-Control"] = f"max-age={IMAGE_MAX_AGE}" + return response except Exception as e: raise HTTPException(status_code=404) diff --git a/invokeai/app/api/routers/models.py b/invokeai/app/api/routers/models.py index 8dbeaa3d05..cc6d09f761 100644 --- a/invokeai/app/api/routers/models.py +++ b/invokeai/app/api/routers/models.py @@ -1,6 +1,7 @@ -# Copyright (c) 2023 Kyle Schouviller (https://github.com/kyle0654), 2023 Kent Keirsey (https://github.com/hipsterusername), 2024 Lincoln Stein +# Copyright (c) 2023 Kyle Schouviller (https://github.com/kyle0654), 2023 Kent Keirsey (https://github.com/hipsterusername), 2023 Lincoln D. Stein +import pathlib from typing import Literal, List, Optional, Union from fastapi import Body, Path, Query, Response @@ -12,8 +13,11 @@ from invokeai.backend import BaseModelType, ModelType from invokeai.backend.model_management.models import ( OPENAPI_MODEL_CONFIGS, SchedulerPredictionType, + ModelNotFoundException, + InvalidModelException, ) from invokeai.backend.model_management import MergeInterpolationMethod + from ..dependencies import ApiDependencies models_router = APIRouter(prefix="/v1/models", tags=["models"]) @@ -22,6 +26,7 @@ UpdateModelResponse = Union[tuple(OPENAPI_MODEL_CONFIGS)] ImportModelResponse = Union[tuple(OPENAPI_MODEL_CONFIGS)] ConvertModelResponse = Union[tuple(OPENAPI_MODEL_CONFIGS)] MergeModelResponse = Union[tuple(OPENAPI_MODEL_CONFIGS)] +ImportModelAttributes = Union[tuple(OPENAPI_MODEL_CONFIGS)] class ModelsList(BaseModel): models: list[Union[tuple(OPENAPI_MODEL_CONFIGS)]] @@ -32,11 +37,16 @@ class ModelsList(BaseModel): responses={200: {"model": ModelsList }}, ) async def list_models( - base_model: Optional[BaseModelType] = Query(default=None, description="Base model"), + base_models: Optional[List[BaseModelType]] = Query(default=None, description="Base models to include"), model_type: Optional[ModelType] = Query(default=None, description="The type of model to get"), ) -> ModelsList: """Gets a list of models""" - models_raw = ApiDependencies.invoker.services.model_manager.list_models(base_model, model_type) + if base_models and len(base_models)>0: + models_raw = list() + for base_model in base_models: + models_raw.extend(ApiDependencies.invoker.services.model_manager.list_models(base_model, model_type)) + else: + models_raw = ApiDependencies.invoker.services.model_manager.list_models(None, model_type) models = parse_obj_as(ModelsList, { "models": models_raw }) return models @@ -44,8 +54,9 @@ async def list_models( "/{base_model}/{model_type}/{model_name}", operation_id="update_model", responses={200: {"description" : "The model was updated successfully"}, + 400: {"description" : "Bad request"}, 404: {"description" : "The model could not be found"}, - 400: {"description" : "Bad request"} + 409: {"description" : "There is already a model corresponding to the new name"}, }, status_code = 200, response_model = UpdateModelResponse, @@ -56,33 +67,69 @@ async def update_model( model_name: str = Path(description="model name"), info: Union[tuple(OPENAPI_MODEL_CONFIGS)] = Body(description="Model configuration"), ) -> UpdateModelResponse: - """ Add Model """ + """ Update model contents with a new config. If the model name or base fields are changed, then the model is renamed. """ + logger = ApiDependencies.invoker.services.logger + + try: + previous_info = ApiDependencies.invoker.services.model_manager.list_model( + model_name=model_name, + base_model=base_model, + model_type=model_type, + ) + + # rename operation requested + if info.model_name != model_name or info.base_model != base_model: + ApiDependencies.invoker.services.model_manager.rename_model( + base_model = base_model, + model_type = model_type, + model_name = model_name, + new_name = info.model_name, + new_base = info.base_model, + ) + logger.info(f'Successfully renamed {base_model}/{model_name}=>{info.base_model}/{info.model_name}') + # update information to support an update of attributes + model_name = info.model_name + base_model = info.base_model + new_info = ApiDependencies.invoker.services.model_manager.list_model( + model_name=model_name, + base_model=base_model, + model_type=model_type, + ) + if new_info.get('path') != previous_info.get('path'): # model manager moved model path during rename - don't overwrite it + info.path = new_info.get('path') + ApiDependencies.invoker.services.model_manager.update_model( model_name=model_name, base_model=base_model, model_type=model_type, model_attributes=info.dict() ) + model_raw = ApiDependencies.invoker.services.model_manager.list_model( model_name=model_name, base_model=base_model, model_type=model_type, ) model_response = parse_obj_as(UpdateModelResponse, model_raw) - except KeyError as e: + except ModelNotFoundException as e: raise HTTPException(status_code=404, detail=str(e)) except ValueError as e: + logger.error(str(e)) + raise HTTPException(status_code=409, detail=str(e)) + except Exception as e: + logger.error(str(e)) raise HTTPException(status_code=400, detail=str(e)) return model_response @models_router.post( - "/", + "/import", operation_id="import_model", responses= { 201: {"description" : "The model imported successfully"}, 404: {"description" : "The model could not be found"}, + 415: {"description" : "Unrecognized file/folder format"}, 424: {"description" : "The model appeared to import successfully, but could not be found in the model manager"}, 409: {"description" : "There is already a model corresponding to this path or repo_id"}, }, @@ -94,7 +141,7 @@ async def import_model( prediction_type: Optional[Literal['v_prediction','epsilon','sample']] = \ Body(description='Prediction type for SDv2 checkpoint files', default="v_prediction"), ) -> ImportModelResponse: - """ Add a model using its local path, repo_id, or remote URL """ + """ Add a model using its local path, repo_id, or remote URL. Model characteristics will be probed and configured automatically """ items_to_import = {location} prediction_types = { x.value: x for x in SchedulerPredictionType } @@ -109,7 +156,7 @@ async def import_model( if not info: logger.error("Import failed") - raise HTTPException(status_code=424) + raise HTTPException(status_code=415) logger.info(f'Successfully imported {location}, got {info}') model_raw = ApiDependencies.invoker.services.model_manager.list_model( @@ -119,25 +166,66 @@ async def import_model( ) return parse_obj_as(ImportModelResponse, model_raw) - except KeyError as e: + except ModelNotFoundException as e: + logger.error(str(e)) + raise HTTPException(status_code=404, detail=str(e)) + except InvalidModelException as e: + logger.error(str(e)) + raise HTTPException(status_code=415) + except ValueError as e: + logger.error(str(e)) + raise HTTPException(status_code=409, detail=str(e)) + +@models_router.post( + "/add", + operation_id="add_model", + responses= { + 201: {"description" : "The model added successfully"}, + 404: {"description" : "The model could not be found"}, + 424: {"description" : "The model appeared to add successfully, but could not be found in the model manager"}, + 409: {"description" : "There is already a model corresponding to this path or repo_id"}, + }, + status_code=201, + response_model=ImportModelResponse +) +async def add_model( + info: Union[tuple(OPENAPI_MODEL_CONFIGS)] = Body(description="Model configuration"), +) -> ImportModelResponse: + """ Add a model using the configuration information appropriate for its type. Only local models can be added by path""" + + logger = ApiDependencies.invoker.services.logger + + try: + ApiDependencies.invoker.services.model_manager.add_model( + info.model_name, + info.base_model, + info.model_type, + model_attributes = info.dict() + ) + logger.info(f'Successfully added {info.model_name}') + model_raw = ApiDependencies.invoker.services.model_manager.list_model( + model_name=info.model_name, + base_model=info.base_model, + model_type=info.model_type + ) + return parse_obj_as(ImportModelResponse, model_raw) + except ModelNotFoundException as e: logger.error(str(e)) raise HTTPException(status_code=404, detail=str(e)) except ValueError as e: logger.error(str(e)) raise HTTPException(status_code=409, detail=str(e)) - + @models_router.delete( "/{base_model}/{model_type}/{model_name}", operation_id="del_model", responses={ - 204: { - "description": "Model deleted successfully" - }, - 404: { - "description": "Model not found" - } + 204: { "description": "Model deleted successfully" }, + 404: { "description": "Model not found" } }, + status_code = 204, + response_model = None, ) async def delete_model( base_model: BaseModelType = Path(description="Base model"), @@ -154,9 +242,9 @@ async def delete_model( ) logger.info(f"Deleted model: {model_name}") return Response(status_code=204) - except KeyError: - logger.error(f"Model not found: {model_name}") - raise HTTPException(status_code=404, detail=f"Model '{model_name}' not found") + except ModelNotFoundException as e: + logger.error(str(e)) + raise HTTPException(status_code=404, detail=str(e)) @models_router.put( "/convert/{base_model}/{model_type}/{model_name}", @@ -173,24 +261,74 @@ async def convert_model( base_model: BaseModelType = Path(description="Base model"), model_type: ModelType = Path(description="The type of model"), model_name: str = Path(description="model name"), + convert_dest_directory: Optional[str] = Query(default=None, description="Save the converted model to the designated directory"), ) -> ConvertModelResponse: - """Convert a checkpoint model into a diffusers model""" + """Convert a checkpoint model into a diffusers model, optionally saving to the indicated destination directory, or `models` if none.""" logger = ApiDependencies.invoker.services.logger try: logger.info(f"Converting model: {model_name}") + dest = pathlib.Path(convert_dest_directory) if convert_dest_directory else None ApiDependencies.invoker.services.model_manager.convert_model(model_name, base_model = base_model, - model_type = model_type + model_type = model_type, + convert_dest_directory = dest, ) model_raw = ApiDependencies.invoker.services.model_manager.list_model(model_name, base_model = base_model, model_type = model_type) response = parse_obj_as(ConvertModelResponse, model_raw) - except KeyError: - raise HTTPException(status_code=404, detail=f"Model '{model_name}' not found") + except ModelNotFoundException as e: + raise HTTPException(status_code=404, detail=f"Model '{model_name}' not found: {str(e)}") except ValueError as e: raise HTTPException(status_code=400, detail=str(e)) return response + +@models_router.get( + "/search", + operation_id="search_for_models", + responses={ + 200: { "description": "Directory searched successfully" }, + 404: { "description": "Invalid directory path" }, + }, + status_code = 200, + response_model = List[pathlib.Path] +) +async def search_for_models( + search_path: pathlib.Path = Query(description="Directory path to search for models") +)->List[pathlib.Path]: + if not search_path.is_dir(): + raise HTTPException(status_code=404, detail=f"The search path '{search_path}' does not exist or is not directory") + return ApiDependencies.invoker.services.model_manager.search_for_models([search_path]) + +@models_router.get( + "/ckpt_confs", + operation_id="list_ckpt_configs", + responses={ + 200: { "description" : "paths retrieved successfully" }, + }, + status_code = 200, + response_model = List[pathlib.Path] +) +async def list_ckpt_configs( +)->List[pathlib.Path]: + """Return a list of the legacy checkpoint configuration files stored in `ROOT/configs/stable-diffusion`, relative to ROOT.""" + return ApiDependencies.invoker.services.model_manager.list_checkpoint_configs() + + +@models_router.get( + "/sync", + operation_id="sync_to_config", + responses={ + 201: { "description": "synchronization successful" }, + }, + status_code = 201, + response_model = None +) +async def sync_to_config( +)->None: + """Call after making changes to models.yaml, autoimport directories or models directory to synchronize + in-memory data structures with disk data structures.""" + return ApiDependencies.invoker.services.model_manager.sync_to_config() @models_router.put( "/merge/{base_model}", @@ -210,24 +348,75 @@ async def merge_models( alpha: Optional[float] = Body(description="Alpha weighting strength to apply to 2d and 3d models", default=0.5), interp: Optional[MergeInterpolationMethod] = Body(description="Interpolation method"), force: Optional[bool] = Body(description="Force merging of models created with different versions of diffusers", default=False), + merge_dest_directory: Optional[str] = Body(description="Save the merged model to the designated directory (with 'merged_model_name' appended)", default=None) ) -> MergeModelResponse: """Convert a checkpoint model into a diffusers model""" logger = ApiDependencies.invoker.services.logger try: - logger.info(f"Merging models: {model_names}") + logger.info(f"Merging models: {model_names} into {merge_dest_directory or ''}/{merged_model_name}") + dest = pathlib.Path(merge_dest_directory) if merge_dest_directory else None result = ApiDependencies.invoker.services.model_manager.merge_models(model_names, base_model, - merged_model_name or "+".join(model_names), - alpha, - interp, - force) + merged_model_name=merged_model_name or "+".join(model_names), + alpha=alpha, + interp=interp, + force=force, + merge_dest_directory = dest + ) model_raw = ApiDependencies.invoker.services.model_manager.list_model(result.name, base_model = base_model, model_type = ModelType.Main, ) response = parse_obj_as(ConvertModelResponse, model_raw) - except KeyError: + except ModelNotFoundException: raise HTTPException(status_code=404, detail=f"One or more of the models '{model_names}' not found") except ValueError as e: raise HTTPException(status_code=400, detail=str(e)) return response + +# The rename operation is now supported by update_model and no longer needs to be +# a standalone route. +# @models_router.post( +# "/rename/{base_model}/{model_type}/{model_name}", +# operation_id="rename_model", +# responses= { +# 201: {"description" : "The model was renamed successfully"}, +# 404: {"description" : "The model could not be found"}, +# 409: {"description" : "There is already a model corresponding to the new name"}, +# }, +# status_code=201, +# response_model=ImportModelResponse +# ) +# async def rename_model( +# base_model: BaseModelType = Path(description="Base model"), +# model_type: ModelType = Path(description="The type of model"), +# model_name: str = Path(description="current model name"), +# new_name: Optional[str] = Query(description="new model name", default=None), +# new_base: Optional[BaseModelType] = Query(description="new model base", default=None), +# ) -> ImportModelResponse: +# """ Rename a model""" + +# logger = ApiDependencies.invoker.services.logger + +# try: +# result = ApiDependencies.invoker.services.model_manager.rename_model( +# base_model = base_model, +# model_type = model_type, +# model_name = model_name, +# new_name = new_name, +# new_base = new_base, +# ) +# logger.debug(result) +# logger.info(f'Successfully renamed {model_name}=>{new_name}') +# model_raw = ApiDependencies.invoker.services.model_manager.list_model( +# model_name=new_name or model_name, +# base_model=new_base or base_model, +# model_type=model_type +# ) +# return parse_obj_as(ImportModelResponse, model_raw) +# except ModelNotFoundException as e: +# logger.error(str(e)) +# raise HTTPException(status_code=404, detail=str(e)) +# except ValueError as e: +# logger.error(str(e)) +# raise HTTPException(status_code=409, detail=str(e)) diff --git a/invokeai/app/api_app.py b/invokeai/app/api_app.py index 9bcded1c49..4afa3aa161 100644 --- a/invokeai/app/api_app.py +++ b/invokeai/app/api_app.py @@ -39,6 +39,7 @@ from .invocations.baseinvocation import BaseInvocation import torch +import invokeai.backend.util.hotfixes if torch.backends.mps.is_available(): import invokeai.backend.util.mps_fixes diff --git a/invokeai/app/cli_app.py b/invokeai/app/cli_app.py index 888d36c4bf..341e9e5b7e 100644 --- a/invokeai/app/cli_app.py +++ b/invokeai/app/cli_app.py @@ -54,10 +54,10 @@ from .services.invocation_services import InvocationServices from .services.invoker import Invoker from .services.model_manager_service import ModelManagerService from .services.processor import DefaultInvocationProcessor -from .services.restoration_services import RestorationServices from .services.sqlite import SqliteItemStorage import torch +import invokeai.backend.util.hotfixes if torch.backends.mps.is_available(): import invokeai.backend.util.mps_fixes @@ -295,7 +295,6 @@ def invoke_cli(): ), graph_execution_manager=graph_execution_manager, processor=DefaultInvocationProcessor(), - restoration=RestorationServices(config,logger=logger), logger=logger, configuration=config, ) diff --git a/invokeai/app/invocations/collections.py b/invokeai/app/invocations/collections.py index 33bde42d69..5446757eb0 100644 --- a/invokeai/app/invocations/collections.py +++ b/invokeai/app/invocations/collections.py @@ -4,17 +4,12 @@ from typing import Literal import numpy as np from pydantic import Field, validator -from invokeai.app.models.image import ImageField +from invokeai.app.models.image import ImageField from invokeai.app.util.misc import SEED_MAX, get_random_seed -from .baseinvocation import ( - BaseInvocation, - InvocationConfig, - InvocationContext, - BaseInvocationOutput, - UIConfig, -) +from .baseinvocation import (BaseInvocation, BaseInvocationOutput, + InvocationConfig, InvocationContext, UIConfig) class IntCollectionOutput(BaseInvocationOutput): @@ -32,7 +27,8 @@ class FloatCollectionOutput(BaseInvocationOutput): type: Literal["float_collection"] = "float_collection" # Outputs - collection: list[float] = Field(default=[], description="The float collection") + collection: list[float] = Field( + default=[], description="The float collection") class ImageCollectionOutput(BaseInvocationOutput): @@ -41,7 +37,8 @@ class ImageCollectionOutput(BaseInvocationOutput): type: Literal["image_collection"] = "image_collection" # Outputs - collection: list[ImageField] = Field(default=[], description="The output images") + collection: list[ImageField] = Field( + default=[], description="The output images") class Config: schema_extra = {"required": ["type", "collection"]} @@ -57,6 +54,14 @@ class RangeInvocation(BaseInvocation): stop: int = Field(default=10, description="The stop of the range") step: int = Field(default=1, description="The step of the range") + class Config(InvocationConfig): + schema_extra = { + "ui": { + "title": "Range", + "tags": ["range", "integer", "collection"] + }, + } + @validator("stop") def stop_gt_start(cls, v, values): if "start" in values and v <= values["start"]: @@ -79,10 +84,20 @@ class RangeOfSizeInvocation(BaseInvocation): size: int = Field(default=1, description="The number of values") step: int = Field(default=1, description="The step of the range") + class Config(InvocationConfig): + schema_extra = { + "ui": { + "title": "Sized Range", + "tags": ["range", "integer", "size", "collection"] + }, + } + def invoke(self, context: InvocationContext) -> IntCollectionOutput: return IntCollectionOutput( - collection=list(range(self.start, self.start + self.size, self.step)) - ) + collection=list( + range( + self.start, self.start + self.size, + self.step))) class RandomRangeInvocation(BaseInvocation): @@ -103,11 +118,21 @@ class RandomRangeInvocation(BaseInvocation): default_factory=get_random_seed, ) + class Config(InvocationConfig): + schema_extra = { + "ui": { + "title": "Random Range", + "tags": ["range", "integer", "random", "collection"] + }, + } + def invoke(self, context: InvocationContext) -> IntCollectionOutput: rng = np.random.default_rng(self.seed) return IntCollectionOutput( - collection=list(rng.integers(low=self.low, high=self.high, size=self.size)) - ) + collection=list( + rng.integers( + low=self.low, high=self.high, + size=self.size))) class ImageCollectionInvocation(BaseInvocation): @@ -121,6 +146,7 @@ class ImageCollectionInvocation(BaseInvocation): default=[], description="The image collection to load" ) # fmt: on + def invoke(self, context: InvocationContext) -> ImageCollectionOutput: return ImageCollectionOutput(collection=self.images) @@ -128,6 +154,7 @@ class ImageCollectionInvocation(BaseInvocation): schema_extra = { "ui": { "type_hints": { + "title": "Image Collection", "images": "image_collection", } }, diff --git a/invokeai/app/invocations/compel.py b/invokeai/app/invocations/compel.py index dd4d5ce30b..be1b86147d 100644 --- a/invokeai/app/invocations/compel.py +++ b/invokeai/app/invocations/compel.py @@ -1,4 +1,4 @@ -from typing import Literal, Optional, Union, List +from typing import Literal, Optional, Union, List, Annotated from pydantic import BaseModel, Field import re @@ -10,7 +10,7 @@ from ...backend.stable_diffusion.diffusion import InvokeAIDiffuserComponent from ...backend.model_management import BaseModelType, ModelType, SubModelType, ModelPatcher import torch -from compel import Compel +from compel import Compel, ReturnedEmbeddingsType from compel.prompt_parser import (Blend, Conjunction, CrossAttentionControlSubstitute, FlattenedPrompt, Fragment) @@ -22,6 +22,7 @@ from ...backend.stable_diffusion.diffusion import InvokeAIDiffuserComponent from .baseinvocation import (BaseInvocation, BaseInvocationOutput, InvocationConfig, InvocationContext) from .model import ClipField +from dataclasses import dataclass class ConditioningField(BaseModel): @@ -31,6 +32,34 @@ class ConditioningField(BaseModel): class Config: schema_extra = {"required": ["conditioning_name"]} +@dataclass +class BasicConditioningInfo: + #type: Literal["basic_conditioning"] = "basic_conditioning" + embeds: torch.Tensor + extra_conditioning: Optional[InvokeAIDiffuserComponent.ExtraConditioningInfo] + # weight: float + # mode: ConditioningAlgo + +@dataclass +class SDXLConditioningInfo(BasicConditioningInfo): + #type: Literal["sdxl_conditioning"] = "sdxl_conditioning" + pooled_embeds: torch.Tensor + add_time_ids: torch.Tensor + +ConditioningInfoType = Annotated[ + Union[BasicConditioningInfo, SDXLConditioningInfo], + Field(discriminator="type") +] + +@dataclass +class ConditioningFieldData: + conditionings: List[Union[BasicConditioningInfo, SDXLConditioningInfo]] + #unconditioned: Optional[torch.Tensor] + +#class ConditioningAlgo(str, Enum): +# Compose = "compose" +# ComposeEx = "compose_ex" +# PerpNeg = "perp_neg" class CompelOutput(BaseInvocationOutput): """Compel parser output""" @@ -65,10 +94,10 @@ class CompelInvocation(BaseInvocation): @torch.no_grad() def invoke(self, context: InvocationContext) -> CompelOutput: tokenizer_info = context.services.model_manager.get_model( - **self.clip.tokenizer.dict(), + **self.clip.tokenizer.dict(), context=context, ) text_encoder_info = context.services.model_manager.get_model( - **self.clip.text_encoder.dict(), + **self.clip.text_encoder.dict(), context=context, ) def _lora_loader(): @@ -90,6 +119,7 @@ class CompelInvocation(BaseInvocation): model_name=name, base_model=self.clip.text_encoder.base_model, model_type=ModelType.TextualInversion, + context=context, ).context.model ) except ModelNotFoundException: @@ -108,7 +138,7 @@ class CompelInvocation(BaseInvocation): text_encoder=text_encoder, textual_inversion_manager=ti_manager, dtype_for_device_getter=torch_dtype, - truncate_long_prompts=True, # TODO: + truncate_long_prompts=True, ) conjunction = Compel.parse_prompt_string(self.prompt) @@ -120,19 +150,25 @@ class CompelInvocation(BaseInvocation): c, options = compel.build_conditioning_tensor_for_prompt_object( prompt) - # TODO: long prompt support - # if not self.truncate_long_prompts: - # [c, uc] = compel.pad_conditioning_tensors_to_same_length([c, uc]) ec = InvokeAIDiffuserComponent.ExtraConditioningInfo( tokens_count_including_eos_bos=get_max_token_count( tokenizer, conjunction), cross_attention_control_args=options.get( "cross_attention_control", None),) - conditioning_name = f"{context.graph_execution_state_id}_{self.id}_conditioning" + c = c.detach().to("cpu") - # TODO: hacky but works ;D maybe rename latents somehow? - context.services.latents.save(conditioning_name, (c, ec)) + conditioning_data = ConditioningFieldData( + conditionings=[ + BasicConditioningInfo( + embeds=c, + extra_conditioning=ec, + ) + ] + ) + + conditioning_name = f"{context.graph_execution_state_id}_{self.id}_conditioning" + context.services.latents.save(conditioning_name, conditioning_data) return CompelOutput( conditioning=ConditioningField( @@ -140,6 +176,397 @@ class CompelInvocation(BaseInvocation): ), ) +class SDXLPromptInvocationBase: + def run_clip_raw(self, context, clip_field, prompt, get_pooled): + tokenizer_info = context.services.model_manager.get_model( + **clip_field.tokenizer.dict(), + ) + text_encoder_info = context.services.model_manager.get_model( + **clip_field.text_encoder.dict(), + ) + + def _lora_loader(): + for lora in clip_field.loras: + lora_info = context.services.model_manager.get_model( + **lora.dict(exclude={"weight"})) + yield (lora_info.context.model, lora.weight) + del lora_info + return + + #loras = [(context.services.model_manager.get_model(**lora.dict(exclude={"weight"})).context.model, lora.weight) for lora in self.clip.loras] + + ti_list = [] + for trigger in re.findall(r"<[a-zA-Z0-9., _-]+>", prompt): + name = trigger[1:-1] + try: + ti_list.append( + context.services.model_manager.get_model( + model_name=name, + base_model=clip_field.text_encoder.base_model, + model_type=ModelType.TextualInversion, + ).context.model + ) + except ModelNotFoundException: + # print(e) + #import traceback + #print(traceback.format_exc()) + print(f"Warn: trigger: \"{trigger}\" not found") + + with ModelPatcher.apply_lora_text_encoder(text_encoder_info.context.model, _lora_loader()),\ + ModelPatcher.apply_ti(tokenizer_info.context.model, text_encoder_info.context.model, ti_list) as (tokenizer, ti_manager),\ + ModelPatcher.apply_clip_skip(text_encoder_info.context.model, clip_field.skipped_layers),\ + text_encoder_info as text_encoder: + + text_inputs = tokenizer( + prompt, + padding="max_length", + max_length=tokenizer.model_max_length, + truncation=True, + return_tensors="pt", + ) + text_input_ids = text_inputs.input_ids + prompt_embeds = text_encoder( + text_input_ids.to(text_encoder.device), + output_hidden_states=True, + ) + if get_pooled: + c_pooled = prompt_embeds[0] + else: + c_pooled = None + c = prompt_embeds.hidden_states[-2] + + del tokenizer + del text_encoder + del tokenizer_info + del text_encoder_info + + c = c.detach().to("cpu") + if c_pooled is not None: + c_pooled = c_pooled.detach().to("cpu") + + return c, c_pooled, None + + def run_clip_compel(self, context, clip_field, prompt, get_pooled): + tokenizer_info = context.services.model_manager.get_model( + **clip_field.tokenizer.dict(), + ) + text_encoder_info = context.services.model_manager.get_model( + **clip_field.text_encoder.dict(), + ) + + def _lora_loader(): + for lora in clip_field.loras: + lora_info = context.services.model_manager.get_model( + **lora.dict(exclude={"weight"})) + yield (lora_info.context.model, lora.weight) + del lora_info + return + + #loras = [(context.services.model_manager.get_model(**lora.dict(exclude={"weight"})).context.model, lora.weight) for lora in self.clip.loras] + + ti_list = [] + for trigger in re.findall(r"<[a-zA-Z0-9., _-]+>", prompt): + name = trigger[1:-1] + try: + ti_list.append( + context.services.model_manager.get_model( + model_name=name, + base_model=clip_field.text_encoder.base_model, + model_type=ModelType.TextualInversion, + ).context.model + ) + except ModelNotFoundException: + # print(e) + #import traceback + #print(traceback.format_exc()) + print(f"Warn: trigger: \"{trigger}\" not found") + + with ModelPatcher.apply_lora_text_encoder(text_encoder_info.context.model, _lora_loader()),\ + ModelPatcher.apply_ti(tokenizer_info.context.model, text_encoder_info.context.model, ti_list) as (tokenizer, ti_manager),\ + ModelPatcher.apply_clip_skip(text_encoder_info.context.model, clip_field.skipped_layers),\ + text_encoder_info as text_encoder: + + compel = Compel( + tokenizer=tokenizer, + text_encoder=text_encoder, + textual_inversion_manager=ti_manager, + dtype_for_device_getter=torch_dtype, + truncate_long_prompts=True, # TODO: + returned_embeddings_type=ReturnedEmbeddingsType.PENULTIMATE_HIDDEN_STATES_NON_NORMALIZED, # TODO: clip skip + requires_pooled=True, + ) + + conjunction = Compel.parse_prompt_string(prompt) + + if context.services.configuration.log_tokenization: + # TODO: better logging for and syntax + for prompt_obj in conjunction.prompts: + log_tokenization_for_prompt_object(prompt_obj, tokenizer) + + # TODO: ask for optimizations? to not run text_encoder twice + c, options = compel.build_conditioning_tensor_for_conjunction(conjunction) + if get_pooled: + c_pooled = compel.conditioning_provider.get_pooled_embeddings([prompt]) + else: + c_pooled = None + + ec = InvokeAIDiffuserComponent.ExtraConditioningInfo( + tokens_count_including_eos_bos=get_max_token_count(tokenizer, conjunction), + cross_attention_control_args=options.get("cross_attention_control", None), + ) + + del tokenizer + del text_encoder + del tokenizer_info + del text_encoder_info + + c = c.detach().to("cpu") + if c_pooled is not None: + c_pooled = c_pooled.detach().to("cpu") + + return c, c_pooled, ec + +class SDXLCompelPromptInvocation(BaseInvocation, SDXLPromptInvocationBase): + """Parse prompt using compel package to conditioning.""" + + type: Literal["sdxl_compel_prompt"] = "sdxl_compel_prompt" + + prompt: str = Field(default="", description="Prompt") + style: str = Field(default="", description="Style prompt") + original_width: int = Field(1024, description="") + original_height: int = Field(1024, description="") + crop_top: int = Field(0, description="") + crop_left: int = Field(0, description="") + target_width: int = Field(1024, description="") + target_height: int = Field(1024, description="") + clip: ClipField = Field(None, description="Clip to use") + clip2: ClipField = Field(None, description="Clip2 to use") + + # Schema customisation + class Config(InvocationConfig): + schema_extra = { + "ui": { + "title": "SDXL Prompt (Compel)", + "tags": ["prompt", "compel"], + "type_hints": { + "model": "model" + } + }, + } + + @torch.no_grad() + def invoke(self, context: InvocationContext) -> CompelOutput: + c1, c1_pooled, ec1 = self.run_clip_compel(context, self.clip, self.prompt, False) + if self.style.strip() == "": + c2, c2_pooled, ec2 = self.run_clip_compel(context, self.clip2, self.prompt, True) + else: + c2, c2_pooled, ec2 = self.run_clip_compel(context, self.clip2, self.style, True) + + original_size = (self.original_height, self.original_width) + crop_coords = (self.crop_top, self.crop_left) + target_size = (self.target_height, self.target_width) + + add_time_ids = torch.tensor([ + original_size + crop_coords + target_size + ]) + + conditioning_data = ConditioningFieldData( + conditionings=[ + SDXLConditioningInfo( + embeds=torch.cat([c1, c2], dim=-1), + pooled_embeds=c2_pooled, + add_time_ids=add_time_ids, + extra_conditioning=ec1, + ) + ] + ) + + conditioning_name = f"{context.graph_execution_state_id}_{self.id}_conditioning" + context.services.latents.save(conditioning_name, conditioning_data) + + return CompelOutput( + conditioning=ConditioningField( + conditioning_name=conditioning_name, + ), + ) + +class SDXLRefinerCompelPromptInvocation(BaseInvocation, SDXLPromptInvocationBase): + """Parse prompt using compel package to conditioning.""" + + type: Literal["sdxl_refiner_compel_prompt"] = "sdxl_refiner_compel_prompt" + + style: str = Field(default="", description="Style prompt") # TODO: ? + original_width: int = Field(1024, description="") + original_height: int = Field(1024, description="") + crop_top: int = Field(0, description="") + crop_left: int = Field(0, description="") + aesthetic_score: float = Field(6.0, description="") + clip2: ClipField = Field(None, description="Clip to use") + + # Schema customisation + class Config(InvocationConfig): + schema_extra = { + "ui": { + "title": "SDXL Refiner Prompt (Compel)", + "tags": ["prompt", "compel"], + "type_hints": { + "model": "model" + } + }, + } + + @torch.no_grad() + def invoke(self, context: InvocationContext) -> CompelOutput: + c2, c2_pooled, ec2 = self.run_clip_compel(context, self.clip2, self.style, True) + + original_size = (self.original_height, self.original_width) + crop_coords = (self.crop_top, self.crop_left) + + add_time_ids = torch.tensor([ + original_size + crop_coords + (self.aesthetic_score,) + ]) + + conditioning_data = ConditioningFieldData( + conditionings=[ + SDXLConditioningInfo( + embeds=c2, + pooled_embeds=c2_pooled, + add_time_ids=add_time_ids, + extra_conditioning=ec2, # or None + ) + ] + ) + + conditioning_name = f"{context.graph_execution_state_id}_{self.id}_conditioning" + context.services.latents.save(conditioning_name, conditioning_data) + + return CompelOutput( + conditioning=ConditioningField( + conditioning_name=conditioning_name, + ), + ) + +class SDXLRawPromptInvocation(BaseInvocation, SDXLPromptInvocationBase): + """Pass unmodified prompt to conditioning without compel processing.""" + + type: Literal["sdxl_raw_prompt"] = "sdxl_raw_prompt" + + prompt: str = Field(default="", description="Prompt") + style: str = Field(default="", description="Style prompt") + original_width: int = Field(1024, description="") + original_height: int = Field(1024, description="") + crop_top: int = Field(0, description="") + crop_left: int = Field(0, description="") + target_width: int = Field(1024, description="") + target_height: int = Field(1024, description="") + clip: ClipField = Field(None, description="Clip to use") + clip2: ClipField = Field(None, description="Clip2 to use") + + # Schema customisation + class Config(InvocationConfig): + schema_extra = { + "ui": { + "title": "SDXL Prompt (Raw)", + "tags": ["prompt", "compel"], + "type_hints": { + "model": "model" + } + }, + } + + @torch.no_grad() + def invoke(self, context: InvocationContext) -> CompelOutput: + c1, c1_pooled, ec1 = self.run_clip_raw(context, self.clip, self.prompt, False) + if self.style.strip() == "": + c2, c2_pooled, ec2 = self.run_clip_raw(context, self.clip2, self.prompt, True) + else: + c2, c2_pooled, ec2 = self.run_clip_raw(context, self.clip2, self.style, True) + + original_size = (self.original_height, self.original_width) + crop_coords = (self.crop_top, self.crop_left) + target_size = (self.target_height, self.target_width) + + add_time_ids = torch.tensor([ + original_size + crop_coords + target_size + ]) + + conditioning_data = ConditioningFieldData( + conditionings=[ + SDXLConditioningInfo( + embeds=torch.cat([c1, c2], dim=-1), + pooled_embeds=c2_pooled, + add_time_ids=add_time_ids, + extra_conditioning=ec1, + ) + ] + ) + + conditioning_name = f"{context.graph_execution_state_id}_{self.id}_conditioning" + context.services.latents.save(conditioning_name, conditioning_data) + + return CompelOutput( + conditioning=ConditioningField( + conditioning_name=conditioning_name, + ), + ) + +class SDXLRefinerRawPromptInvocation(BaseInvocation, SDXLPromptInvocationBase): + """Parse prompt using compel package to conditioning.""" + + type: Literal["sdxl_refiner_raw_prompt"] = "sdxl_refiner_raw_prompt" + + style: str = Field(default="", description="Style prompt") # TODO: ? + original_width: int = Field(1024, description="") + original_height: int = Field(1024, description="") + crop_top: int = Field(0, description="") + crop_left: int = Field(0, description="") + aesthetic_score: float = Field(6.0, description="") + clip2: ClipField = Field(None, description="Clip to use") + + # Schema customisation + class Config(InvocationConfig): + schema_extra = { + "ui": { + "title": "SDXL Refiner Prompt (Raw)", + "tags": ["prompt", "compel"], + "type_hints": { + "model": "model" + } + }, + } + + @torch.no_grad() + def invoke(self, context: InvocationContext) -> CompelOutput: + c2, c2_pooled, ec2 = self.run_clip_raw(context, self.clip2, self.style, True) + + original_size = (self.original_height, self.original_width) + crop_coords = (self.crop_top, self.crop_left) + + add_time_ids = torch.tensor([ + original_size + crop_coords + (self.aesthetic_score,) + ]) + + conditioning_data = ConditioningFieldData( + conditionings=[ + SDXLConditioningInfo( + embeds=c2, + pooled_embeds=c2_pooled, + add_time_ids=add_time_ids, + extra_conditioning=ec2, # or None + ) + ] + ) + + conditioning_name = f"{context.graph_execution_state_id}_{self.id}_conditioning" + context.services.latents.save(conditioning_name, conditioning_data) + + return CompelOutput( + conditioning=ConditioningField( + conditioning_name=conditioning_name, + ), + ) + + class ClipSkipInvocationOutput(BaseInvocationOutput): """Clip skip node output""" type: Literal["clip_skip_output"] = "clip_skip_output" @@ -152,6 +579,14 @@ class ClipSkipInvocation(BaseInvocation): clip: ClipField = Field(None, description="Clip to use") skipped_layers: int = Field(0, description="Number of layers to skip in text_encoder") + class Config(InvocationConfig): + schema_extra = { + "ui": { + "title": "CLIP Skip", + "tags": ["clip", "skip"] + }, + } + def invoke(self, context: InvocationContext) -> ClipSkipInvocationOutput: self.clip.skipped_layers += self.skipped_layers return ClipSkipInvocationOutput( diff --git a/invokeai/app/invocations/controlnet_image_processors.py b/invokeai/app/invocations/controlnet_image_processors.py index c37dcda998..43cad3dcaf 100644 --- a/invokeai/app/invocations/controlnet_image_processors.py +++ b/invokeai/app/invocations/controlnet_image_processors.py @@ -1,42 +1,25 @@ # Invocations for ControlNet image preprocessors # initial implementation by Gregg Helt, 2023 # heavily leverages controlnet_aux package: https://github.com/patrickvonplaten/controlnet_aux -from builtins import float, bool +from builtins import bool, float +from typing import Dict, List, Literal, Optional, Union import cv2 import numpy as np -from typing import Literal, Optional, Union, List, Dict +from controlnet_aux import (CannyDetector, ContentShuffleDetector, HEDdetector, + LeresDetector, LineartAnimeDetector, + LineartDetector, MediapipeFaceDetector, + MidasDetector, MLSDdetector, NormalBaeDetector, + OpenposeDetector, PidiNetDetector, SamDetector, + ZoeDetector) +from controlnet_aux.util import HWC3, ade_palette from PIL import Image from pydantic import BaseModel, Field, validator -from ..models.image import ImageField, ImageCategory, ResourceOrigin -from .baseinvocation import ( - BaseInvocation, - BaseInvocationOutput, - InvocationContext, - InvocationConfig, -) - -from controlnet_aux import ( - CannyDetector, - HEDdetector, - LineartDetector, - LineartAnimeDetector, - MidasDetector, - MLSDdetector, - NormalBaeDetector, - OpenposeDetector, - PidiNetDetector, - ContentShuffleDetector, - ZoeDetector, - MediapipeFaceDetector, - SamDetector, - LeresDetector, -) - -from controlnet_aux.util import HWC3, ade_palette - - +from ...backend.model_management import BaseModelType, ModelType +from ..models.image import ImageCategory, ImageField, ResourceOrigin +from .baseinvocation import (BaseInvocation, BaseInvocationOutput, + InvocationConfig, InvocationContext) from .image import ImageOutput, PILInvocationConfig CONTROLNET_DEFAULT_MODELS = [ @@ -74,66 +57,82 @@ CONTROLNET_DEFAULT_MODELS = [ "lllyasviel/control_v11e_sd15_ip2p", "lllyasviel/control_v11f1e_sd15_tile", - ################################################# - # thibaud sd v2.1 models (ControlNet v1.0? or v1.1? - ################################################## - "thibaud/controlnet-sd21-openpose-diffusers", - "thibaud/controlnet-sd21-canny-diffusers", - "thibaud/controlnet-sd21-depth-diffusers", - "thibaud/controlnet-sd21-scribble-diffusers", - "thibaud/controlnet-sd21-hed-diffusers", - "thibaud/controlnet-sd21-zoedepth-diffusers", - "thibaud/controlnet-sd21-color-diffusers", - "thibaud/controlnet-sd21-openposev2-diffusers", - "thibaud/controlnet-sd21-lineart-diffusers", - "thibaud/controlnet-sd21-normalbae-diffusers", - "thibaud/controlnet-sd21-ade20k-diffusers", + ################################################# + # thibaud sd v2.1 models (ControlNet v1.0? or v1.1? + ################################################## + "thibaud/controlnet-sd21-openpose-diffusers", + "thibaud/controlnet-sd21-canny-diffusers", + "thibaud/controlnet-sd21-depth-diffusers", + "thibaud/controlnet-sd21-scribble-diffusers", + "thibaud/controlnet-sd21-hed-diffusers", + "thibaud/controlnet-sd21-zoedepth-diffusers", + "thibaud/controlnet-sd21-color-diffusers", + "thibaud/controlnet-sd21-openposev2-diffusers", + "thibaud/controlnet-sd21-lineart-diffusers", + "thibaud/controlnet-sd21-normalbae-diffusers", + "thibaud/controlnet-sd21-ade20k-diffusers", - ############################################## - # ControlNetMediaPipeface, ControlNet v1.1 - ############################################## - # ["CrucibleAI/ControlNetMediaPipeFace", "diffusion_sd15"], # SD 1.5 - # diffusion_sd15 needs to be passed to from_pretrained() as subfolder arg - # hacked t2l to split to model & subfolder if format is "model,subfolder" - "CrucibleAI/ControlNetMediaPipeFace,diffusion_sd15", # SD 1.5 - "CrucibleAI/ControlNetMediaPipeFace", # SD 2.1? + ############################################## + # ControlNetMediaPipeface, ControlNet v1.1 + ############################################## + # ["CrucibleAI/ControlNetMediaPipeFace", "diffusion_sd15"], # SD 1.5 + # diffusion_sd15 needs to be passed to from_pretrained() as subfolder arg + # hacked t2l to split to model & subfolder if format is "model,subfolder" + "CrucibleAI/ControlNetMediaPipeFace,diffusion_sd15", # SD 1.5 + "CrucibleAI/ControlNetMediaPipeFace", # SD 2.1? ] CONTROLNET_NAME_VALUES = Literal[tuple(CONTROLNET_DEFAULT_MODELS)] -CONTROLNET_MODE_VALUES = Literal[tuple(["balanced", "more_prompt", "more_control", "unbalanced"])] +CONTROLNET_MODE_VALUES = Literal[tuple( + ["balanced", "more_prompt", "more_control", "unbalanced"])] # crop and fill options not ready yet # CONTROLNET_RESIZE_VALUES = Literal[tuple(["just_resize", "crop_resize", "fill_resize"])] +class ControlNetModelField(BaseModel): + """ControlNet model field""" + + model_name: str = Field(description="Name of the ControlNet model") + base_model: BaseModelType = Field(description="Base model") + + class ControlField(BaseModel): image: ImageField = Field(default=None, description="The control image") - control_model: Optional[str] = Field(default=None, description="The ControlNet model to use") + control_model: Optional[ControlNetModelField] = Field( + default=None, description="The ControlNet model to use") # control_weight: Optional[float] = Field(default=1, description="weight given to controlnet") - control_weight: Union[float, List[float]] = Field(default=1, description="The weight given to the ControlNet") - begin_step_percent: float = Field(default=0, ge=0, le=1, - description="When the ControlNet is first applied (% of total steps)") - end_step_percent: float = Field(default=1, ge=0, le=1, - description="When the ControlNet is last applied (% of total steps)") - control_mode: CONTROLNET_MODE_VALUES = Field(default="balanced", description="The control mode to use") + control_weight: Union[float, List[float]] = Field( + default=1, description="The weight given to the ControlNet") + begin_step_percent: float = Field( + default=0, ge=0, le=1, + description="When the ControlNet is first applied (% of total steps)") + end_step_percent: float = Field( + default=1, ge=0, le=1, + description="When the ControlNet is last applied (% of total steps)") + control_mode: CONTROLNET_MODE_VALUES = Field( + default="balanced", description="The control mode to use") # resize_mode: CONTROLNET_RESIZE_VALUES = Field(default="just_resize", description="The resize mode to use") @validator("control_weight") - def abs_le_one(cls, v): - """validate that all abs(values) are <=1""" + def validate_control_weight(cls, v): + """Validate that all control weights in the valid range""" if isinstance(v, list): for i in v: - if abs(i) > 1: - raise ValueError('all abs(control_weight) must be <= 1') + if i < -1 or i > 2: + raise ValueError( + 'Control weights must be within -1 to 2 range') else: - if abs(v) > 1: - raise ValueError('abs(control_weight) must be <= 1') + if v < -1 or v > 2: + raise ValueError('Control weights must be within -1 to 2 range') return v + class Config: schema_extra = { "required": ["image", "control_model", "control_weight", "begin_step_percent", "end_step_percent"], "ui": { "type_hints": { "control_weight": "float", + "control_model": "controlnet_model", # "control_weight": "number", } } @@ -154,10 +153,10 @@ class ControlNetInvocation(BaseInvocation): type: Literal["controlnet"] = "controlnet" # Inputs image: ImageField = Field(default=None, description="The control image") - control_model: CONTROLNET_NAME_VALUES = Field(default="lllyasviel/sd-controlnet-canny", + control_model: ControlNetModelField = Field(default="lllyasviel/sd-controlnet-canny", description="control model used") control_weight: Union[float, List[float]] = Field(default=1.0, description="The weight given to the ControlNet") - begin_step_percent: float = Field(default=0, ge=0, le=1, + begin_step_percent: float = Field(default=0, ge=-1, le=2, description="When the ControlNet is first applied (% of total steps)") end_step_percent: float = Field(default=1, ge=0, le=1, description="When the ControlNet is last applied (% of total steps)") @@ -167,13 +166,14 @@ class ControlNetInvocation(BaseInvocation): class Config(InvocationConfig): schema_extra = { "ui": { - "tags": ["latents"], + "title": "ControlNet", + "tags": ["controlnet", "latents"], "type_hints": { - "model": "model", - "control": "control", - # "cfg_scale": "float", - "cfg_scale": "number", - "control_weight": "float", + "model": "model", + "control": "control", + # "cfg_scale": "float", + "cfg_scale": "number", + "control_weight": "float", } }, } @@ -200,6 +200,13 @@ class ImageProcessorInvocation(BaseInvocation, PILInvocationConfig): image: ImageField = Field(default=None, description="The image to process") # fmt: on + class Config(InvocationConfig): + schema_extra = { + "ui": { + "title": "Image Processor", + "tags": ["image", "processor"] + }, + } def run_processor(self, image): # superclass just passes through image without processing @@ -231,14 +238,15 @@ class ImageProcessorInvocation(BaseInvocation, PILInvocationConfig): return ImageOutput( image=processed_image_field, # width=processed_image.width, - width = image_dto.width, + width=image_dto.width, # height=processed_image.height, - height = image_dto.height, + height=image_dto.height, # mode=processed_image.mode, ) -class CannyImageProcessorInvocation(ImageProcessorInvocation, PILInvocationConfig): +class CannyImageProcessorInvocation( + ImageProcessorInvocation, PILInvocationConfig): """Canny edge detection for ControlNet""" # fmt: off type: Literal["canny_image_processor"] = "canny_image_processor" @@ -247,13 +255,23 @@ class CannyImageProcessorInvocation(ImageProcessorInvocation, PILInvocationConfi high_threshold: int = Field(default=200, ge=0, le=255, description="The high threshold of the Canny pixel gradient (0-255)") # fmt: on + class Config(InvocationConfig): + schema_extra = { + "ui": { + "title": "Canny Processor", + "tags": ["controlnet", "canny", "image", "processor"] + }, + } + def run_processor(self, image): canny_processor = CannyDetector() - processed_image = canny_processor(image, self.low_threshold, self.high_threshold) + processed_image = canny_processor( + image, self.low_threshold, self.high_threshold) return processed_image -class HedImageProcessorInvocation(ImageProcessorInvocation, PILInvocationConfig): +class HedImageProcessorInvocation( + ImageProcessorInvocation, PILInvocationConfig): """Applies HED edge detection to image""" # fmt: off type: Literal["hed_image_processor"] = "hed_image_processor" @@ -265,6 +283,14 @@ class HedImageProcessorInvocation(ImageProcessorInvocation, PILInvocationConfig) scribble: bool = Field(default=False, description="Whether to use scribble mode") # fmt: on + class Config(InvocationConfig): + schema_extra = { + "ui": { + "title": "Softedge(HED) Processor", + "tags": ["controlnet", "softedge", "hed", "image", "processor"] + }, + } + def run_processor(self, image): hed_processor = HEDdetector.from_pretrained("lllyasviel/Annotators") processed_image = hed_processor(image, @@ -277,7 +303,8 @@ class HedImageProcessorInvocation(ImageProcessorInvocation, PILInvocationConfig) return processed_image -class LineartImageProcessorInvocation(ImageProcessorInvocation, PILInvocationConfig): +class LineartImageProcessorInvocation( + ImageProcessorInvocation, PILInvocationConfig): """Applies line art processing to image""" # fmt: off type: Literal["lineart_image_processor"] = "lineart_image_processor" @@ -287,16 +314,25 @@ class LineartImageProcessorInvocation(ImageProcessorInvocation, PILInvocationCon coarse: bool = Field(default=False, description="Whether to use coarse mode") # fmt: on + class Config(InvocationConfig): + schema_extra = { + "ui": { + "title": "Lineart Processor", + "tags": ["controlnet", "lineart", "image", "processor"] + }, + } + def run_processor(self, image): - lineart_processor = LineartDetector.from_pretrained("lllyasviel/Annotators") - processed_image = lineart_processor(image, - detect_resolution=self.detect_resolution, - image_resolution=self.image_resolution, - coarse=self.coarse) + lineart_processor = LineartDetector.from_pretrained( + "lllyasviel/Annotators") + processed_image = lineart_processor( + image, detect_resolution=self.detect_resolution, + image_resolution=self.image_resolution, coarse=self.coarse) return processed_image -class LineartAnimeImageProcessorInvocation(ImageProcessorInvocation, PILInvocationConfig): +class LineartAnimeImageProcessorInvocation( + ImageProcessorInvocation, PILInvocationConfig): """Applies line art anime processing to image""" # fmt: off type: Literal["lineart_anime_image_processor"] = "lineart_anime_image_processor" @@ -305,8 +341,17 @@ class LineartAnimeImageProcessorInvocation(ImageProcessorInvocation, PILInvocati image_resolution: int = Field(default=512, ge=0, description="The pixel resolution for the output image") # fmt: on + class Config(InvocationConfig): + schema_extra = { + "ui": { + "title": "Lineart Anime Processor", + "tags": ["controlnet", "lineart", "anime", "image", "processor"] + }, + } + def run_processor(self, image): - processor = LineartAnimeDetector.from_pretrained("lllyasviel/Annotators") + processor = LineartAnimeDetector.from_pretrained( + "lllyasviel/Annotators") processed_image = processor(image, detect_resolution=self.detect_resolution, image_resolution=self.image_resolution, @@ -314,7 +359,8 @@ class LineartAnimeImageProcessorInvocation(ImageProcessorInvocation, PILInvocati return processed_image -class OpenposeImageProcessorInvocation(ImageProcessorInvocation, PILInvocationConfig): +class OpenposeImageProcessorInvocation( + ImageProcessorInvocation, PILInvocationConfig): """Applies Openpose processing to image""" # fmt: off type: Literal["openpose_image_processor"] = "openpose_image_processor" @@ -324,17 +370,26 @@ class OpenposeImageProcessorInvocation(ImageProcessorInvocation, PILInvocationCo image_resolution: int = Field(default=512, ge=0, description="The pixel resolution for the output image") # fmt: on + class Config(InvocationConfig): + schema_extra = { + "ui": { + "title": "Openpose Processor", + "tags": ["controlnet", "openpose", "image", "processor"] + }, + } + def run_processor(self, image): - openpose_processor = OpenposeDetector.from_pretrained("lllyasviel/Annotators") - processed_image = openpose_processor(image, - detect_resolution=self.detect_resolution, - image_resolution=self.image_resolution, - hand_and_face=self.hand_and_face, - ) + openpose_processor = OpenposeDetector.from_pretrained( + "lllyasviel/Annotators") + processed_image = openpose_processor( + image, detect_resolution=self.detect_resolution, + image_resolution=self.image_resolution, + hand_and_face=self.hand_and_face,) return processed_image -class MidasDepthImageProcessorInvocation(ImageProcessorInvocation, PILInvocationConfig): +class MidasDepthImageProcessorInvocation( + ImageProcessorInvocation, PILInvocationConfig): """Applies Midas depth processing to image""" # fmt: off type: Literal["midas_depth_image_processor"] = "midas_depth_image_processor" @@ -345,6 +400,14 @@ class MidasDepthImageProcessorInvocation(ImageProcessorInvocation, PILInvocation # depth_and_normal: bool = Field(default=False, description="whether to use depth and normal mode") # fmt: on + class Config(InvocationConfig): + schema_extra = { + "ui": { + "title": "Midas (Depth) Processor", + "tags": ["controlnet", "midas", "depth", "image", "processor"] + }, + } + def run_processor(self, image): midas_processor = MidasDetector.from_pretrained("lllyasviel/Annotators") processed_image = midas_processor(image, @@ -356,7 +419,8 @@ class MidasDepthImageProcessorInvocation(ImageProcessorInvocation, PILInvocation return processed_image -class NormalbaeImageProcessorInvocation(ImageProcessorInvocation, PILInvocationConfig): +class NormalbaeImageProcessorInvocation( + ImageProcessorInvocation, PILInvocationConfig): """Applies NormalBae processing to image""" # fmt: off type: Literal["normalbae_image_processor"] = "normalbae_image_processor" @@ -365,15 +429,25 @@ class NormalbaeImageProcessorInvocation(ImageProcessorInvocation, PILInvocationC image_resolution: int = Field(default=512, ge=0, description="The pixel resolution for the output image") # fmt: on + class Config(InvocationConfig): + schema_extra = { + "ui": { + "title": "Normal BAE Processor", + "tags": ["controlnet", "normal", "bae", "image", "processor"] + }, + } + def run_processor(self, image): - normalbae_processor = NormalBaeDetector.from_pretrained("lllyasviel/Annotators") - processed_image = normalbae_processor(image, - detect_resolution=self.detect_resolution, - image_resolution=self.image_resolution) + normalbae_processor = NormalBaeDetector.from_pretrained( + "lllyasviel/Annotators") + processed_image = normalbae_processor( + image, detect_resolution=self.detect_resolution, + image_resolution=self.image_resolution) return processed_image -class MlsdImageProcessorInvocation(ImageProcessorInvocation, PILInvocationConfig): +class MlsdImageProcessorInvocation( + ImageProcessorInvocation, PILInvocationConfig): """Applies MLSD processing to image""" # fmt: off type: Literal["mlsd_image_processor"] = "mlsd_image_processor" @@ -384,17 +458,25 @@ class MlsdImageProcessorInvocation(ImageProcessorInvocation, PILInvocationConfig thr_d: float = Field(default=0.1, ge=0, description="MLSD parameter `thr_d`") # fmt: on + class Config(InvocationConfig): + schema_extra = { + "ui": { + "title": "MLSD Processor", + "tags": ["controlnet", "mlsd", "image", "processor"] + }, + } + def run_processor(self, image): mlsd_processor = MLSDdetector.from_pretrained("lllyasviel/Annotators") - processed_image = mlsd_processor(image, - detect_resolution=self.detect_resolution, - image_resolution=self.image_resolution, - thr_v=self.thr_v, - thr_d=self.thr_d) + processed_image = mlsd_processor( + image, detect_resolution=self.detect_resolution, + image_resolution=self.image_resolution, thr_v=self.thr_v, + thr_d=self.thr_d) return processed_image -class PidiImageProcessorInvocation(ImageProcessorInvocation, PILInvocationConfig): +class PidiImageProcessorInvocation( + ImageProcessorInvocation, PILInvocationConfig): """Applies PIDI processing to image""" # fmt: off type: Literal["pidi_image_processor"] = "pidi_image_processor" @@ -405,17 +487,26 @@ class PidiImageProcessorInvocation(ImageProcessorInvocation, PILInvocationConfig scribble: bool = Field(default=False, description="Whether to use scribble mode") # fmt: on + class Config(InvocationConfig): + schema_extra = { + "ui": { + "title": "PIDI Processor", + "tags": ["controlnet", "pidi", "image", "processor"] + }, + } + def run_processor(self, image): - pidi_processor = PidiNetDetector.from_pretrained("lllyasviel/Annotators") - processed_image = pidi_processor(image, - detect_resolution=self.detect_resolution, - image_resolution=self.image_resolution, - safe=self.safe, - scribble=self.scribble) + pidi_processor = PidiNetDetector.from_pretrained( + "lllyasviel/Annotators") + processed_image = pidi_processor( + image, detect_resolution=self.detect_resolution, + image_resolution=self.image_resolution, safe=self.safe, + scribble=self.scribble) return processed_image -class ContentShuffleImageProcessorInvocation(ImageProcessorInvocation, PILInvocationConfig): +class ContentShuffleImageProcessorInvocation( + ImageProcessorInvocation, PILInvocationConfig): """Applies content shuffle processing to image""" # fmt: off type: Literal["content_shuffle_image_processor"] = "content_shuffle_image_processor" @@ -427,6 +518,14 @@ class ContentShuffleImageProcessorInvocation(ImageProcessorInvocation, PILInvoca f: Optional[int] = Field(default=256, ge=0, description="Content shuffle `f` parameter") # fmt: on + class Config(InvocationConfig): + schema_extra = { + "ui": { + "title": "Content Shuffle Processor", + "tags": ["controlnet", "contentshuffle", "image", "processor"] + }, + } + def run_processor(self, image): content_shuffle_processor = ContentShuffleDetector() processed_image = content_shuffle_processor(image, @@ -440,19 +539,30 @@ class ContentShuffleImageProcessorInvocation(ImageProcessorInvocation, PILInvoca # should work with controlnet_aux >= 0.0.4 and timm <= 0.6.13 -class ZoeDepthImageProcessorInvocation(ImageProcessorInvocation, PILInvocationConfig): +class ZoeDepthImageProcessorInvocation( + ImageProcessorInvocation, PILInvocationConfig): """Applies Zoe depth processing to image""" # fmt: off type: Literal["zoe_depth_image_processor"] = "zoe_depth_image_processor" # fmt: on + class Config(InvocationConfig): + schema_extra = { + "ui": { + "title": "Zoe (Depth) Processor", + "tags": ["controlnet", "zoe", "depth", "image", "processor"] + }, + } + def run_processor(self, image): - zoe_depth_processor = ZoeDetector.from_pretrained("lllyasviel/Annotators") + zoe_depth_processor = ZoeDetector.from_pretrained( + "lllyasviel/Annotators") processed_image = zoe_depth_processor(image) return processed_image -class MediapipeFaceProcessorInvocation(ImageProcessorInvocation, PILInvocationConfig): +class MediapipeFaceProcessorInvocation( + ImageProcessorInvocation, PILInvocationConfig): """Applies mediapipe face processing to image""" # fmt: off type: Literal["mediapipe_face_processor"] = "mediapipe_face_processor" @@ -461,16 +571,27 @@ class MediapipeFaceProcessorInvocation(ImageProcessorInvocation, PILInvocationCo min_confidence: float = Field(default=0.5, ge=0, le=1, description="Minimum confidence for face detection") # fmt: on + class Config(InvocationConfig): + schema_extra = { + "ui": { + "title": "Mediapipe Processor", + "tags": ["controlnet", "mediapipe", "image", "processor"] + }, + } + def run_processor(self, image): # MediaPipeFaceDetector throws an error if image has alpha channel # so convert to RGB if needed if image.mode == 'RGBA': image = image.convert('RGB') mediapipe_face_processor = MediapipeFaceDetector() - processed_image = mediapipe_face_processor(image, max_faces=self.max_faces, min_confidence=self.min_confidence) + processed_image = mediapipe_face_processor( + image, max_faces=self.max_faces, min_confidence=self.min_confidence) return processed_image -class LeresImageProcessorInvocation(ImageProcessorInvocation, PILInvocationConfig): + +class LeresImageProcessorInvocation( + ImageProcessorInvocation, PILInvocationConfig): """Applies leres processing to image""" # fmt: off type: Literal["leres_image_processor"] = "leres_image_processor" @@ -482,18 +603,25 @@ class LeresImageProcessorInvocation(ImageProcessorInvocation, PILInvocationConfi image_resolution: int = Field(default=512, ge=0, description="The pixel resolution for the output image") # fmt: on + class Config(InvocationConfig): + schema_extra = { + "ui": { + "title": "Leres (Depth) Processor", + "tags": ["controlnet", "leres", "depth", "image", "processor"] + }, + } + def run_processor(self, image): leres_processor = LeresDetector.from_pretrained("lllyasviel/Annotators") - processed_image = leres_processor(image, - thr_a=self.thr_a, - thr_b=self.thr_b, - boost=self.boost, - detect_resolution=self.detect_resolution, - image_resolution=self.image_resolution) + processed_image = leres_processor( + image, thr_a=self.thr_a, thr_b=self.thr_b, boost=self.boost, + detect_resolution=self.detect_resolution, + image_resolution=self.image_resolution) return processed_image -class TileResamplerProcessorInvocation(ImageProcessorInvocation, PILInvocationConfig): +class TileResamplerProcessorInvocation( + ImageProcessorInvocation, PILInvocationConfig): # fmt: off type: Literal["tile_image_processor"] = "tile_image_processor" @@ -502,6 +630,14 @@ class TileResamplerProcessorInvocation(ImageProcessorInvocation, PILInvocationCo down_sampling_rate: float = Field(default=1.0, ge=1.0, le=8.0, description="Down sampling rate") # fmt: on + class Config(InvocationConfig): + schema_extra = { + "ui": { + "title": "Tile Resample Processor", + "tags": ["controlnet", "tile", "resample", "image", "processor"] + }, + } + # tile_resample copied from sd-webui-controlnet/scripts/processor.py def tile_resample(self, np_img: np.ndarray, @@ -520,28 +656,33 @@ class TileResamplerProcessorInvocation(ImageProcessorInvocation, PILInvocationCo def run_processor(self, img): np_img = np.array(img, dtype=np.uint8) processed_np_image = self.tile_resample(np_img, - #res=self.tile_size, + # res=self.tile_size, down_sampling_rate=self.down_sampling_rate ) processed_image = Image.fromarray(processed_np_image) return processed_image - - -class SegmentAnythingProcessorInvocation(ImageProcessorInvocation, PILInvocationConfig): +class SegmentAnythingProcessorInvocation( + ImageProcessorInvocation, PILInvocationConfig): """Applies segment anything processing to image""" # fmt: off type: Literal["segment_anything_processor"] = "segment_anything_processor" # fmt: on + class Config(InvocationConfig): + schema_extra = {"ui": {"title": "Segment Anything Processor", "tags": [ + "controlnet", "segment", "anything", "sam", "image", "processor"]}, } + def run_processor(self, image): # segment_anything_processor = SamDetector.from_pretrained("ybelkada/segment-anything", subfolder="checkpoints") - segment_anything_processor = SamDetectorReproducibleColors.from_pretrained("ybelkada/segment-anything", subfolder="checkpoints") + segment_anything_processor = SamDetectorReproducibleColors.from_pretrained( + "ybelkada/segment-anything", subfolder="checkpoints") np_img = np.array(image, dtype=np.uint8) processed_image = segment_anything_processor(np_img) return processed_image + class SamDetectorReproducibleColors(SamDetector): # overriding SamDetector.show_anns() method to use reproducible colors for segmentation image @@ -553,7 +694,8 @@ class SamDetectorReproducibleColors(SamDetector): return sorted_anns = sorted(anns, key=(lambda x: x['area']), reverse=True) h, w = anns[0]['segmentation'].shape - final_img = Image.fromarray(np.zeros((h, w, 3), dtype=np.uint8), mode="RGB") + final_img = Image.fromarray( + np.zeros((h, w, 3), dtype=np.uint8), mode="RGB") palette = ade_palette() for i, ann in enumerate(sorted_anns): m = ann['segmentation'] @@ -561,5 +703,8 @@ class SamDetectorReproducibleColors(SamDetector): # doing modulo just in case number of annotated regions exceeds number of colors in palette ann_color = palette[i % len(palette)] img[:, :] = ann_color - final_img.paste(Image.fromarray(img, mode="RGB"), (0, 0), Image.fromarray(np.uint8(m * 255))) + final_img.paste( + Image.fromarray(img, mode="RGB"), + (0, 0), + Image.fromarray(np.uint8(m * 255))) return np.array(final_img, dtype=np.uint8) diff --git a/invokeai/app/invocations/cv.py b/invokeai/app/invocations/cv.py index dd0ab4d027..cd7eaebeec 100644 --- a/invokeai/app/invocations/cv.py +++ b/invokeai/app/invocations/cv.py @@ -35,6 +35,14 @@ class CvInpaintInvocation(BaseInvocation, CvInvocationConfig): mask: ImageField = Field(default=None, description="The mask to use when inpainting") # fmt: on + class Config(InvocationConfig): + schema_extra = { + "ui": { + "title": "OpenCV Inpaint", + "tags": ["opencv", "inpaint"] + }, + } + def invoke(self, context: InvocationContext) -> ImageOutput: image = context.services.images.get_pil_image(self.image.image_name) mask = context.services.images.get_pil_image(self.mask.image_name) diff --git a/invokeai/app/invocations/generate.py b/invokeai/app/invocations/generate.py index 6cdb83effc..910a7edf8b 100644 --- a/invokeai/app/invocations/generate.py +++ b/invokeai/app/invocations/generate.py @@ -130,6 +130,7 @@ class InpaintInvocation(BaseInvocation): schema_extra = { "ui": { "tags": ["stable-diffusion", "image"], + "title": "Inpaint" }, } @@ -146,9 +147,13 @@ class InpaintInvocation(BaseInvocation): source_node_id=source_node_id, ) - def get_conditioning(self, context): - c, extra_conditioning_info = context.services.latents.get(self.positive_conditioning.conditioning_name) - uc, _ = context.services.latents.get(self.negative_conditioning.conditioning_name) + def get_conditioning(self, context, unet): + positive_cond_data = context.services.latents.get(self.positive_conditioning.conditioning_name) + c = positive_cond_data.conditionings[0].embeds.to(device=unet.device, dtype=unet.dtype) + extra_conditioning_info = positive_cond_data.conditionings[0].extra_conditioning + + negative_cond_data = context.services.latents.get(self.negative_conditioning.conditioning_name) + uc = negative_cond_data.conditionings[0].embeds.to(device=unet.device, dtype=unet.dtype) return (uc, c, extra_conditioning_info) @@ -157,13 +162,13 @@ class InpaintInvocation(BaseInvocation): def _lora_loader(): for lora in self.unet.loras: lora_info = context.services.model_manager.get_model( - **lora.dict(exclude={"weight"})) + **lora.dict(exclude={"weight"}), context=context,) yield (lora_info.context.model, lora.weight) del lora_info return - unet_info = context.services.model_manager.get_model(**self.unet.unet.dict()) - vae_info = context.services.model_manager.get_model(**self.vae.vae.dict()) + unet_info = context.services.model_manager.get_model(**self.unet.unet.dict(), context=context,) + vae_info = context.services.model_manager.get_model(**self.vae.vae.dict(), context=context,) with vae_info as vae,\ ModelPatcher.apply_lora_unet(unet_info.context.model, _lora_loader()),\ @@ -209,7 +214,6 @@ class InpaintInvocation(BaseInvocation): ) source_node_id = graph_execution_state.prepared_source_mapping[self.id] - conditioning = self.get_conditioning(context) scheduler = get_scheduler( context=context, scheduler_info=self.unet.scheduler, @@ -217,6 +221,8 @@ class InpaintInvocation(BaseInvocation): ) with self.load_model_old_way(context, scheduler) as model: + conditioning = self.get_conditioning(context, model.context.model.unet) + outputs = Inpaint(model).generate( conditioning=conditioning, scheduler=scheduler, diff --git a/invokeai/app/invocations/image.py b/invokeai/app/invocations/image.py index 1dbbff1c84..8405aa6daf 100644 --- a/invokeai/app/invocations/image.py +++ b/invokeai/app/invocations/image.py @@ -5,6 +5,7 @@ from typing import Literal, Optional import numpy from PIL import Image, ImageFilter, ImageOps, ImageChops from pydantic import BaseModel, Field +from typing import Union from ..models.image import ImageCategory, ImageField, ResourceOrigin from .baseinvocation import ( @@ -70,6 +71,15 @@ class LoadImageInvocation(BaseInvocation): default=None, description="The image to load" ) # fmt: on + + class Config(InvocationConfig): + schema_extra = { + "ui": { + "title": "Load Image", + "tags": ["image", "load"] + }, + } + def invoke(self, context: InvocationContext) -> ImageOutput: image = context.services.images.get_pil_image(self.image.image_name) @@ -90,6 +100,14 @@ class ShowImageInvocation(BaseInvocation): default=None, description="The image to show" ) + class Config(InvocationConfig): + schema_extra = { + "ui": { + "title": "Show Image", + "tags": ["image", "show"] + }, + } + def invoke(self, context: InvocationContext) -> ImageOutput: image = context.services.images.get_pil_image(self.image.image_name) if image: @@ -118,6 +136,14 @@ class ImageCropInvocation(BaseInvocation, PILInvocationConfig): height: int = Field(default=512, gt=0, description="The height of the crop rectangle") # fmt: on + class Config(InvocationConfig): + schema_extra = { + "ui": { + "title": "Crop Image", + "tags": ["image", "crop"] + }, + } + def invoke(self, context: InvocationContext) -> ImageOutput: image = context.services.images.get_pil_image(self.image.image_name) @@ -156,6 +182,14 @@ class ImagePasteInvocation(BaseInvocation, PILInvocationConfig): y: int = Field(default=0, description="The top y coordinate at which to paste the image") # fmt: on + class Config(InvocationConfig): + schema_extra = { + "ui": { + "title": "Paste Image", + "tags": ["image", "paste"] + }, + } + def invoke(self, context: InvocationContext) -> ImageOutput: base_image = context.services.images.get_pil_image(self.base_image.image_name) image = context.services.images.get_pil_image(self.image.image_name) @@ -206,6 +240,14 @@ class MaskFromAlphaInvocation(BaseInvocation, PILInvocationConfig): invert: bool = Field(default=False, description="Whether or not to invert the mask") # fmt: on + class Config(InvocationConfig): + schema_extra = { + "ui": { + "title": "Mask From Alpha", + "tags": ["image", "mask", "alpha"] + }, + } + def invoke(self, context: InvocationContext) -> MaskOutput: image = context.services.images.get_pil_image(self.image.image_name) @@ -240,6 +282,14 @@ class ImageMultiplyInvocation(BaseInvocation, PILInvocationConfig): image2: Optional[ImageField] = Field(default=None, description="The second image to multiply") # fmt: on + class Config(InvocationConfig): + schema_extra = { + "ui": { + "title": "Multiply Images", + "tags": ["image", "multiply"] + }, + } + def invoke(self, context: InvocationContext) -> ImageOutput: image1 = context.services.images.get_pil_image(self.image1.image_name) image2 = context.services.images.get_pil_image(self.image2.image_name) @@ -276,6 +326,14 @@ class ImageChannelInvocation(BaseInvocation, PILInvocationConfig): channel: IMAGE_CHANNELS = Field(default="A", description="The channel to get") # fmt: on + class Config(InvocationConfig): + schema_extra = { + "ui": { + "title": "Image Channel", + "tags": ["image", "channel"] + }, + } + def invoke(self, context: InvocationContext) -> ImageOutput: image = context.services.images.get_pil_image(self.image.image_name) @@ -311,6 +369,14 @@ class ImageConvertInvocation(BaseInvocation, PILInvocationConfig): mode: IMAGE_MODES = Field(default="L", description="The mode to convert to") # fmt: on + class Config(InvocationConfig): + schema_extra = { + "ui": { + "title": "Convert Image", + "tags": ["image", "convert"] + }, + } + def invoke(self, context: InvocationContext) -> ImageOutput: image = context.services.images.get_pil_image(self.image.image_name) @@ -344,6 +410,14 @@ class ImageBlurInvocation(BaseInvocation, PILInvocationConfig): blur_type: Literal["gaussian", "box"] = Field(default="gaussian", description="The type of blur") # fmt: on + class Config(InvocationConfig): + schema_extra = { + "ui": { + "title": "Blur Image", + "tags": ["image", "blur"] + }, + } + def invoke(self, context: InvocationContext) -> ImageOutput: image = context.services.images.get_pil_image(self.image.image_name) @@ -398,11 +472,19 @@ class ImageResizeInvocation(BaseInvocation, PILInvocationConfig): # Inputs image: Optional[ImageField] = Field(default=None, description="The image to resize") - width: int = Field(ge=64, multiple_of=8, description="The width to resize to (px)") - height: int = Field(ge=64, multiple_of=8, description="The height to resize to (px)") + width: Union[int, None] = Field(ge=64, multiple_of=8, description="The width to resize to (px)") + height: Union[int, None] = Field(ge=64, multiple_of=8, description="The height to resize to (px)") resample_mode: PIL_RESAMPLING_MODES = Field(default="bicubic", description="The resampling mode") # fmt: on + class Config(InvocationConfig): + schema_extra = { + "ui": { + "title": "Resize Image", + "tags": ["image", "resize"] + }, + } + def invoke(self, context: InvocationContext) -> ImageOutput: image = context.services.images.get_pil_image(self.image.image_name) @@ -436,11 +518,19 @@ class ImageScaleInvocation(BaseInvocation, PILInvocationConfig): type: Literal["img_scale"] = "img_scale" # Inputs - image: Optional[ImageField] = Field(default=None, description="The image to scale") - scale_factor: float = Field(gt=0, description="The factor by which to scale the image") + image: Optional[ImageField] = Field(default=None, description="The image to scale") + scale_factor: Optional[float] = Field(default=2.0, gt=0, description="The factor by which to scale the image") resample_mode: PIL_RESAMPLING_MODES = Field(default="bicubic", description="The resampling mode") # fmt: on + class Config(InvocationConfig): + schema_extra = { + "ui": { + "title": "Scale Image", + "tags": ["image", "scale"] + }, + } + def invoke(self, context: InvocationContext) -> ImageOutput: image = context.services.images.get_pil_image(self.image.image_name) @@ -481,6 +571,14 @@ class ImageLerpInvocation(BaseInvocation, PILInvocationConfig): max: int = Field(default=255, ge=0, le=255, description="The maximum output value") # fmt: on + class Config(InvocationConfig): + schema_extra = { + "ui": { + "title": "Image Linear Interpolation", + "tags": ["image", "linear", "interpolation", "lerp"] + }, + } + def invoke(self, context: InvocationContext) -> ImageOutput: image = context.services.images.get_pil_image(self.image.image_name) @@ -517,6 +615,14 @@ class ImageInverseLerpInvocation(BaseInvocation, PILInvocationConfig): max: int = Field(default=255, ge=0, le=255, description="The maximum input value") # fmt: on + class Config(InvocationConfig): + schema_extra = { + "ui": { + "title": "Image Inverse Linear Interpolation", + "tags": ["image", "linear", "interpolation", "inverse"] + }, + } + def invoke(self, context: InvocationContext) -> ImageOutput: image = context.services.images.get_pil_image(self.image.image_name) diff --git a/invokeai/app/invocations/infill.py b/invokeai/app/invocations/infill.py index 2640b2531d..ff8900fc50 100644 --- a/invokeai/app/invocations/infill.py +++ b/invokeai/app/invocations/infill.py @@ -14,6 +14,7 @@ from invokeai.backend.image_util.patchmatch import PatchMatch from ..models.image import ColorField, ImageCategory, ImageField, ResourceOrigin from .baseinvocation import ( BaseInvocation, + InvocationConfig, InvocationContext, ) @@ -133,6 +134,14 @@ class InfillColorInvocation(BaseInvocation): description="The color to use to infill", ) + class Config(InvocationConfig): + schema_extra = { + "ui": { + "title": "Color Infill", + "tags": ["image", "inpaint", "color", "infill"] + }, + } + def invoke(self, context: InvocationContext) -> ImageOutput: image = context.services.images.get_pil_image(self.image.image_name) @@ -173,6 +182,14 @@ class InfillTileInvocation(BaseInvocation): default_factory=get_random_seed, ) + class Config(InvocationConfig): + schema_extra = { + "ui": { + "title": "Tile Infill", + "tags": ["image", "inpaint", "tile", "infill"] + }, + } + def invoke(self, context: InvocationContext) -> ImageOutput: image = context.services.images.get_pil_image(self.image.image_name) @@ -206,6 +223,14 @@ class InfillPatchMatchInvocation(BaseInvocation): default=None, description="The image to infill" ) + class Config(InvocationConfig): + schema_extra = { + "ui": { + "title": "Patch Match Infill", + "tags": ["image", "inpaint", "patchmatch", "infill"] + }, + } + def invoke(self, context: InvocationContext) -> ImageOutput: image = context.services.images.get_pil_image(self.image.image_name) diff --git a/invokeai/app/invocations/latent.py b/invokeai/app/invocations/latent.py index 118f2e5e9d..f5e5b5db68 100644 --- a/invokeai/app/invocations/latent.py +++ b/invokeai/app/invocations/latent.py @@ -1,5 +1,6 @@ # Copyright (c) 2023 Kyle Schouviller (https://github.com/kyle0654) +from contextlib import ExitStack from typing import List, Literal, Optional, Union import einops @@ -11,6 +12,7 @@ from pydantic import BaseModel, Field, validator from invokeai.app.invocations.metadata import CoreMetadata from invokeai.app.util.step_callback import stable_diffusion_step_callback +from invokeai.backend.model_management.models.base import ModelType from ...backend.model_management.lora import ModelPatcher from ...backend.stable_diffusion import PipelineIntermediateState @@ -30,6 +32,13 @@ from .controlnet_image_processors import ControlField from .image import ImageOutput from .model import ModelInfo, UNetField, VaeField +from diffusers.models.attention_processor import ( + AttnProcessor2_0, + LoRAAttnProcessor2_0, + LoRAXFormersAttnProcessor, + XFormersAttnProcessor, +) + class LatentsField(BaseModel): """A latents field used for passing latents between invocations""" @@ -72,16 +81,21 @@ def get_scheduler( scheduler_name: str, ) -> Scheduler: scheduler_class, scheduler_extra_config = SCHEDULER_MAP.get( - scheduler_name, SCHEDULER_MAP['ddim']) + scheduler_name, SCHEDULER_MAP['ddim'] + ) orig_scheduler_info = context.services.model_manager.get_model( - **scheduler_info.dict()) + **scheduler_info.dict(), context=context, + ) with orig_scheduler_info as orig_scheduler: scheduler_config = orig_scheduler.config if "_backup" in scheduler_config: scheduler_config = scheduler_config["_backup"] - scheduler_config = {**scheduler_config, ** - scheduler_extra_config, "_backup": scheduler_config} + scheduler_config = { + **scheduler_config, + **scheduler_extra_config, + "_backup": scheduler_config, + } scheduler = scheduler_class.from_config(scheduler_config) # hack copied over from generate.py @@ -126,6 +140,7 @@ class TextToLatentsInvocation(BaseInvocation): class Config(InvocationConfig): schema_extra = { "ui": { + "title": "Text To Latents", "tags": ["latents"], "type_hints": { "model": "model", @@ -138,8 +153,11 @@ class TextToLatentsInvocation(BaseInvocation): # TODO: pass this an emitter method or something? or a session for dispatching? def dispatch_progress( - self, context: InvocationContext, source_node_id: str, - intermediate_state: PipelineIntermediateState) -> None: + self, + context: InvocationContext, + source_node_id: str, + intermediate_state: PipelineIntermediateState, + ) -> None: stable_diffusion_step_callback( context=context, intermediate_state=intermediate_state, @@ -148,11 +166,17 @@ class TextToLatentsInvocation(BaseInvocation): ) def get_conditioning_data( - self, context: InvocationContext, scheduler) -> ConditioningData: - c, extra_conditioning_info = context.services.latents.get( - self.positive_conditioning.conditioning_name) - uc, _ = context.services.latents.get( - self.negative_conditioning.conditioning_name) + self, + context: InvocationContext, + scheduler, + unet, + ) -> ConditioningData: + positive_cond_data = context.services.latents.get(self.positive_conditioning.conditioning_name) + c = positive_cond_data.conditionings[0].embeds.to(device=unet.device, dtype=unet.dtype) + extra_conditioning_info = positive_cond_data.conditionings[0].extra_conditioning + + negative_cond_data = context.services.latents.get(self.negative_conditioning.conditioning_name) + uc = negative_cond_data.conditionings[0].embeds.to(device=unet.device, dtype=unet.dtype) conditioning_data = ConditioningData( unconditioned_embeddings=uc, @@ -174,12 +198,15 @@ class TextToLatentsInvocation(BaseInvocation): eta=0.0, # ddim_eta # for ancestral and sde schedulers - generator=torch.Generator(device=uc.device).manual_seed(0), + generator=torch.Generator(device=unet.device).manual_seed(0), ) return conditioning_data def create_pipeline( - self, unet, scheduler) -> StableDiffusionGeneratorPipeline: + self, + unet, + scheduler, + ) -> StableDiffusionGeneratorPipeline: # TODO: # configure_model_padding( # unet, @@ -214,6 +241,7 @@ class TextToLatentsInvocation(BaseInvocation): model: StableDiffusionGeneratorPipeline, control_input: List[ControlField], latents_shape: List[int], + exit_stack: ExitStack, do_classifier_free_guidance: bool = True, ) -> List[ControlNetData]: @@ -239,25 +267,20 @@ class TextToLatentsInvocation(BaseInvocation): control_data = [] control_models = [] for control_info in control_list: - # handle control models - if ("," in control_info.control_model): - control_model_split = control_info.control_model.split(",") - control_name = control_model_split[0] - control_subfolder = control_model_split[1] - print("Using HF model subfolders") - print(" control_name: ", control_name) - print(" control_subfolder: ", control_subfolder) - control_model = ControlNetModel.from_pretrained( - control_name, subfolder=control_subfolder, - torch_dtype=model.unet.dtype).to( - model.device) - else: - control_model = ControlNetModel.from_pretrained( - control_info.control_model, torch_dtype=model.unet.dtype).to(model.device) + control_model = exit_stack.enter_context( + context.services.model_manager.get_model( + model_name=control_info.control_model.model_name, + model_type=ModelType.ControlNet, + base_model=control_info.control_model.base_model, + context=context, + ) + ) + control_models.append(control_model) control_image_field = control_info.image input_image = context.services.images.get_pil_image( - control_image_field.image_name) + control_image_field.image_name + ) # self.image.image_type, self.image.image_name # FIXME: still need to test with different widths, heights, devices, dtypes # and add in batch_size, num_images_per_prompt? @@ -279,7 +302,8 @@ class TextToLatentsInvocation(BaseInvocation): weight=control_info.control_weight, begin_step_percent=control_info.begin_step_percent, end_step_percent=control_info.end_step_percent, - control_mode=control_info.control_mode,) + control_mode=control_info.control_mode, + ) control_data.append(control_item) # MultiControlNetModel has been refactored out, just need list[ControlNetData] return control_data @@ -290,7 +314,8 @@ class TextToLatentsInvocation(BaseInvocation): # Get the source node id (we are invoking the prepared node) graph_execution_state = context.services.graph_execution_manager.get( - context.graph_execution_state_id) + context.graph_execution_state_id + ) source_node_id = graph_execution_state.prepared_source_mapping[self.id] def step_callback(state: PipelineIntermediateState): @@ -299,16 +324,21 @@ class TextToLatentsInvocation(BaseInvocation): def _lora_loader(): for lora in self.unet.loras: lora_info = context.services.model_manager.get_model( - **lora.dict(exclude={"weight"})) + **lora.dict(exclude={"weight"}), context=context, + ) yield (lora_info.context.model, lora.weight) del lora_info return unet_info = context.services.model_manager.get_model( - **self.unet.unet.dict()) - with ModelPatcher.apply_lora_unet(unet_info.context.model, _lora_loader()),\ + **self.unet.unet.dict(), context=context, + ) + with ExitStack() as exit_stack,\ + ModelPatcher.apply_lora_unet(unet_info.context.model, _lora_loader()),\ unet_info as unet: + noise = noise.to(device=unet.device, dtype=unet.dtype) + scheduler = get_scheduler( context=context, scheduler_info=self.unet.scheduler, @@ -316,13 +346,14 @@ class TextToLatentsInvocation(BaseInvocation): ) pipeline = self.create_pipeline(unet, scheduler) - conditioning_data = self.get_conditioning_data(context, scheduler) + conditioning_data = self.get_conditioning_data(context, scheduler, unet) control_data = self.prep_control_data( model=pipeline, context=context, control_input=self.control, latents_shape=noise.shape, # do_classifier_free_guidance=(self.cfg_scale >= 1.0)) do_classifier_free_guidance=True, + exit_stack=exit_stack, ) # TODO: Verify the noise is the right size @@ -336,6 +367,7 @@ class TextToLatentsInvocation(BaseInvocation): ) # https://discuss.huggingface.co/t/memory-usage-by-later-pipeline-stages/23699 + result_latents = result_latents.to("cpu") torch.cuda.empty_cache() name = f'{context.graph_execution_state_id}__{self.id}' @@ -359,6 +391,7 @@ class LatentsToLatentsInvocation(TextToLatentsInvocation): class Config(InvocationConfig): schema_extra = { "ui": { + "title": "Latent To Latents", "tags": ["latents"], "type_hints": { "model": "model", @@ -375,7 +408,8 @@ class LatentsToLatentsInvocation(TextToLatentsInvocation): # Get the source node id (we are invoking the prepared node) graph_execution_state = context.services.graph_execution_manager.get( - context.graph_execution_state_id) + context.graph_execution_state_id + ) source_node_id = graph_execution_state.prepared_source_mapping[self.id] def step_callback(state: PipelineIntermediateState): @@ -384,16 +418,22 @@ class LatentsToLatentsInvocation(TextToLatentsInvocation): def _lora_loader(): for lora in self.unet.loras: lora_info = context.services.model_manager.get_model( - **lora.dict(exclude={"weight"})) + **lora.dict(exclude={"weight"}), context=context, + ) yield (lora_info.context.model, lora.weight) del lora_info return unet_info = context.services.model_manager.get_model( - **self.unet.unet.dict()) - with ModelPatcher.apply_lora_unet(unet_info.context.model, _lora_loader()),\ + **self.unet.unet.dict(), context=context, + ) + with ExitStack() as exit_stack,\ + ModelPatcher.apply_lora_unet(unet_info.context.model, _lora_loader()),\ unet_info as unet: + noise = noise.to(device=unet.device, dtype=unet.dtype) + latent = latent.to(device=unet.device, dtype=unet.dtype) + scheduler = get_scheduler( context=context, scheduler_info=self.unet.scheduler, @@ -401,18 +441,20 @@ class LatentsToLatentsInvocation(TextToLatentsInvocation): ) pipeline = self.create_pipeline(unet, scheduler) - conditioning_data = self.get_conditioning_data(context, scheduler) + conditioning_data = self.get_conditioning_data(context, scheduler, unet) control_data = self.prep_control_data( model=pipeline, context=context, control_input=self.control, latents_shape=noise.shape, # do_classifier_free_guidance=(self.cfg_scale >= 1.0)) do_classifier_free_guidance=True, + exit_stack=exit_stack, ) # TODO: Verify the noise is the right size initial_latents = latent if self.strength < 1.0 else torch.zeros_like( - latent, device=unet.device, dtype=latent.dtype) + latent, device=unet.device, dtype=latent.dtype + ) timesteps, _ = pipeline.get_img2img_timesteps( self.steps, @@ -431,6 +473,7 @@ class LatentsToLatentsInvocation(TextToLatentsInvocation): ) # https://discuss.huggingface.co/t/memory-usage-by-later-pipeline-stages/23699 + result_latents = result_latents.to("cpu") torch.cuda.empty_cache() name = f'{context.graph_execution_state_id}__{self.id}' @@ -451,13 +494,14 @@ class LatentsToImageInvocation(BaseInvocation): tiled: bool = Field( default=False, description="Decode latents by overlaping tiles(less memory consumption)") + fp32: bool = Field(False, description="Decode in full precision") metadata: Optional[CoreMetadata] = Field(default=None, description="Optional core metadata to be written to the image") - # Schema customisation class Config(InvocationConfig): schema_extra = { "ui": { + "title": "Latents To Image", "tags": ["latents", "image"], }, } @@ -467,10 +511,36 @@ class LatentsToImageInvocation(BaseInvocation): latents = context.services.latents.get(self.latents.latents_name) vae_info = context.services.model_manager.get_model( - **self.vae.vae.dict(), + **self.vae.vae.dict(), context=context, ) with vae_info as vae: + latents = latents.to(vae.device) + if self.fp32: + vae.to(dtype=torch.float32) + + use_torch_2_0_or_xformers = isinstance( + vae.decoder.mid_block.attentions[0].processor, + ( + AttnProcessor2_0, + XFormersAttnProcessor, + LoRAXFormersAttnProcessor, + LoRAAttnProcessor2_0, + ), + ) + # if xformers or torch_2_0 is used attention block does not need + # to be in float32 which can save lots of memory + if use_torch_2_0_or_xformers: + vae.post_quant_conv.to(latents.dtype) + vae.decoder.conv_in.to(latents.dtype) + vae.decoder.mid_block.to(latents.dtype) + else: + latents = latents.float() + + else: + vae.to(dtype=torch.float16) + latents = latents.half() + if self.tiled or context.services.configuration.tiled_decode: vae.enable_tiling() else: @@ -520,25 +590,38 @@ class ResizeLatentsInvocation(BaseInvocation): # Inputs latents: Optional[LatentsField] = Field( description="The latents to resize") - width: int = Field( + width: Union[int, None] = Field(default=512, ge=64, multiple_of=8, description="The width to resize to (px)") - height: int = Field( + height: Union[int, None] = Field(default=512, ge=64, multiple_of=8, description="The height to resize to (px)") mode: LATENTS_INTERPOLATION_MODE = Field( default="bilinear", description="The interpolation mode") antialias: bool = Field( default=False, description="Whether or not to antialias (applied in bilinear and bicubic modes only)") + + class Config(InvocationConfig): + schema_extra = { + "ui": { + "title": "Resize Latents", + "tags": ["latents", "resize"] + }, + } def invoke(self, context: InvocationContext) -> LatentsOutput: latents = context.services.latents.get(self.latents.latents_name) + # TODO: + device=choose_torch_device() + resized_latents = torch.nn.functional.interpolate( - latents, size=(self.height // 8, self.width // 8), + latents.to(device), size=(self.height // 8, self.width // 8), mode=self.mode, antialias=self.antialias - if self.mode in ["bilinear", "bicubic"] else False,) + if self.mode in ["bilinear", "bicubic"] else False, + ) # https://discuss.huggingface.co/t/memory-usage-by-later-pipeline-stages/23699 + resized_latents = resized_latents.to("cpu") torch.cuda.empty_cache() name = f"{context.graph_execution_state_id}__{self.id}" @@ -562,17 +645,30 @@ class ScaleLatentsInvocation(BaseInvocation): antialias: bool = Field( default=False, description="Whether or not to antialias (applied in bilinear and bicubic modes only)") + + class Config(InvocationConfig): + schema_extra = { + "ui": { + "title": "Scale Latents", + "tags": ["latents", "scale"] + }, + } def invoke(self, context: InvocationContext) -> LatentsOutput: latents = context.services.latents.get(self.latents.latents_name) + # TODO: + device=choose_torch_device() + # resizing resized_latents = torch.nn.functional.interpolate( - latents, scale_factor=self.scale_factor, mode=self.mode, + latents.to(device), scale_factor=self.scale_factor, mode=self.mode, antialias=self.antialias - if self.mode in ["bilinear", "bicubic"] else False,) + if self.mode in ["bilinear", "bicubic"] else False, + ) # https://discuss.huggingface.co/t/memory-usage-by-later-pipeline-stages/23699 + resized_latents = resized_latents.to("cpu") torch.cuda.empty_cache() name = f"{context.graph_execution_state_id}__{self.id}" @@ -592,12 +688,15 @@ class ImageToLatentsInvocation(BaseInvocation): tiled: bool = Field( default=False, description="Encode latents by overlaping tiles(less memory consumption)") + fp32: bool = Field(False, description="Decode in full precision") + # Schema customisation class Config(InvocationConfig): schema_extra = { "ui": { - "tags": ["latents", "image"], + "title": "Image To Latents", + "tags": ["latents", "image"] }, } @@ -610,7 +709,7 @@ class ImageToLatentsInvocation(BaseInvocation): #vae_info = context.services.model_manager.get_model(**self.vae.vae.dict()) vae_info = context.services.model_manager.get_model( - **self.vae.vae.dict(), + **self.vae.vae.dict(), context=context, ) image_tensor = image_resized_to_grid_as_tensor(image.convert("RGB")) @@ -618,6 +717,32 @@ class ImageToLatentsInvocation(BaseInvocation): image_tensor = einops.rearrange(image_tensor, "c h w -> 1 c h w") with vae_info as vae: + orig_dtype = vae.dtype + if self.fp32: + vae.to(dtype=torch.float32) + + use_torch_2_0_or_xformers = isinstance( + vae.decoder.mid_block.attentions[0].processor, + ( + AttnProcessor2_0, + XFormersAttnProcessor, + LoRAXFormersAttnProcessor, + LoRAAttnProcessor2_0, + ), + ) + # if xformers or torch_2_0 is used attention block does not need + # to be in float32 which can save lots of memory + if use_torch_2_0_or_xformers: + vae.post_quant_conv.to(orig_dtype) + vae.decoder.conv_in.to(orig_dtype) + vae.decoder.mid_block.to(orig_dtype) + #else: + # latents = latents.float() + + else: + vae.to(dtype=torch.float16) + #latents = latents.half() + if self.tiled: vae.enable_tiling() else: @@ -632,8 +757,9 @@ class ImageToLatentsInvocation(BaseInvocation): ) # FIXME: uses torch.randn. make reproducible! latents = 0.18215 * latents + latents = latents.to(dtype=orig_dtype) name = f"{context.graph_execution_state_id}__{self.id}" - # context.services.latents.set(name, latents) + latents = latents.to("cpu") context.services.latents.save(name, latents) return build_latents_output(latents_name=name, latents=latents) diff --git a/invokeai/app/invocations/math.py b/invokeai/app/invocations/math.py index 113b630200..92cff04bf7 100644 --- a/invokeai/app/invocations/math.py +++ b/invokeai/app/invocations/math.py @@ -52,6 +52,14 @@ class AddInvocation(BaseInvocation, MathInvocationConfig): b: int = Field(default=0, description="The second number") # fmt: on + class Config(InvocationConfig): + schema_extra = { + "ui": { + "title": "Add", + "tags": ["math", "add"] + }, + } + def invoke(self, context: InvocationContext) -> IntOutput: return IntOutput(a=self.a + self.b) @@ -65,6 +73,14 @@ class SubtractInvocation(BaseInvocation, MathInvocationConfig): b: int = Field(default=0, description="The second number") # fmt: on + class Config(InvocationConfig): + schema_extra = { + "ui": { + "title": "Subtract", + "tags": ["math", "subtract"] + }, + } + def invoke(self, context: InvocationContext) -> IntOutput: return IntOutput(a=self.a - self.b) @@ -78,6 +94,14 @@ class MultiplyInvocation(BaseInvocation, MathInvocationConfig): b: int = Field(default=0, description="The second number") # fmt: on + class Config(InvocationConfig): + schema_extra = { + "ui": { + "title": "Multiply", + "tags": ["math", "multiply"] + }, + } + def invoke(self, context: InvocationContext) -> IntOutput: return IntOutput(a=self.a * self.b) @@ -91,6 +115,14 @@ class DivideInvocation(BaseInvocation, MathInvocationConfig): b: int = Field(default=0, description="The second number") # fmt: on + class Config(InvocationConfig): + schema_extra = { + "ui": { + "title": "Divide", + "tags": ["math", "divide"] + }, + } + def invoke(self, context: InvocationContext) -> IntOutput: return IntOutput(a=int(self.a / self.b)) @@ -105,5 +137,14 @@ class RandomIntInvocation(BaseInvocation): default=np.iinfo(np.int32).max, description="The exclusive high value" ) # fmt: on + + class Config(InvocationConfig): + schema_extra = { + "ui": { + "title": "Random Integer", + "tags": ["math", "random", "integer"] + }, + } + def invoke(self, context: InvocationContext) -> IntOutput: return IntOutput(a=np.random.randint(self.low, self.high)) diff --git a/invokeai/app/invocations/metadata.py b/invokeai/app/invocations/metadata.py index b7639c56c7..836ab7d0af 100644 --- a/invokeai/app/invocations/metadata.py +++ b/invokeai/app/invocations/metadata.py @@ -3,7 +3,7 @@ from typing import Literal, Optional, Union from pydantic import BaseModel, Field from invokeai.app.invocations.baseinvocation import (BaseInvocation, - BaseInvocationOutput, + BaseInvocationOutput, InvocationConfig, InvocationContext) from invokeai.app.invocations.controlnet_image_processors import ControlField from invokeai.app.invocations.model import (LoRAModelField, MainModelField, @@ -97,6 +97,14 @@ class MetadataAccumulatorInvocation(BaseInvocation): description="The VAE used for decoding, if the main model's default was not used", ) + class Config(InvocationConfig): + schema_extra = { + "ui": { + "title": "Metadata Accumulator", + "tags": ["image", "metadata", "generation"] + }, + } + def invoke(self, context: InvocationContext) -> MetadataAccumulatorOutput: """Collects and outputs a CoreMetadata object""" diff --git a/invokeai/app/invocations/model.py b/invokeai/app/invocations/model.py index cfbeb1d98b..1cd233bc56 100644 --- a/invokeai/app/invocations/model.py +++ b/invokeai/app/invocations/model.py @@ -33,7 +33,6 @@ class ClipField(BaseModel): skipped_layers: int = Field(description="Number of skipped layers in text_encoder") loras: List[LoraInfo] = Field(description="Loras to apply on model loading") - class VaeField(BaseModel): # TODO: better naming? vae: ModelInfo = Field(description="Info to load vae submodel") @@ -50,7 +49,6 @@ class ModelLoaderOutput(BaseInvocationOutput): vae: VaeField = Field(default=None, description="Vae submodel") # fmt: on - class MainModelField(BaseModel): """Main model field""" @@ -65,7 +63,6 @@ class LoRAModelField(BaseModel): model_name: str = Field(description="Name of the LoRA model") base_model: BaseModelType = Field(description="Base model") - class MainModelLoaderInvocation(BaseInvocation): """Loads a main model, outputting its submodels.""" @@ -158,6 +155,22 @@ class MainModelLoaderInvocation(BaseInvocation): loras=[], skipped_layers=0, ), + clip2=ClipField( + tokenizer=ModelInfo( + model_name=model_name, + base_model=base_model, + model_type=model_type, + submodel=SubModelType.Tokenizer2, + ), + text_encoder=ModelInfo( + model_name=model_name, + base_model=base_model, + model_type=model_type, + submodel=SubModelType.TextEncoder2, + ), + loras=[], + skipped_layers=0, + ), vae=VaeField( vae=ModelInfo( model_name=model_name, @@ -168,7 +181,7 @@ class MainModelLoaderInvocation(BaseInvocation): ), ) - + class LoraLoaderOutput(BaseInvocationOutput): """Model loader output""" diff --git a/invokeai/app/invocations/noise.py b/invokeai/app/invocations/noise.py index 0d62ada34e..442557520a 100644 --- a/invokeai/app/invocations/noise.py +++ b/invokeai/app/invocations/noise.py @@ -48,7 +48,7 @@ def get_noise( dtype=torch_dtype(device), device=noise_device_type, generator=generator, - ).to(device) + ).to("cpu") return noise_tensor @@ -112,6 +112,7 @@ class NoiseInvocation(BaseInvocation): class Config(InvocationConfig): schema_extra = { "ui": { + "title": "Noise", "tags": ["latents", "noise"], }, } diff --git a/invokeai/app/invocations/param_easing.py b/invokeai/app/invocations/param_easing.py index e79763a35e..70d3ddc7d2 100644 --- a/invokeai/app/invocations/param_easing.py +++ b/invokeai/app/invocations/param_easing.py @@ -43,6 +43,14 @@ class FloatLinearRangeInvocation(BaseInvocation): stop: float = Field(default=10, description="The last value of the range") steps: int = Field(default=30, description="number of values to interpolate over (including start and stop)") + class Config(InvocationConfig): + schema_extra = { + "ui": { + "title": "Linear Range (Float)", + "tags": ["math", "float", "linear", "range"] + }, + } + def invoke(self, context: InvocationContext) -> FloatCollectionOutput: param_list = list(np.linspace(self.start, self.stop, self.steps)) return FloatCollectionOutput( @@ -113,6 +121,14 @@ class StepParamEasingInvocation(BaseInvocation): show_easing_plot: bool = Field(default=False, description="show easing plot") # fmt: on + class Config(InvocationConfig): + schema_extra = { + "ui": { + "title": "Param Easing By Step", + "tags": ["param", "step", "easing"] + }, + } + def invoke(self, context: InvocationContext) -> FloatCollectionOutput: log_diagnostics = False diff --git a/invokeai/app/invocations/params.py b/invokeai/app/invocations/params.py index 1c6297665b..0f01d65948 100644 --- a/invokeai/app/invocations/params.py +++ b/invokeai/app/invocations/params.py @@ -1,9 +1,12 @@ # Copyright (c) 2023 Kyle Schouviller (https://github.com/kyle0654) from typing import Literal + from pydantic import Field -from .baseinvocation import BaseInvocation, BaseInvocationOutput, InvocationContext -from .math import IntOutput, FloatOutput + +from .baseinvocation import (BaseInvocation, BaseInvocationOutput, + InvocationConfig, InvocationContext) +from .math import FloatOutput, IntOutput # Pass-through parameter nodes - used by subgraphs @@ -14,6 +17,14 @@ class ParamIntInvocation(BaseInvocation): a: int = Field(default=0, description="The integer value") #fmt: on + class Config(InvocationConfig): + schema_extra = { + "ui": { + "tags": ["param", "integer"], + "title": "Integer Parameter" + }, + } + def invoke(self, context: InvocationContext) -> IntOutput: return IntOutput(a=self.a) @@ -24,5 +35,36 @@ class ParamFloatInvocation(BaseInvocation): param: float = Field(default=0.0, description="The float value") #fmt: on + class Config(InvocationConfig): + schema_extra = { + "ui": { + "tags": ["param", "float"], + "title": "Float Parameter" + }, + } + def invoke(self, context: InvocationContext) -> FloatOutput: return FloatOutput(param=self.param) + +class StringOutput(BaseInvocationOutput): + """A string output""" + type: Literal["string_output"] = "string_output" + text: str = Field(default=None, description="The output string") + + +class ParamStringInvocation(BaseInvocation): + """A string parameter""" + type: Literal['param_string'] = 'param_string' + text: str = Field(default='', description='The string value') + + class Config(InvocationConfig): + schema_extra = { + "ui": { + "tags": ["param", "string"], + "title": "String Parameter" + }, + } + + def invoke(self, context: InvocationContext) -> StringOutput: + return StringOutput(text=self.text) + \ No newline at end of file diff --git a/invokeai/app/invocations/prompt.py b/invokeai/app/invocations/prompt.py index 9af87e1ed4..5d07a88759 100644 --- a/invokeai/app/invocations/prompt.py +++ b/invokeai/app/invocations/prompt.py @@ -1,8 +1,10 @@ -from typing import Literal +from os.path import exists +from typing import Literal, Optional -from pydantic.fields import Field +import numpy as np +from pydantic import Field, validator -from .baseinvocation import BaseInvocation, BaseInvocationOutput, InvocationContext +from .baseinvocation import BaseInvocation, BaseInvocationOutput, InvocationConfig, InvocationContext from dynamicprompts.generators import RandomPromptGenerator, CombinatorialPromptGenerator class PromptOutput(BaseInvocationOutput): @@ -46,6 +48,14 @@ class DynamicPromptInvocation(BaseInvocation): default=False, description="Whether to use the combinatorial generator" ) + class Config(InvocationConfig): + schema_extra = { + "ui": { + "title": "Dynamic Prompt", + "tags": ["prompt", "dynamic"] + }, + } + def invoke(self, context: InvocationContext) -> PromptCollectionOutput: if self.combinatorial: generator = CombinatorialPromptGenerator() @@ -55,3 +65,49 @@ class DynamicPromptInvocation(BaseInvocation): prompts = generator.generate(self.prompt, num_images=self.max_prompts) return PromptCollectionOutput(prompt_collection=prompts, count=len(prompts)) + + +class PromptsFromFileInvocation(BaseInvocation): + '''Loads prompts from a text file''' + # fmt: off + type: Literal['prompt_from_file'] = 'prompt_from_file' + + # Inputs + file_path: str = Field(description="Path to prompt text file") + pre_prompt: Optional[str] = Field(description="String to prepend to each prompt") + post_prompt: Optional[str] = Field(description="String to append to each prompt") + start_line: int = Field(default=1, ge=1, description="Line in the file to start start from") + max_prompts: int = Field(default=1, ge=0, description="Max lines to read from file (0=all)") + #fmt: on + + class Config(InvocationConfig): + schema_extra = { + "ui": { + "title": "Prompts From File", + "tags": ["prompt", "file"] + }, + } + + @validator("file_path") + def file_path_exists(cls, v): + if not exists(v): + raise ValueError(FileNotFoundError) + return v + + def promptsFromFile(self, file_path: str, pre_prompt: str, post_prompt: str, start_line: int, max_prompts: int): + prompts = [] + start_line -= 1 + end_line = start_line + max_prompts + if max_prompts <= 0: + end_line = np.iinfo(np.int32).max + with open(file_path) as f: + for i, line in enumerate(f): + if i >= start_line and i < end_line: + prompts.append((pre_prompt or '') + line.strip() + (post_prompt or '')) + if i >= end_line: + break + return prompts + + def invoke(self, context: InvocationContext) -> PromptCollectionOutput: + prompts = self.promptsFromFile(self.file_path, self.pre_prompt, self.post_prompt, self.start_line, self.max_prompts) + return PromptCollectionOutput(prompt_collection=prompts, count=len(prompts)) diff --git a/invokeai/app/invocations/reconstruct.py b/invokeai/app/invocations/reconstruct.py deleted file mode 100644 index 84ace2eefe..0000000000 --- a/invokeai/app/invocations/reconstruct.py +++ /dev/null @@ -1,55 +0,0 @@ -from typing import Literal, Optional - -from pydantic import Field - -from invokeai.app.models.image import ImageCategory, ImageField, ResourceOrigin - -from .baseinvocation import BaseInvocation, InvocationContext, InvocationConfig -from .image import ImageOutput - - -class RestoreFaceInvocation(BaseInvocation): - """Restores faces in an image.""" - - # fmt: off - type: Literal["restore_face"] = "restore_face" - - # Inputs - image: Optional[ImageField] = Field(description="The input image") - strength: float = Field(default=0.75, gt=0, le=1, description="The strength of the restoration" ) - # fmt: on - - # Schema customisation - class Config(InvocationConfig): - schema_extra = { - "ui": { - "tags": ["restoration", "image"], - }, - } - - def invoke(self, context: InvocationContext) -> ImageOutput: - image = context.services.images.get_pil_image(self.image.image_name) - results = context.services.restoration.upscale_and_reconstruct( - image_list=[[image, 0]], - upscale=None, - strength=self.strength, # GFPGAN strength - save_original=False, - image_callback=None, - ) - - # Results are image and seed, unwrap for now - # TODO: can this return multiple results? - image_dto = context.services.images.create( - image=results[0][0], - image_origin=ResourceOrigin.INTERNAL, - image_category=ImageCategory.GENERAL, - node_id=self.id, - session_id=context.graph_execution_state_id, - is_intermediate=self.is_intermediate, - ) - - return ImageOutput( - image=ImageField(image_name=image_dto.image_name), - width=image_dto.width, - height=image_dto.height, - ) diff --git a/invokeai/app/invocations/sdxl.py b/invokeai/app/invocations/sdxl.py new file mode 100644 index 0000000000..c091c8e49b --- /dev/null +++ b/invokeai/app/invocations/sdxl.py @@ -0,0 +1,662 @@ +import torch +import inspect +from tqdm import tqdm +from typing import List, Literal, Optional, Union + +from pydantic import Field, validator + +from ...backend.model_management import ModelType, SubModelType +from .baseinvocation import (BaseInvocation, BaseInvocationOutput, + InvocationConfig, InvocationContext) + +from .model import UNetField, ClipField, VaeField, MainModelField, ModelInfo +from .compel import ConditioningField +from .latent import LatentsField, SAMPLER_NAME_VALUES, LatentsOutput, get_scheduler, build_latents_output + +class SDXLModelLoaderOutput(BaseInvocationOutput): + """SDXL base model loader output""" + + # fmt: off + type: Literal["sdxl_model_loader_output"] = "sdxl_model_loader_output" + + unet: UNetField = Field(default=None, description="UNet submodel") + clip: ClipField = Field(default=None, description="Tokenizer and text_encoder submodels") + clip2: ClipField = Field(default=None, description="Tokenizer and text_encoder submodels") + vae: VaeField = Field(default=None, description="Vae submodel") + # fmt: on + +class SDXLRefinerModelLoaderOutput(BaseInvocationOutput): + """SDXL refiner model loader output""" + # fmt: off + type: Literal["sdxl_refiner_model_loader_output"] = "sdxl_refiner_model_loader_output" + unet: UNetField = Field(default=None, description="UNet submodel") + clip2: ClipField = Field(default=None, description="Tokenizer and text_encoder submodels") + vae: VaeField = Field(default=None, description="Vae submodel") + # fmt: on + #fmt: on + +class SDXLModelLoaderInvocation(BaseInvocation): + """Loads an sdxl base model, outputting its submodels.""" + + type: Literal["sdxl_model_loader"] = "sdxl_model_loader" + + model: MainModelField = Field(description="The model to load") + # TODO: precision? + + # Schema customisation + class Config(InvocationConfig): + schema_extra = { + "ui": { + "title": "SDXL Model Loader", + "tags": ["model", "loader", "sdxl"], + "type_hints": {"model": "model"}, + }, + } + + def invoke(self, context: InvocationContext) -> SDXLModelLoaderOutput: + base_model = self.model.base_model + model_name = self.model.model_name + model_type = ModelType.Main + + # TODO: not found exceptions + if not context.services.model_manager.model_exists( + model_name=model_name, + base_model=base_model, + model_type=model_type, + ): + raise Exception(f"Unknown {base_model} {model_type} model: {model_name}") + + return SDXLModelLoaderOutput( + unet=UNetField( + unet=ModelInfo( + model_name=model_name, + base_model=base_model, + model_type=model_type, + submodel=SubModelType.UNet, + ), + scheduler=ModelInfo( + model_name=model_name, + base_model=base_model, + model_type=model_type, + submodel=SubModelType.Scheduler, + ), + loras=[], + ), + clip=ClipField( + tokenizer=ModelInfo( + model_name=model_name, + base_model=base_model, + model_type=model_type, + submodel=SubModelType.Tokenizer, + ), + text_encoder=ModelInfo( + model_name=model_name, + base_model=base_model, + model_type=model_type, + submodel=SubModelType.TextEncoder, + ), + loras=[], + skipped_layers=0, + ), + clip2=ClipField( + tokenizer=ModelInfo( + model_name=model_name, + base_model=base_model, + model_type=model_type, + submodel=SubModelType.Tokenizer2, + ), + text_encoder=ModelInfo( + model_name=model_name, + base_model=base_model, + model_type=model_type, + submodel=SubModelType.TextEncoder2, + ), + loras=[], + skipped_layers=0, + ), + vae=VaeField( + vae=ModelInfo( + model_name=model_name, + base_model=base_model, + model_type=model_type, + submodel=SubModelType.Vae, + ), + ), + ) + +class SDXLRefinerModelLoaderInvocation(BaseInvocation): + """Loads an sdxl refiner model, outputting its submodels.""" + type: Literal["sdxl_refiner_model_loader"] = "sdxl_refiner_model_loader" + + model: MainModelField = Field(description="The model to load") + # TODO: precision? + + # Schema customisation + class Config(InvocationConfig): + schema_extra = { + "ui": { + "title": "SDXL Refiner Model Loader", + "tags": ["model", "loader", "sdxl_refiner"], + "type_hints": {"model": "model"}, + }, + } + + def invoke(self, context: InvocationContext) -> SDXLRefinerModelLoaderOutput: + base_model = self.model.base_model + model_name = self.model.model_name + model_type = ModelType.Main + + # TODO: not found exceptions + if not context.services.model_manager.model_exists( + model_name=model_name, + base_model=base_model, + model_type=model_type, + ): + raise Exception(f"Unknown {base_model} {model_type} model: {model_name}") + + return SDXLRefinerModelLoaderOutput( + unet=UNetField( + unet=ModelInfo( + model_name=model_name, + base_model=base_model, + model_type=model_type, + submodel=SubModelType.UNet, + ), + scheduler=ModelInfo( + model_name=model_name, + base_model=base_model, + model_type=model_type, + submodel=SubModelType.Scheduler, + ), + loras=[], + ), + clip2=ClipField( + tokenizer=ModelInfo( + model_name=model_name, + base_model=base_model, + model_type=model_type, + submodel=SubModelType.Tokenizer2, + ), + text_encoder=ModelInfo( + model_name=model_name, + base_model=base_model, + model_type=model_type, + submodel=SubModelType.TextEncoder2, + ), + loras=[], + skipped_layers=0, + ), + vae=VaeField( + vae=ModelInfo( + model_name=model_name, + base_model=base_model, + model_type=model_type, + submodel=SubModelType.Vae, + ), + ), + ) + +# Text to image +class SDXLTextToLatentsInvocation(BaseInvocation): + """Generates latents from conditionings.""" + + type: Literal["t2l_sdxl"] = "t2l_sdxl" + + # Inputs + # fmt: off + positive_conditioning: Optional[ConditioningField] = Field(description="Positive conditioning for generation") + negative_conditioning: Optional[ConditioningField] = Field(description="Negative conditioning for generation") + noise: Optional[LatentsField] = Field(description="The noise to use") + steps: int = Field(default=10, gt=0, description="The number of steps to use to generate the image") + cfg_scale: Union[float, List[float]] = Field(default=7.5, ge=1, description="The Classifier-Free Guidance, higher values may result in a result closer to the prompt", ) + scheduler: SAMPLER_NAME_VALUES = Field(default="euler", description="The scheduler to use" ) + unet: UNetField = Field(default=None, description="UNet submodel") + denoising_end: float = Field(default=1.0, gt=0, le=1, description="") + #control: Union[ControlField, list[ControlField]] = Field(default=None, description="The control to use") + #seamless: bool = Field(default=False, description="Whether or not to generate an image that can tile without seams", ) + #seamless_axes: str = Field(default="", description="The axes to tile the image on, 'x' and/or 'y'") + # fmt: on + + @validator("cfg_scale") + def ge_one(cls, v): + """validate that all cfg_scale values are >= 1""" + if isinstance(v, list): + for i in v: + if i < 1: + raise ValueError('cfg_scale must be greater than 1') + else: + if v < 1: + raise ValueError('cfg_scale must be greater than 1') + return v + + # Schema customisation + class Config(InvocationConfig): + schema_extra = { + "ui": { + "title": "SDXL Text To Latents", + "tags": ["latents"], + "type_hints": { + "model": "model", + # "cfg_scale": "float", + "cfg_scale": "number" + } + }, + } + + # based on + # https://github.com/huggingface/diffusers/blob/3ebbaf7c96801271f9e6c21400033b6aa5ffcf29/src/diffusers/pipelines/stable_diffusion/pipeline_onnx_stable_diffusion.py#L375 + @torch.no_grad() + def invoke(self, context: InvocationContext) -> LatentsOutput: + latents = context.services.latents.get(self.noise.latents_name) + + positive_cond_data = context.services.latents.get(self.positive_conditioning.conditioning_name) + prompt_embeds = positive_cond_data.conditionings[0].embeds + pooled_prompt_embeds = positive_cond_data.conditionings[0].pooled_embeds + add_time_ids = positive_cond_data.conditionings[0].add_time_ids + + negative_cond_data = context.services.latents.get(self.negative_conditioning.conditioning_name) + negative_prompt_embeds = negative_cond_data.conditionings[0].embeds + negative_pooled_prompt_embeds = negative_cond_data.conditionings[0].pooled_embeds + add_neg_time_ids = negative_cond_data.conditionings[0].add_time_ids + + scheduler = get_scheduler( + context=context, + scheduler_info=self.unet.scheduler, + scheduler_name=self.scheduler, + ) + + num_inference_steps = self.steps + scheduler.set_timesteps(num_inference_steps) + timesteps = scheduler.timesteps + + latents = latents * scheduler.init_noise_sigma + + + unet_info = context.services.model_manager.get_model( + **self.unet.unet.dict() + ) + do_classifier_free_guidance = True + cross_attention_kwargs = None + with unet_info as unet: + + extra_step_kwargs = dict() + if "eta" in set(inspect.signature(scheduler.step).parameters.keys()): + extra_step_kwargs.update( + eta=0.0, + ) + if "generator" in set(inspect.signature(scheduler.step).parameters.keys()): + extra_step_kwargs.update( + generator=torch.Generator(device=unet.device).manual_seed(0), + ) + + num_warmup_steps = len(timesteps) - self.steps * scheduler.order + + # apply denoising_end + skipped_final_steps = int(round((1 - self.denoising_end) * self.steps)) + num_inference_steps = num_inference_steps - skipped_final_steps + timesteps = timesteps[: num_warmup_steps + scheduler.order * num_inference_steps] + + if not context.services.configuration.sequential_guidance: + prompt_embeds = torch.cat([negative_prompt_embeds, prompt_embeds], dim=0) + add_text_embeds = torch.cat([negative_pooled_prompt_embeds, pooled_prompt_embeds], dim=0) + add_time_ids = torch.cat([add_neg_time_ids, add_time_ids], dim=0) + + prompt_embeds = prompt_embeds.to(device=unet.device, dtype=unet.dtype) + add_text_embeds = add_text_embeds.to(device=unet.device, dtype=unet.dtype) + add_time_ids = add_time_ids.to(device=unet.device, dtype=unet.dtype) + latents = latents.to(device=unet.device, dtype=unet.dtype) + + with tqdm(total=num_inference_steps) as progress_bar: + for i, t in enumerate(timesteps): + # expand the latents if we are doing classifier free guidance + latent_model_input = torch.cat([latents] * 2) if do_classifier_free_guidance else latents + + latent_model_input = scheduler.scale_model_input(latent_model_input, t) + + # predict the noise residual + added_cond_kwargs = {"text_embeds": add_text_embeds, "time_ids": add_time_ids} + noise_pred = unet( + latent_model_input, + t, + encoder_hidden_states=prompt_embeds, + cross_attention_kwargs=cross_attention_kwargs, + added_cond_kwargs=added_cond_kwargs, + return_dict=False, + )[0] + + # perform guidance + if do_classifier_free_guidance: + noise_pred_uncond, noise_pred_text = noise_pred.chunk(2) + noise_pred = noise_pred_uncond + self.cfg_scale * (noise_pred_text - noise_pred_uncond) + #del noise_pred_uncond + #del noise_pred_text + + #if do_classifier_free_guidance and guidance_rescale > 0.0: + # # Based on 3.4. in https://arxiv.org/pdf/2305.08891.pdf + # noise_pred = rescale_noise_cfg(noise_pred, noise_pred_text, guidance_rescale=guidance_rescale) + + # compute the previous noisy sample x_t -> x_t-1 + latents = scheduler.step(noise_pred, t, latents, **extra_step_kwargs, return_dict=False)[0] + + # call the callback, if provided + if i == len(timesteps) - 1 or ((i + 1) > num_warmup_steps and (i + 1) % scheduler.order == 0): + progress_bar.update() + #if callback is not None and i % callback_steps == 0: + # callback(i, t, latents) + else: + negative_pooled_prompt_embeds = negative_pooled_prompt_embeds.to(device=unet.device, dtype=unet.dtype) + negative_prompt_embeds = negative_prompt_embeds.to(device=unet.device, dtype=unet.dtype) + add_neg_time_ids = add_neg_time_ids.to(device=unet.device, dtype=unet.dtype) + pooled_prompt_embeds = pooled_prompt_embeds.to(device=unet.device, dtype=unet.dtype) + prompt_embeds = prompt_embeds.to(device=unet.device, dtype=unet.dtype) + add_time_ids = add_time_ids.to(device=unet.device, dtype=unet.dtype) + latents = latents.to(device=unet.device, dtype=unet.dtype) + + with tqdm(total=num_inference_steps) as progress_bar: + for i, t in enumerate(timesteps): + # expand the latents if we are doing classifier free guidance + #latent_model_input = torch.cat([latents] * 2) if do_classifier_free_guidance else latents + + latent_model_input = scheduler.scale_model_input(latents, t) + + #import gc + #gc.collect() + #torch.cuda.empty_cache() + + # predict the noise residual + + added_cond_kwargs = {"text_embeds": negative_pooled_prompt_embeds, "time_ids": add_neg_time_ids} + noise_pred_uncond = unet( + latent_model_input, + t, + encoder_hidden_states=negative_prompt_embeds, + cross_attention_kwargs=cross_attention_kwargs, + added_cond_kwargs=added_cond_kwargs, + return_dict=False, + )[0] + + added_cond_kwargs = {"text_embeds": pooled_prompt_embeds, "time_ids": add_time_ids} + noise_pred_text = unet( + latent_model_input, + t, + encoder_hidden_states=prompt_embeds, + cross_attention_kwargs=cross_attention_kwargs, + added_cond_kwargs=added_cond_kwargs, + return_dict=False, + )[0] + + # perform guidance + noise_pred = noise_pred_uncond + self.cfg_scale * (noise_pred_text - noise_pred_uncond) + + #del noise_pred_text + #del noise_pred_uncond + #import gc + #gc.collect() + #torch.cuda.empty_cache() + + #if do_classifier_free_guidance and guidance_rescale > 0.0: + # # Based on 3.4. in https://arxiv.org/pdf/2305.08891.pdf + # noise_pred = rescale_noise_cfg(noise_pred, noise_pred_text, guidance_rescale=guidance_rescale) + + # compute the previous noisy sample x_t -> x_t-1 + latents = scheduler.step(noise_pred, t, latents, **extra_step_kwargs, return_dict=False)[0] + + #del noise_pred + #import gc + #gc.collect() + #torch.cuda.empty_cache() + + # call the callback, if provided + if i == len(timesteps) - 1 or ((i + 1) > num_warmup_steps and (i + 1) % scheduler.order == 0): + progress_bar.update() + #if callback is not None and i % callback_steps == 0: + # callback(i, t, latents) + + + + ################# + + latents = latents.to("cpu") + torch.cuda.empty_cache() + + name = f'{context.graph_execution_state_id}__{self.id}' + context.services.latents.save(name, latents) + return build_latents_output(latents_name=name, latents=latents) + +class SDXLLatentsToLatentsInvocation(BaseInvocation): + """Generates latents from conditionings.""" + + type: Literal["l2l_sdxl"] = "l2l_sdxl" + + # Inputs + # fmt: off + positive_conditioning: Optional[ConditioningField] = Field(description="Positive conditioning for generation") + negative_conditioning: Optional[ConditioningField] = Field(description="Negative conditioning for generation") + noise: Optional[LatentsField] = Field(description="The noise to use") + steps: int = Field(default=10, gt=0, description="The number of steps to use to generate the image") + cfg_scale: Union[float, List[float]] = Field(default=7.5, ge=1, description="The Classifier-Free Guidance, higher values may result in a result closer to the prompt", ) + scheduler: SAMPLER_NAME_VALUES = Field(default="euler", description="The scheduler to use" ) + unet: UNetField = Field(default=None, description="UNet submodel") + latents: Optional[LatentsField] = Field(description="Initial latents") + + denoising_start: float = Field(default=0.0, ge=0, lt=1, description="") + denoising_end: float = Field(default=1.0, gt=0, le=1, description="") + + #control: Union[ControlField, list[ControlField]] = Field(default=None, description="The control to use") + #seamless: bool = Field(default=False, description="Whether or not to generate an image that can tile without seams", ) + #seamless_axes: str = Field(default="", description="The axes to tile the image on, 'x' and/or 'y'") + # fmt: on + + @validator("cfg_scale") + def ge_one(cls, v): + """validate that all cfg_scale values are >= 1""" + if isinstance(v, list): + for i in v: + if i < 1: + raise ValueError('cfg_scale must be greater than 1') + else: + if v < 1: + raise ValueError('cfg_scale must be greater than 1') + return v + + # Schema customisation + class Config(InvocationConfig): + schema_extra = { + "ui": { + "title": "SDXL Latents to Latents", + "tags": ["latents"], + "type_hints": { + "model": "model", + # "cfg_scale": "float", + "cfg_scale": "number" + } + }, + } + + # based on + # https://github.com/huggingface/diffusers/blob/3ebbaf7c96801271f9e6c21400033b6aa5ffcf29/src/diffusers/pipelines/stable_diffusion/pipeline_onnx_stable_diffusion.py#L375 + @torch.no_grad() + def invoke(self, context: InvocationContext) -> LatentsOutput: + latents = context.services.latents.get(self.latents.latents_name) + + positive_cond_data = context.services.latents.get(self.positive_conditioning.conditioning_name) + prompt_embeds = positive_cond_data.conditionings[0].embeds + pooled_prompt_embeds = positive_cond_data.conditionings[0].pooled_embeds + add_time_ids = positive_cond_data.conditionings[0].add_time_ids + + negative_cond_data = context.services.latents.get(self.negative_conditioning.conditioning_name) + negative_prompt_embeds = negative_cond_data.conditionings[0].embeds + negative_pooled_prompt_embeds = negative_cond_data.conditionings[0].pooled_embeds + add_neg_time_ids = negative_cond_data.conditionings[0].add_time_ids + + scheduler = get_scheduler( + context=context, + scheduler_info=self.unet.scheduler, + scheduler_name=self.scheduler, + ) + + # apply denoising_start + num_inference_steps = self.steps + scheduler.set_timesteps(num_inference_steps) + + t_start = int(round(self.denoising_start * num_inference_steps)) + timesteps = scheduler.timesteps[t_start * scheduler.order:] + num_inference_steps = num_inference_steps - t_start + + # apply noise(if provided) + if self.noise is not None: + noise = context.services.latents.get(self.noise.latents_name) + latents = scheduler.add_noise(latents, noise, timesteps[:1]) + del noise + + unet_info = context.services.model_manager.get_model( + **self.unet.unet.dict() + ) + do_classifier_free_guidance = True + cross_attention_kwargs = None + with unet_info as unet: + + # apply scheduler extra args + extra_step_kwargs = dict() + if "eta" in set(inspect.signature(scheduler.step).parameters.keys()): + extra_step_kwargs.update( + eta=0.0, + ) + if "generator" in set(inspect.signature(scheduler.step).parameters.keys()): + extra_step_kwargs.update( + generator=torch.Generator(device=unet.device).manual_seed(0), + ) + + num_warmup_steps = max(len(timesteps) - num_inference_steps * scheduler.order, 0) + + # apply denoising_end + skipped_final_steps = int(round((1 - self.denoising_end) * self.steps)) + num_inference_steps = num_inference_steps - skipped_final_steps + timesteps = timesteps[: num_warmup_steps + scheduler.order * num_inference_steps] + + if not context.services.configuration.sequential_guidance: + prompt_embeds = torch.cat([negative_prompt_embeds, prompt_embeds], dim=0) + add_text_embeds = torch.cat([negative_pooled_prompt_embeds, pooled_prompt_embeds], dim=0) + add_time_ids = torch.cat([add_neg_time_ids, add_time_ids], dim=0) + + prompt_embeds = prompt_embeds.to(device=unet.device, dtype=unet.dtype) + add_text_embeds = add_text_embeds.to(device=unet.device, dtype=unet.dtype) + add_time_ids = add_time_ids.to(device=unet.device, dtype=unet.dtype) + latents = latents.to(device=unet.device, dtype=unet.dtype) + + with tqdm(total=num_inference_steps) as progress_bar: + for i, t in enumerate(timesteps): + # expand the latents if we are doing classifier free guidance + latent_model_input = torch.cat([latents] * 2) if do_classifier_free_guidance else latents + + latent_model_input = scheduler.scale_model_input(latent_model_input, t) + + # predict the noise residual + added_cond_kwargs = {"text_embeds": add_text_embeds, "time_ids": add_time_ids} + noise_pred = unet( + latent_model_input, + t, + encoder_hidden_states=prompt_embeds, + cross_attention_kwargs=cross_attention_kwargs, + added_cond_kwargs=added_cond_kwargs, + return_dict=False, + )[0] + + # perform guidance + if do_classifier_free_guidance: + noise_pred_uncond, noise_pred_text = noise_pred.chunk(2) + noise_pred = noise_pred_uncond + self.cfg_scale * (noise_pred_text - noise_pred_uncond) + #del noise_pred_uncond + #del noise_pred_text + + #if do_classifier_free_guidance and guidance_rescale > 0.0: + # # Based on 3.4. in https://arxiv.org/pdf/2305.08891.pdf + # noise_pred = rescale_noise_cfg(noise_pred, noise_pred_text, guidance_rescale=guidance_rescale) + + # compute the previous noisy sample x_t -> x_t-1 + latents = scheduler.step(noise_pred, t, latents, **extra_step_kwargs, return_dict=False)[0] + + # call the callback, if provided + if i == len(timesteps) - 1 or ((i + 1) > num_warmup_steps and (i + 1) % scheduler.order == 0): + progress_bar.update() + #if callback is not None and i % callback_steps == 0: + # callback(i, t, latents) + else: + negative_pooled_prompt_embeds = negative_pooled_prompt_embeds.to(device=unet.device, dtype=unet.dtype) + negative_prompt_embeds = negative_prompt_embeds.to(device=unet.device, dtype=unet.dtype) + add_neg_time_ids = add_neg_time_ids.to(device=unet.device, dtype=unet.dtype) + pooled_prompt_embeds = pooled_prompt_embeds.to(device=unet.device, dtype=unet.dtype) + prompt_embeds = prompt_embeds.to(device=unet.device, dtype=unet.dtype) + add_time_ids = add_time_ids.to(device=unet.device, dtype=unet.dtype) + latents = latents.to(device=unet.device, dtype=unet.dtype) + + with tqdm(total=num_inference_steps) as progress_bar: + for i, t in enumerate(timesteps): + # expand the latents if we are doing classifier free guidance + #latent_model_input = torch.cat([latents] * 2) if do_classifier_free_guidance else latents + + latent_model_input = scheduler.scale_model_input(latents, t) + + #import gc + #gc.collect() + #torch.cuda.empty_cache() + + # predict the noise residual + + added_cond_kwargs = {"text_embeds": negative_pooled_prompt_embeds, "time_ids": add_time_ids} + noise_pred_uncond = unet( + latent_model_input, + t, + encoder_hidden_states=negative_prompt_embeds, + cross_attention_kwargs=cross_attention_kwargs, + added_cond_kwargs=added_cond_kwargs, + return_dict=False, + )[0] + + added_cond_kwargs = {"text_embeds": pooled_prompt_embeds, "time_ids": add_time_ids} + noise_pred_text = unet( + latent_model_input, + t, + encoder_hidden_states=prompt_embeds, + cross_attention_kwargs=cross_attention_kwargs, + added_cond_kwargs=added_cond_kwargs, + return_dict=False, + )[0] + + # perform guidance + noise_pred = noise_pred_uncond + self.cfg_scale * (noise_pred_text - noise_pred_uncond) + + #del noise_pred_text + #del noise_pred_uncond + #import gc + #gc.collect() + #torch.cuda.empty_cache() + + #if do_classifier_free_guidance and guidance_rescale > 0.0: + # # Based on 3.4. in https://arxiv.org/pdf/2305.08891.pdf + # noise_pred = rescale_noise_cfg(noise_pred, noise_pred_text, guidance_rescale=guidance_rescale) + + # compute the previous noisy sample x_t -> x_t-1 + latents = scheduler.step(noise_pred, t, latents, **extra_step_kwargs, return_dict=False)[0] + + #del noise_pred + #import gc + #gc.collect() + #torch.cuda.empty_cache() + + # call the callback, if provided + if i == len(timesteps) - 1 or ((i + 1) > num_warmup_steps and (i + 1) % scheduler.order == 0): + progress_bar.update() + #if callback is not None and i % callback_steps == 0: + # callback(i, t, latents) + + + + ################# + + latents = latents.to("cpu") + torch.cuda.empty_cache() + + name = f'{context.graph_execution_state_id}__{self.id}' + context.services.latents.save(name, latents) + return build_latents_output(latents_name=name, latents=latents) diff --git a/invokeai/app/invocations/upscale.py b/invokeai/app/invocations/upscale.py index 15497343ae..1a45a631df 100644 --- a/invokeai/app/invocations/upscale.py +++ b/invokeai/app/invocations/upscale.py @@ -1,48 +1,119 @@ -# Copyright (c) 2022 Kyle Schouviller (https://github.com/kyle0654) - -from typing import Literal, Optional +# Copyright (c) 2022 Kyle Schouviller (https://github.com/kyle0654) & the InvokeAI Team +from pathlib import Path +from typing import Literal, Union +import cv2 as cv +import numpy as np +from basicsr.archs.rrdbnet_arch import RRDBNet +from PIL import Image from pydantic import Field +from realesrgan import RealESRGANer from invokeai.app.models.image import ImageCategory, ImageField, ResourceOrigin -from .baseinvocation import BaseInvocation, InvocationContext, InvocationConfig + +from .baseinvocation import BaseInvocation, InvocationConfig, InvocationContext from .image import ImageOutput +# TODO: Populate this from disk? +# TODO: Use model manager to load? +ESRGAN_MODELS = Literal[ + "RealESRGAN_x4plus.pth", + "RealESRGAN_x4plus_anime_6B.pth", + "ESRGAN_SRx4_DF2KOST_official-ff704c30.pth", + "RealESRGAN_x2plus.pth", +] -class UpscaleInvocation(BaseInvocation): - """Upscales an image.""" - # fmt: off - type: Literal["upscale"] = "upscale" +class ESRGANInvocation(BaseInvocation): + """Upscales an image using RealESRGAN.""" - # Inputs - image: Optional[ImageField] = Field(description="The input image", default=None) - strength: float = Field(default=0.75, gt=0, le=1, description="The strength") - level: Literal[2, 4] = Field(default=2, description="The upscale level") - # fmt: on + type: Literal["esrgan"] = "esrgan" + image: Union[ImageField, None] = Field(default=None, description="The input image") + model_name: ESRGAN_MODELS = Field( + default="RealESRGAN_x4plus.pth", description="The Real-ESRGAN model to use" + ) - # Schema customisation class Config(InvocationConfig): schema_extra = { "ui": { - "tags": ["upscaling", "image"], + "title": "Upscale (RealESRGAN)", + "tags": ["image", "upscale", "realesrgan"] }, } def invoke(self, context: InvocationContext) -> ImageOutput: image = context.services.images.get_pil_image(self.image.image_name) - results = context.services.restoration.upscale_and_reconstruct( - image_list=[[image, 0]], - upscale=(self.level, self.strength), - strength=0.0, # GFPGAN strength - save_original=False, - image_callback=None, + models_path = context.services.configuration.models_path + + rrdbnet_model = None + netscale = None + esrgan_model_path = None + + if self.model_name in [ + "RealESRGAN_x4plus.pth", + "ESRGAN_SRx4_DF2KOST_official-ff704c30.pth", + ]: + # x4 RRDBNet model + rrdbnet_model = RRDBNet( + num_in_ch=3, + num_out_ch=3, + num_feat=64, + num_block=23, + num_grow_ch=32, + scale=4, + ) + netscale = 4 + elif self.model_name in ["RealESRGAN_x4plus_anime_6B.pth"]: + # x4 RRDBNet model, 6 blocks + rrdbnet_model = RRDBNet( + num_in_ch=3, + num_out_ch=3, + num_feat=64, + num_block=6, # 6 blocks + num_grow_ch=32, + scale=4, + ) + netscale = 4 + elif self.model_name in ["RealESRGAN_x2plus.pth"]: + # x2 RRDBNet model + rrdbnet_model = RRDBNet( + num_in_ch=3, + num_out_ch=3, + num_feat=64, + num_block=23, + num_grow_ch=32, + scale=2, + ) + netscale = 2 + else: + msg = f"Invalid RealESRGAN model: {self.model_name}" + context.services.logger.error(msg) + raise ValueError(msg) + + esrgan_model_path = Path(f"core/upscaling/realesrgan/{self.model_name}") + + upsampler = RealESRGANer( + scale=netscale, + model_path=str(models_path / esrgan_model_path), + model=rrdbnet_model, + half=False, ) - # Results are image and seed, unwrap for now - # TODO: can this return multiple results? + # prepare image - Real-ESRGAN uses cv2 internally, and cv2 uses BGR vs RGB for PIL + cv_image = cv.cvtColor(np.array(image.convert("RGB")), cv.COLOR_RGB2BGR) + + # We can pass an `outscale` value here, but it just resizes the image by that factor after + # upscaling, so it's kinda pointless for our purposes. If you want something other than 4x + # upscaling, you'll need to add a resize node after this one. + upscaled_image, img_mode = upsampler.enhance(cv_image) + + # back to PIL + pil_image = Image.fromarray( + cv.cvtColor(upscaled_image, cv.COLOR_BGR2RGB) + ).convert("RGBA") + image_dto = context.services.images.create( - image=results[0][0], + image=pil_image, image_origin=ResourceOrigin.INTERNAL, image_category=ImageCategory.GENERAL, node_id=self.id, diff --git a/invokeai/app/services/config.py b/invokeai/app/services/config.py index 6d27c013f1..0a70c1dd5d 100644 --- a/invokeai/app/services/config.py +++ b/invokeai/app/services/config.py @@ -200,7 +200,7 @@ class InvokeAISettings(BaseSettings): type = get_args(get_type_hints(cls)['type'])[0] field_dict = dict({type:dict()}) for name,field in self.__fields__.items(): - if name in cls._excluded(): + if name in cls._excluded_from_yaml(): continue category = field.field_info.extra.get("category") or "Uncategorized" value = getattr(self,name) @@ -271,8 +271,13 @@ class InvokeAISettings(BaseSettings): @classmethod def _excluded(self)->List[str]: - # combination of deprecated parameters and internal ones - return ['type','initconf', 'gpu_mem_reserved', 'max_loaded_models', 'version'] + # internal fields that shouldn't be exposed as command line options + return ['type','initconf'] + + @classmethod + def _excluded_from_yaml(self)->List[str]: + # combination of deprecated parameters and internal ones that shouldn't be exposed as invokeai.yaml options + return ['type','initconf', 'gpu_mem_reserved', 'max_loaded_models', 'version', 'from_file', 'model', 'restore'] class Config: env_file_encoding = 'utf-8' @@ -361,7 +366,7 @@ setting environment variables INVOKEAI_. log_tokenization : bool = Field(default=False, description="Enable logging of parsed prompt tokens.", category='Features') nsfw_checker : bool = Field(default=True, description="Enable/disable the NSFW checker", category='Features') patchmatch : bool = Field(default=True, description="Enable/disable patchmatch inpaint code", category='Features') - restore : bool = Field(default=True, description="Enable/disable face restoration code", category='Features') + restore : bool = Field(default=True, description="Enable/disable face restoration code (DEPRECATED)", category='DEPRECATED') always_use_cpu : bool = Field(default=False, description="If true, use the CPU for rendering even if a GPU is available.", category='Memory/Performance') free_gpu_mem : bool = Field(default=False, description="If true, purge model from GPU after each generation.", category='Memory/Performance') diff --git a/invokeai/app/services/events.py b/invokeai/app/services/events.py index 6c516c9b74..30d1b5e7a9 100644 --- a/invokeai/app/services/events.py +++ b/invokeai/app/services/events.py @@ -105,8 +105,6 @@ class EventServiceBase: def emit_model_load_started ( self, graph_execution_state_id: str, - node: dict, - source_node_id: str, model_name: str, base_model: BaseModelType, model_type: ModelType, @@ -117,8 +115,6 @@ class EventServiceBase: event_name="model_load_started", payload=dict( graph_execution_state_id=graph_execution_state_id, - node=node, - source_node_id=source_node_id, model_name=model_name, base_model=base_model, model_type=model_type, @@ -129,8 +125,6 @@ class EventServiceBase: def emit_model_load_completed( self, graph_execution_state_id: str, - node: dict, - source_node_id: str, model_name: str, base_model: BaseModelType, model_type: ModelType, @@ -142,12 +136,12 @@ class EventServiceBase: event_name="model_load_completed", payload=dict( graph_execution_state_id=graph_execution_state_id, - node=node, - source_node_id=source_node_id, model_name=model_name, base_model=base_model, model_type=model_type, submodel=submodel, - model_info=model_info, + hash=model_info.hash, + location=model_info.location, + precision=str(model_info.precision), ), ) diff --git a/invokeai/app/services/invocation_services.py b/invokeai/app/services/invocation_services.py index 4e1da3b040..8af17c7643 100644 --- a/invokeai/app/services/invocation_services.py +++ b/invokeai/app/services/invocation_services.py @@ -10,10 +10,9 @@ if TYPE_CHECKING: from invokeai.app.services.model_manager_service import ModelManagerServiceBase from invokeai.app.services.events import EventServiceBase from invokeai.app.services.latent_storage import LatentsStorageBase - from invokeai.app.services.restoration_services import RestorationServices from invokeai.app.services.invocation_queue import InvocationQueueABC from invokeai.app.services.item_storage import ItemStorageABC - from invokeai.app.services.config import InvokeAISettings + from invokeai.app.services.config import InvokeAIAppConfig from invokeai.app.services.graph import GraphExecutionState, LibraryGraph from invokeai.app.services.invoker import InvocationProcessorABC @@ -24,7 +23,7 @@ class InvocationServices: # TODO: Just forward-declared everything due to circular dependencies. Fix structure. board_images: "BoardImagesServiceABC" boards: "BoardServiceABC" - configuration: "InvokeAISettings" + configuration: "InvokeAIAppConfig" events: "EventServiceBase" graph_execution_manager: "ItemStorageABC"["GraphExecutionState"] graph_library: "ItemStorageABC"["LibraryGraph"] @@ -34,13 +33,12 @@ class InvocationServices: model_manager: "ModelManagerServiceBase" processor: "InvocationProcessorABC" queue: "InvocationQueueABC" - restoration: "RestorationServices" def __init__( self, board_images: "BoardImagesServiceABC", boards: "BoardServiceABC", - configuration: "InvokeAISettings", + configuration: "InvokeAIAppConfig", events: "EventServiceBase", graph_execution_manager: "ItemStorageABC"["GraphExecutionState"], graph_library: "ItemStorageABC"["LibraryGraph"], @@ -50,7 +48,6 @@ class InvocationServices: model_manager: "ModelManagerServiceBase", processor: "InvocationProcessorABC", queue: "InvocationQueueABC", - restoration: "RestorationServices", ): self.board_images = board_images self.boards = boards @@ -65,4 +62,3 @@ class InvocationServices: self.model_manager = model_manager self.processor = processor self.queue = queue - self.restoration = restoration diff --git a/invokeai/app/services/model_manager_service.py b/invokeai/app/services/model_manager_service.py index 1b1c43dc11..37a497aa5d 100644 --- a/invokeai/app/services/model_manager_service.py +++ b/invokeai/app/services/model_manager_service.py @@ -18,8 +18,9 @@ from invokeai.backend.model_management import ( SchedulerPredictionType, ModelMerger, MergeInterpolationMethod, + ModelNotFoundException, ) - +from invokeai.backend.model_management.model_search import FindModels import torch from invokeai.app.models.exceptions import CanceledException @@ -145,7 +146,7 @@ class ModelManagerServiceBase(ABC): ) -> AddModelResult: """ Update the named model with a dictionary of attributes. Will fail with a - KeyErrorException if the name does not already exist. + ModelNotFoundException if the name does not already exist. On a successful update, the config will be changed in memory. Will fail with an assertion error if provided attributes are incorrect or @@ -167,6 +168,27 @@ class ModelManagerServiceBase(ABC): """ pass + @abstractmethod + def rename_model(self, + model_name: str, + base_model: BaseModelType, + model_type: ModelType, + new_name: str, + ): + """ + Rename the indicated model. + """ + pass + + @abstractmethod + def list_checkpoint_configs( + self + )->List[Path]: + """ + List the checkpoint config paths from ROOT/configs/stable-diffusion. + """ + pass + @abstractmethod def convert_model( self, @@ -220,6 +242,7 @@ class ModelManagerServiceBase(ABC): alpha: Optional[float] = 0.5, interp: Optional[MergeInterpolationMethod] = None, force: Optional[bool] = False, + merge_dest_directory: Optional[Path] = None ) -> AddModelResult: """ Merge two to three diffusrs pipeline models and save as a new model. @@ -228,9 +251,26 @@ class ModelManagerServiceBase(ABC): :param merged_model_name: Name of destination merged model :param alpha: Alpha strength to apply to 2d and 3d model :param interp: Interpolation method. None (default) + :param merge_dest_directory: Save the merged model to the designated directory (with 'merged_model_name' appended) """ pass - + + @abstractmethod + def search_for_models(self, directory: Path)->List[Path]: + """ + Return list of all models found in the designated directory. + """ + pass + + @abstractmethod + def sync_to_config(self): + """ + Re-read models.yaml, rescan the models directory, and reimport models + in the autoimport directories. Call after making changes outside the + model manager API. + """ + pass + @abstractmethod def commit(self, conf_file: Optional[Path] = None) -> None: """ @@ -299,7 +339,6 @@ class ModelManagerService(ModelManagerServiceBase): base_model: BaseModelType, model_type: ModelType, submodel: Optional[SubModelType] = None, - node: Optional[BaseInvocation] = None, context: Optional[InvocationContext] = None, ) -> ModelInfo: """ @@ -307,11 +346,9 @@ class ModelManagerService(ModelManagerServiceBase): part (such as the vae) of a diffusers mode. """ - # if we are called from within a node, then we get to emit - # load start and complete events - if node and context: + # we can emit model loading events if we are executing with access to the invocation context + if context: self._emit_load_event( - node=node, context=context, model_name=model_name, base_model=base_model, @@ -326,9 +363,8 @@ class ModelManagerService(ModelManagerServiceBase): submodel, ) - if node and context: + if context: self._emit_load_event( - node=node, context=context, model_name=model_name, base_model=base_model, @@ -412,14 +448,14 @@ class ModelManagerService(ModelManagerServiceBase): ) -> AddModelResult: """ Update the named model with a dictionary of attributes. Will fail with a - KeyError exception if the name does not already exist. + ModelNotFoundException exception if the name does not already exist. On a successful update, the config will be changed in memory. Will fail with an assertion error if provided attributes are incorrect or the model name is missing. Call commit() to write changes to disk. """ self.logger.debug(f'update model {model_name}') if not self.model_exists(model_name, base_model, model_type): - raise KeyError(f"Unknown model {model_name}") + raise ModelNotFoundException(f"Unknown model {model_name}") return self.add_model(model_name, base_model, model_type, model_attributes, clobber=True) def del_model( @@ -431,16 +467,18 @@ class ModelManagerService(ModelManagerServiceBase): """ Delete the named model from configuration. If delete_files is true, then the underlying weight file or diffusers directory will be deleted - as well. Call commit() to write to disk. + as well. """ self.logger.debug(f'delete model {model_name}') self.mgr.del_model(model_name, base_model, model_type) + self.mgr.commit() def convert_model( self, model_name: str, base_model: BaseModelType, model_type: Union[ModelType.Main,ModelType.Vae], + convert_dest_directory: Optional[Path] = Field(default=None, description="Optional directory location for merged model"), ) -> AddModelResult: """ Convert a checkpoint file into a diffusers folder, deleting the cached @@ -449,13 +487,14 @@ class ModelManagerService(ModelManagerServiceBase): :param model_name: Name of the model to convert :param base_model: Base model type :param model_type: Type of model ['vae' or 'main'] + :param convert_dest_directory: Save the converted model to the designated directory (`models/etc/etc` by default) This will raise a ValueError unless the model is not a checkpoint. It will also raise a ValueError in the event that there is a similarly-named diffusers directory already in place. """ self.logger.debug(f'convert model {model_name}') - return self.mgr.convert_model(model_name, base_model, model_type) + return self.mgr.convert_model(model_name, base_model, model_type, convert_dest_directory) def commit(self, conf_file: Optional[Path]=None): """ @@ -467,23 +506,19 @@ class ModelManagerService(ModelManagerServiceBase): def _emit_load_event( self, - node, context, model_name: str, base_model: BaseModelType, model_type: ModelType, - submodel: SubModelType, + submodel: Optional[SubModelType] = None, model_info: Optional[ModelInfo] = None, ): if context.services.queue.is_canceled(context.graph_execution_state_id): raise CanceledException() - graph_execution_state = context.services.graph_execution_manager.get(context.graph_execution_state_id) - source_node_id = graph_execution_state.prepared_source_mapping[node.id] + if model_info: context.services.events.emit_model_load_completed( graph_execution_state_id=context.graph_execution_state_id, - node=node.dict(), - source_node_id=source_node_id, model_name=model_name, base_model=base_model, model_type=model_type, @@ -493,8 +528,6 @@ class ModelManagerService(ModelManagerServiceBase): else: context.services.events.emit_model_load_started( graph_execution_state_id=context.graph_execution_state_id, - node=node.dict(), - source_node_id=source_node_id, model_name=model_name, base_model=base_model, model_type=model_type, @@ -536,6 +569,7 @@ class ModelManagerService(ModelManagerServiceBase): alpha: Optional[float] = 0.5, interp: Optional[MergeInterpolationMethod] = None, force: Optional[bool] = False, + merge_dest_directory: Optional[Path] = Field(default=None, description="Optional directory location for merged model"), ) -> AddModelResult: """ Merge two to three diffusrs pipeline models and save as a new model. @@ -544,6 +578,7 @@ class ModelManagerService(ModelManagerServiceBase): :param merged_model_name: Name of destination merged model :param alpha: Alpha strength to apply to 2d and 3d model :param interp: Interpolation method. None (default) + :param merge_dest_directory: Save the merged model to the designated directory (with 'merged_model_name' appended) """ merger = ModelMerger(self.mgr) try: @@ -554,7 +589,55 @@ class ModelManagerService(ModelManagerServiceBase): alpha = alpha, interp = interp, force = force, + merge_dest_directory=merge_dest_directory, ) except AssertionError as e: raise ValueError(e) return result + + def search_for_models(self, directory: Path)->List[Path]: + """ + Return list of all models found in the designated directory. + """ + search = FindModels(directory,self.logger) + return search.list_models() + + def sync_to_config(self): + """ + Re-read models.yaml, rescan the models directory, and reimport models + in the autoimport directories. Call after making changes outside the + model manager API. + """ + return self.mgr.sync_to_config() + + def list_checkpoint_configs(self)->List[Path]: + """ + List the checkpoint config paths from ROOT/configs/stable-diffusion. + """ + config = self.mgr.app_config + conf_path = config.legacy_conf_path + root_path = config.root_path + return [(conf_path / x).relative_to(root_path) for x in conf_path.glob('**/*.yaml')] + + def rename_model(self, + model_name: str, + base_model: BaseModelType, + model_type: ModelType, + new_name: str = None, + new_base: BaseModelType = None, + ): + """ + Rename the indicated model. Can provide a new name and/or a new base. + :param model_name: Current name of the model + :param base_model: Current base of the model + :param model_type: Model type (can't be changed) + :param new_name: New name for the model + :param new_base: New base for the model + """ + self.mgr.rename_model(base_model = base_model, + model_type = model_type, + model_name = model_name, + new_name = new_name, + new_base = new_base, + ) + diff --git a/invokeai/app/services/restoration_services.py b/invokeai/app/services/restoration_services.py deleted file mode 100644 index 5ff0195ca5..0000000000 --- a/invokeai/app/services/restoration_services.py +++ /dev/null @@ -1,113 +0,0 @@ -import sys -import traceback -import torch -from typing import types -from ...backend.restoration import Restoration -from ...backend.util import choose_torch_device, CPU_DEVICE, MPS_DEVICE - -# This should be a real base class for postprocessing functions, -# but right now we just instantiate the existing gfpgan, esrgan -# and codeformer functions. -class RestorationServices: - '''Face restoration and upscaling''' - - def __init__(self,args,logger:types.ModuleType): - try: - gfpgan, codeformer, esrgan = None, None, None - if args.restore or args.esrgan: - restoration = Restoration() - # TODO: redo for new model structure - if False and args.restore: - gfpgan, codeformer = restoration.load_face_restore_models( - args.gfpgan_model_path - ) - else: - logger.info("Face restoration disabled") - if False and args.esrgan: - esrgan = restoration.load_esrgan(args.esrgan_bg_tile) - else: - logger.info("Upscaling disabled") - else: - logger.info("Face restoration and upscaling disabled") - except (ModuleNotFoundError, ImportError): - print(traceback.format_exc(), file=sys.stderr) - logger.info("You may need to install the ESRGAN and/or GFPGAN modules") - self.device = torch.device(choose_torch_device()) - self.gfpgan = gfpgan - self.codeformer = codeformer - self.esrgan = esrgan - self.logger = logger - self.logger.info('Face restoration initialized') - - # note that this one method does gfpgan and codepath reconstruction, as well as - # esrgan upscaling - # TO DO: refactor into separate methods - def upscale_and_reconstruct( - self, - image_list, - facetool="gfpgan", - upscale=None, - upscale_denoise_str=0.75, - strength=0.0, - codeformer_fidelity=0.75, - save_original=False, - image_callback=None, - prefix=None, - ): - results = [] - for r in image_list: - image, seed = r - try: - if strength > 0: - if self.gfpgan is not None or self.codeformer is not None: - if facetool == "gfpgan": - if self.gfpgan is None: - self.logger.info( - "GFPGAN not found. Face restoration is disabled." - ) - else: - image = self.gfpgan.process(image, strength, seed) - if facetool == "codeformer": - if self.codeformer is None: - self.logger.info( - "CodeFormer not found. Face restoration is disabled." - ) - else: - cf_device = ( - CPU_DEVICE if self.device == MPS_DEVICE else self.device - ) - image = self.codeformer.process( - image=image, - strength=strength, - device=cf_device, - seed=seed, - fidelity=codeformer_fidelity, - ) - else: - self.logger.info("Face Restoration is disabled.") - if upscale is not None: - if self.esrgan is not None: - if len(upscale) < 2: - upscale.append(0.75) - image = self.esrgan.process( - image, - upscale[1], - seed, - int(upscale[0]), - denoise_str=upscale_denoise_str, - ) - else: - self.logger.info("ESRGAN is disabled. Image not upscaled.") - except Exception as e: - self.logger.info( - f"Error running RealESRGAN or GFPGAN. Your image was not upscaled.\n{e}" - ) - - if image_callback is not None: - image_callback(image, seed, upscaled=True, use_prefix=prefix) - else: - r[0] = image - - results.append([image, seed]) - - return results diff --git a/invokeai/backend/install/invokeai_configure.py b/invokeai/backend/install/invokeai_configure.py index adc985c655..49c16bf801 100755 --- a/invokeai/backend/install/invokeai_configure.py +++ b/invokeai/backend/install/invokeai_configure.py @@ -30,8 +30,6 @@ from huggingface_hub import login as hf_hub_login from omegaconf import OmegaConf from tqdm import tqdm from transformers import ( - AutoProcessor, - CLIPSegForImageSegmentation, CLIPTextModel, CLIPTokenizer, AutoFeatureExtractor, @@ -45,7 +43,6 @@ from invokeai.app.services.config import ( from invokeai.backend.util.logging import InvokeAILogger from invokeai.frontend.install.model_install import addModelsForm, process_and_execute from invokeai.frontend.install.widgets import ( - SingleSelectColumns, CenteredButtonPress, IntTitleSlider, set_min_terminal_size, @@ -72,7 +69,6 @@ transformers.logging.set_verbosity_error() config = InvokeAIAppConfig.get_config() Model_dir = "models" -Weights_dir = "ldm/stable-diffusion-v1/" Default_config_file = config.model_conf_path SD_Configs = config.legacy_conf_path @@ -226,64 +222,35 @@ def download_conversion_models(): # --------------------------------------------- def download_realesrgan(): - logger.info("Installing models from RealESRGAN...") - model_url = "https://github.com/xinntao/Real-ESRGAN/releases/download/v0.2.5.0/realesr-general-x4v3.pth" - wdn_model_url = "https://github.com/xinntao/Real-ESRGAN/releases/download/v0.2.5.0/realesr-general-wdn-x4v3.pth" - - model_dest = config.root_path / "models/core/upscaling/realesrgan/realesr-general-x4v3.pth" - wdn_model_dest = config.root_path / "models/core/upscaling/realesrgan/realesr-general-wdn-x4v3.pth" - - download_with_progress_bar(model_url, str(model_dest), "RealESRGAN") - download_with_progress_bar(wdn_model_url, str(wdn_model_dest), "RealESRGANwdn") - - -def download_gfpgan(): - logger.info("Installing GFPGAN models...") - for model in ( - [ - "https://github.com/TencentARC/GFPGAN/releases/download/v1.3.0/GFPGANv1.4.pth", - "./models/core/face_restoration/gfpgan/GFPGANv1.4.pth", - ], - [ - "https://github.com/xinntao/facexlib/releases/download/v0.1.0/detection_Resnet50_Final.pth", - "./models/core/face_restoration/gfpgan/weights/detection_Resnet50_Final.pth", - ], - [ - "https://github.com/xinntao/facexlib/releases/download/v0.2.2/parsing_parsenet.pth", - "./models/core/face_restoration/gfpgan/weights/parsing_parsenet.pth", - ], - ): - model_url, model_dest = model[0], config.root_path / model[1] - download_with_progress_bar(model_url, str(model_dest), "GFPGAN weights") - + logger.info("Installing ESRGAN Upscaling models...") + URLs = [ + dict( + url = "https://github.com/xinntao/Real-ESRGAN/releases/download/v0.1.0/RealESRGAN_x4plus.pth", + dest = "core/upscaling/realesrgan/RealESRGAN_x4plus.pth", + description = "RealESRGAN_x4plus.pth", + ), + dict( + url = "https://github.com/xinntao/Real-ESRGAN/releases/download/v0.2.2.4/RealESRGAN_x4plus_anime_6B.pth", + dest = "core/upscaling/realesrgan/RealESRGAN_x4plus_anime_6B.pth", + description = "RealESRGAN_x4plus_anime_6B.pth", + ), + dict( + url= "https://github.com/xinntao/Real-ESRGAN/releases/download/v0.1.1/ESRGAN_SRx4_DF2KOST_official-ff704c30.pth", + dest= "core/upscaling/realesrgan/ESRGAN_SRx4_DF2KOST_official-ff704c30.pth", + description = "ESRGAN_SRx4_DF2KOST_official.pth", + ), + dict( + url= "https://github.com/xinntao/Real-ESRGAN/releases/download/v0.2.1/RealESRGAN_x2plus.pth", + dest= "core/upscaling/realesrgan/RealESRGAN_x2plus.pth", + description = "RealESRGAN_x2plus.pth", + ), + ] + for model in URLs: + download_with_progress_bar(model['url'], config.models_path / model['dest'], model['description']) # --------------------------------------------- -def download_codeformer(): - logger.info("Installing CodeFormer model file...") - model_url = ( - "https://github.com/sczhou/CodeFormer/releases/download/v0.1.0/codeformer.pth" - ) - model_dest = config.root_path / "models/core/face_restoration/codeformer/codeformer.pth" - download_with_progress_bar(model_url, str(model_dest), "CodeFormer") - - -# --------------------------------------------- -def download_clipseg(): - logger.info("Installing clipseg model for text-based masking...") - CLIPSEG_MODEL = "CIDAS/clipseg-rd64-refined" - try: - hf_download_from_pretrained(AutoProcessor, CLIPSEG_MODEL, config.root_path / 'models/core/misc/clipseg') - hf_download_from_pretrained(CLIPSegForImageSegmentation, CLIPSEG_MODEL, config.root_path / 'models/core/misc/clipseg') - except Exception: - logger.info("Error installing clipseg model:") - logger.info(traceback.format_exc()) - - def download_support_models(): download_realesrgan() - download_gfpgan() - download_codeformer() - download_clipseg() download_conversion_models() # ------------------------------------- @@ -666,7 +633,7 @@ def run_console_ui( # The third argument is needed in the Windows 11 environment to # launch a console window running this program. - set_min_terminal_size(MIN_COLS, MIN_LINES,'invokeai-configure') + set_min_terminal_size(MIN_COLS, MIN_LINES) # the install-models application spawns a subprocess to install # models, and will crash unless this is set before running. @@ -743,7 +710,7 @@ def migrate_if_needed(opt: Namespace, root: Path)->bool: old_init_file = root / 'invokeai.init' new_init_file = root / 'invokeai.yaml' old_hub = root / 'models/hub' - migration_needed = old_init_file.exists() and not new_init_file.exists() or old_hub.exists() + migration_needed = (old_init_file.exists() and not new_init_file.exists()) and old_hub.exists() if migration_needed: if opt.yes_to_all or \ @@ -858,9 +825,9 @@ def main(): download_support_models() if opt.skip_sd_weights: - logger.info("\n** SKIPPING DIFFUSION WEIGHTS DOWNLOAD PER USER REQUEST **") + logger.warning("SKIPPING DIFFUSION WEIGHTS DOWNLOAD PER USER REQUEST") elif models_to_download: - logger.info("\n** DOWNLOADING DIFFUSION WEIGHTS **") + logger.info("DOWNLOADING DIFFUSION WEIGHTS") process_and_execute(opt, models_to_download) postscript(errors=errors) diff --git a/invokeai/backend/install/migrate_to_3.py b/invokeai/backend/install/migrate_to_3.py index 4500d7b7cd..85de3f5e69 100644 --- a/invokeai/backend/install/migrate_to_3.py +++ b/invokeai/backend/install/migrate_to_3.py @@ -593,9 +593,12 @@ script, which will perform a full upgrade in place.""" config = InvokeAIAppConfig.get_config() config.parse_args(['--root',str(dest_root)]) - # TODO: revisit - # assert (dest_root / 'models').is_dir(), f"{dest_root} does not contain a 'models' subdirectory" - # assert (dest_root / 'invokeai.yaml').exists(), f"{dest_root} does not contain an InvokeAI init file." + # TODO: revisit - don't rely on invokeai.yaml to exist yet! + dest_is_setup = (dest_root / 'models/core').exists() and (dest_root / 'databases').exists() + if not dest_is_setup: + import invokeai.frontend.install.invokeai_configure + from invokeai.backend.install.invokeai_configure import initialize_rootdir + initialize_rootdir(dest_root, True) do_migrate(src_root,dest_root) diff --git a/invokeai/backend/install/model_install_backend.py b/invokeai/backend/install/model_install_backend.py index b6f6d62d97..0537d6069a 100644 --- a/invokeai/backend/install/model_install_backend.py +++ b/invokeai/backend/install/model_install_backend.py @@ -10,7 +10,7 @@ from tempfile import TemporaryDirectory from typing import List, Dict, Callable, Union, Set import requests -from diffusers import StableDiffusionPipeline +from diffusers import DiffusionPipeline from diffusers import logging as dlogging from huggingface_hub import hf_hub_url, HfFolder, HfApi from omegaconf import OmegaConf @@ -71,8 +71,6 @@ class ModelInstallList: class InstallSelections(): install_models: List[str]= field(default_factory=list) remove_models: List[str]=field(default_factory=list) -# scan_directory: Path = None -# autoscan_on_startup: bool=False @dataclass class ModelLoadInfo(): @@ -119,6 +117,7 @@ class ModelInstall(object): # supplement with entries in models.yaml installed_models = self.mgr.list_models() + for md in installed_models: base = md['base_model'] model_type = md['model_type'] @@ -136,6 +135,12 @@ class ModelInstall(object): ) return {x : model_dict[x] for x in sorted(model_dict.keys(),key=lambda y: model_dict[y].name.lower())} + def list_models(self, model_type): + installed = self.mgr.list_models(model_type=model_type) + print(f'Installed models of type `{model_type}`:') + for i in installed: + print(f"{i['model_name']}\t{i['base_model']}\t{i['path']}") + def starter_models(self)->Set[str]: models = set() for key, value in self.datasets.items(): @@ -207,7 +212,7 @@ class ModelInstall(object): {'config.json','model_index.json','learned_embeds.bin','pytorch_lora_weights.bin'} ] ): - models_installed.update(self._install_path(path)) + models_installed.update({str(model_path_id_or_url): self._install_path(path)}) # recursive scan elif path.is_dir(): @@ -305,6 +310,8 @@ class ModelInstall(object): if key := self.reverse_paths.get(path_name): (name, base, mtype) = ModelManager.parse_key(key) return name + elif location.is_dir(): + return location.name else: return location.stem @@ -360,7 +367,7 @@ class ModelInstall(object): model = None for revision in revisions: try: - model = StableDiffusionPipeline.from_pretrained(repo_id,revision=revision,safety_checker=None) + model = DiffusionPipeline.from_pretrained(repo_id,revision=revision,safety_checker=None) except: # most errors are due to fp16 not being present. Fix this to catch other errors pass if model: diff --git a/invokeai/backend/model_management/__init__.py b/invokeai/backend/model_management/__init__.py index e2eef922f4..87c196f589 100644 --- a/invokeai/backend/model_management/__init__.py +++ b/invokeai/backend/model_management/__init__.py @@ -3,7 +3,7 @@ Initialization file for invokeai.backend.model_management """ from .model_manager import ModelManager, ModelInfo, AddModelResult, SchedulerPredictionType from .model_cache import ModelCache -from .models import BaseModelType, ModelType, SubModelType, ModelVariantType from .lora import ModelPatcher, ONNXModelPatcher +from .models import BaseModelType, ModelType, SubModelType, ModelVariantType, ModelNotFoundException from .model_merge import ModelMerger, MergeInterpolationMethod diff --git a/invokeai/backend/model_management/model_cache.py b/invokeai/backend/model_management/model_cache.py index e4cba3517e..5ca17f00fc 100644 --- a/invokeai/backend/model_management/model_cache.py +++ b/invokeai/backend/model_management/model_cache.py @@ -104,7 +104,8 @@ class ModelCache(object): :param sha_chunksize: Chunksize to use when calculating sha256 model hash ''' self.model_infos: Dict[str, ModelBase] = dict() - self.lazy_offloading = lazy_offloading + # allow lazy offloading only when vram cache enabled + self.lazy_offloading = lazy_offloading and max_vram_cache_size > 0 self.precision: torch.dtype=precision self.max_cache_size: float=max_cache_size self.max_vram_cache_size: float=max_vram_cache_size @@ -327,6 +328,25 @@ class ModelCache(object): refs = sys.getrefcount(cache_entry.model) + # manualy clear local variable references of just finished function calls + # for some reason python don't want to collect it even by gc.collect() immidiately + if refs > 2: + while True: + cleared = False + for referrer in gc.get_referrers(cache_entry.model): + if type(referrer).__name__ == "frame": + # RuntimeError: cannot clear an executing frame + with suppress(RuntimeError): + referrer.clear() + cleared = True + #break + + # repeat if referrers changes(due to frame clear), else exit loop + if cleared: + gc.collect() + else: + break + device = cache_entry.model.device if hasattr(cache_entry.model, "device") else None self.logger.debug(f"Model: {model_key}, locks: {cache_entry._locks}, device: {device}, loaded: {cache_entry.loaded}, refs: {refs}") @@ -362,6 +382,9 @@ class ModelCache(object): self.logger.debug(f'GPU VRAM freed: {(mem.vram_used/GIG):.2f} GB') vram_in_use += mem.vram_used # note vram_used is negative self.logger.debug(f'{(vram_in_use/GIG):.2f}GB VRAM used for models; max allowed={(reserved/GIG):.2f}GB') + + gc.collect() + torch.cuda.empty_cache() def _local_model_hash(self, model_path: Union[str, Path]) -> str: sha = hashlib.sha256() diff --git a/invokeai/backend/model_management/model_manager.py b/invokeai/backend/model_management/model_manager.py index 0476425c8b..c6dad3295f 100644 --- a/invokeai/backend/model_management/model_manager.py +++ b/invokeai/backend/model_management/model_manager.py @@ -106,16 +106,16 @@ providing information about a model defined in models.yaml. For example: >>> models = mgr.list_models() >>> json.dumps(models[0]) - {"path": "/home/lstein/invokeai-main/models/sd-1/controlnet/canny", - "model_format": "diffusers", - "name": "canny", - "base_model": "sd-1", + {"path": "/home/lstein/invokeai-main/models/sd-1/controlnet/canny", + "model_format": "diffusers", + "name": "canny", + "base_model": "sd-1", "type": "controlnet" } You can filter by model type and base model as shown here: - + controlnets = mgr.list_models(model_type=ModelType.ControlNet, base_model=BaseModelType.StableDiffusion1) for c in controlnets: @@ -140,14 +140,14 @@ Layout of the `models` directory: models ├── sd-1 - │   ├── controlnet - │   ├── lora - │   ├── main - │   └── embedding + │ ├── controlnet + │ ├── lora + │ ├── main + │ └── embedding ├── sd-2 - │   ├── controlnet - │   ├── lora - │   ├── main + │ ├── controlnet + │ ├── lora + │ ├── main │ └── embedding └── core ├── face_reconstruction @@ -195,7 +195,7 @@ name, base model, type and a dict of model attributes. See `invokeai/backend/model_management/models` for the attributes required by each model type. -A model can be deleted using `del_model()`, providing the same +A model can be deleted using `del_model()`, providing the same identifying information as `get_model()` The `heuristic_import()` method will take a set of strings @@ -247,6 +247,7 @@ import invokeai.backend.util.logging as logger from invokeai.app.services.config import InvokeAIAppConfig from invokeai.backend.util import CUDA_DEVICE, Chdir from .model_cache import ModelCache, ModelLocker +from .model_search import ModelSearch from .models import ( BaseModelType, ModelType, SubModelType, ModelError, SchedulerPredictionType, MODEL_CLASSES, @@ -303,7 +304,7 @@ class ModelManager(object): logger: types.ModuleType = logger, ): """ - Initialize with the path to the models.yaml config file. + Initialize with the path to the models.yaml config file. Optional parameters are the torch device type, precision, max_models, and sequential_offload boolean. Note that the default device type and precision are set up for a CUDA system running at half precision. @@ -323,15 +324,6 @@ class ModelManager(object): # TODO: metadata not found # TODO: version check - self.models = dict() - for model_key, model_config in config.items(): - model_name, base_model, model_type = self.parse_key(model_key) - model_class = MODEL_CLASSES[base_model][model_type] - # alias for config file - model_config["model_format"] = model_config.pop("format") - self.models[model_key] = model_class.create_config(**model_config) - - # check config version number and update on disk/RAM if necessary self.app_config = InvokeAIAppConfig.get_config() self.logger = logger self.cache = ModelCache( @@ -342,11 +334,41 @@ class ModelManager(object): sequential_offload = sequential_offload, logger = logger, ) + + self._read_models(config) + + def _read_models(self, config: Optional[DictConfig] = None): + if not config: + if self.config_path: + config = OmegaConf.load(self.config_path) + else: + return + + self.models = dict() + for model_key, model_config in config.items(): + if model_key.startswith('_'): + continue + model_name, base_model, model_type = self.parse_key(model_key) + model_class = MODEL_CLASSES[base_model][model_type] + # alias for config file + model_config["model_format"] = model_config.pop("format") + self.models[model_key] = model_class.create_config(**model_config) + + # check config version number and update on disk/RAM if necessary self.cache_keys = dict() # add controlnet, lora and textual_inversion models from disk self.scan_models_directory() + def sync_to_config(self): + """ + Call this when `models.yaml` has been changed externally. + This will reinitialize internal data structures + """ + # Reread models directory; note that this will reinitialize the cache, + # causing otherwise unreferenced models to be removed from memory + self._read_models() + def model_exists( self, model_name: str, @@ -409,7 +431,7 @@ class ModelManager(object): :param model_name: symbolic name of the model in models.yaml :param model_type: ModelType enum indicating the type of model to return :param base_model: BaseModelType enum indicating the base model used by this model - :param submode_typel: an ModelType enum indicating the portion of + :param submode_typel: an ModelType enum indicating the portion of the model to retrieve (e.g. ModelType.Vae) """ model_class = MODEL_CLASSES[base_model][model_type] @@ -434,7 +456,7 @@ class ModelManager(object): raise ModelNotFoundException(f"Model not found - {model_key}") # vae/movq override - # TODO: + # TODO: if submodel_type is not None and hasattr(model_config, submodel_type): override_path = getattr(model_config, submodel_type) if override_path: @@ -467,7 +489,7 @@ class ModelManager(object): self.cache_keys[model_key].add(model_context.key) model_hash = "" # TODO: - + return ModelInfo( context = model_context, name = model_name, @@ -496,7 +518,7 @@ class ModelManager(object): def model_names(self) -> List[Tuple[str, BaseModelType, ModelType]]: """ - Return a list of (str, BaseModelType, ModelType) corresponding to all models + Return a list of (str, BaseModelType, ModelType) corresponding to all models known to the configuration. """ return [(self.parse_key(x)) for x in self.models.keys()] @@ -527,7 +549,10 @@ class ModelManager(object): model_keys = [self.create_key(model_name, base_model, model_type)] if model_name else sorted(self.models, key=str.casefold) models = [] for model_key in model_keys: - model_config = self.models[model_key] + model_config = self.models.get(model_key) + if not model_config: + self.logger.error(f'Unknown model {model_name}') + raise ModelNotFoundException(f'Unknown model {model_name}') cur_model_name, cur_base_model, cur_model_type = self.parse_key(model_key) if base_model is not None and cur_base_model != base_model: @@ -543,6 +568,9 @@ class ModelManager(object): model_type=cur_model_type, ) + # expose paths as absolute to help web UI + if path := model_dict.get('path'): + model_dict['path'] = str(self.app_config.root_path / path) models.append(model_dict) return models @@ -571,7 +599,7 @@ class ModelManager(object): model_cfg = self.models.pop(model_key, None) if model_cfg is None: - raise KeyError(f"Unknown model {model_key}") + raise ModelNotFoundException(f"Unknown model {model_key}") # note: it not garantie to release memory(model can has other references) cache_ids = self.cache_keys.pop(model_key, []) @@ -589,6 +617,7 @@ class ModelManager(object): rmtree(str(model_path)) else: model_path.unlink() + self.commit() # LS: tested def add_model( @@ -609,6 +638,10 @@ class ModelManager(object): The returned dict has the same format as the dict returned by model_info(). """ + # relativize paths as they go in - this makes it easier to move the root directory around + if path := model_attributes.get('path'): + if Path(path).is_relative_to(self.app_config.root_path): + model_attributes['path'] = str(Path(path).relative_to(self.app_config.root_path)) model_class = MODEL_CLASSES[base_model][model_type] model_config = model_class.create_config(**model_attributes) @@ -645,11 +678,61 @@ class ModelManager(object): config = model_config, ) + def rename_model( + self, + model_name: str, + base_model: BaseModelType, + model_type: ModelType, + new_name: str = None, + new_base: BaseModelType = None, + ): + ''' + Rename or rebase a model. + ''' + if new_name is None and new_base is None: + self.logger.error("rename_model() called with neither a new_name nor a new_base. {model_name} unchanged.") + return + + model_key = self.create_key(model_name, base_model, model_type) + model_cfg = self.models.get(model_key, None) + if not model_cfg: + raise ModelNotFoundException(f"Unknown model: {model_key}") + + old_path = self.app_config.root_path / model_cfg.path + new_name = new_name or model_name + new_base = new_base or base_model + new_key = self.create_key(new_name, new_base, model_type) + if new_key in self.models: + raise ValueError(f'Attempt to overwrite existing model definition "{new_key}"') + + # if this is a model file/directory that we manage ourselves, we need to move it + if old_path.is_relative_to(self.app_config.models_path): + new_path = self.app_config.root_path / 'models' / BaseModelType(new_base).value / ModelType(model_type).value / new_name + move(old_path, new_path) + model_cfg.path = str(new_path.relative_to(self.app_config.root_path)) + + # clean up caches + old_model_cache = self._get_model_cache_path(old_path) + if old_model_cache.exists(): + if old_model_cache.is_dir(): + rmtree(str(old_model_cache)) + else: + old_model_cache.unlink() + + cache_ids = self.cache_keys.pop(model_key, []) + for cache_id in cache_ids: + self.cache.uncache_model(cache_id) + + self.models.pop(model_key, None) # delete + self.models[new_key] = model_cfg + self.commit() + def convert_model ( self, model_name: str, base_model: BaseModelType, model_type: Union[ModelType.Main,ModelType.Vae], + dest_directory: Optional[Path]=None, ) -> AddModelResult: ''' Convert a checkpoint file into a diffusers folder, deleting the cached @@ -676,14 +759,14 @@ class ModelManager(object): ) checkpoint_path = self.app_config.root_path / info["path"] old_diffusers_path = self.app_config.models_path / model.location - new_diffusers_path = self.app_config.models_path / base_model.value / model_type.value / model_name + new_diffusers_path = (dest_directory or self.app_config.models_path / base_model.value / model_type.value) / model_name if new_diffusers_path.exists(): raise ValueError(f"A diffusers model already exists at {new_diffusers_path}") try: move(old_diffusers_path,new_diffusers_path) info["model_format"] = "diffusers" - info["path"] = str(new_diffusers_path.relative_to(self.app_config.root_path)) + info["path"] = str(new_diffusers_path) if dest_directory else str(new_diffusers_path.relative_to(self.app_config.root_path)) info.pop('config') result = self.add_model(model_name, base_model, model_type, @@ -693,12 +776,12 @@ class ModelManager(object): # something went wrong, so don't leave dangling diffusers model in directory or it will cause a duplicate model error! rmtree(new_diffusers_path) raise - + if checkpoint_path.exists() and checkpoint_path.is_relative_to(self.app_config.models_path): checkpoint_path.unlink() - + return result - + def search_models(self, search_folder): self.logger.info(f"Finding Models In: {search_folder}") models_folder_ckpt = Path(search_folder).glob("**/*.ckpt") @@ -741,10 +824,14 @@ class ModelManager(object): assert config_file_path is not None,'no config file path to write to' config_file_path = self.app_config.root_path / config_file_path tmpfile = os.path.join(os.path.dirname(config_file_path), "new_config.tmp") - with open(tmpfile, "w", encoding="utf-8") as outfile: - outfile.write(self.preamble()) - outfile.write(yaml_str) - os.replace(tmpfile, config_file_path) + try: + with open(tmpfile, "w", encoding="utf-8") as outfile: + outfile.write(self.preamble()) + outfile.write(yaml_str) + os.replace(tmpfile, config_file_path) + except OSError as err: + self.logger.warning(f"Could not modify the config file at {config_file_path}") + self.logger.warning(err) def preamble(self) -> str: """ @@ -823,6 +910,7 @@ class ModelManager(object): if (new_models_found or imported_models) and self.config_path: self.commit() + def autoimport(self)->Dict[str, AddModelResult]: ''' Scan the autoimport directory (if defined) and import new models, delete defunct models. @@ -830,63 +918,41 @@ class ModelManager(object): # avoid circular import from invokeai.backend.install.model_install_backend import ModelInstall from invokeai.frontend.install.model_install import ask_user_for_prediction_type - + + class ScanAndImport(ModelSearch): + def __init__(self, directories, logger, ignore: Set[Path], installer: ModelInstall): + super().__init__(directories, logger) + self.installer = installer + self.ignore = ignore + + def on_search_started(self): + self.new_models_found = dict() + + def on_model_found(self, model: Path): + if model not in self.ignore: + self.new_models_found.update(self.installer.heuristic_import(model)) + + def on_search_completed(self): + self.logger.info(f'Scanned {self._items_scanned} files and directories, imported {len(self.new_models_found)} models') + + def models_found(self): + return self.new_models_found + + installer = ModelInstall(config = self.app_config, model_manager = self, prediction_type_helper = ask_user_for_prediction_type, ) - - scanned_dirs = set() - config = self.app_config - known_paths = {(self.app_config.root_path / x['path']) for x in self.list_models()} - - for autodir in [config.autoimport_dir, - config.lora_dir, - config.embedding_dir, - config.controlnet_dir]: - if autodir is None: - continue - - self.logger.info(f'Scanning {autodir} for models to import') - installed = dict() - - autodir = self.app_config.root_path / autodir - if not autodir.exists(): - continue - - items_scanned = 0 - new_models_found = dict() - - for root, dirs, files in os.walk(autodir): - items_scanned += len(dirs) + len(files) - for d in dirs: - path = Path(root) / d - if path in known_paths or path.parent in scanned_dirs: - scanned_dirs.add(path) - continue - if any([(path/x).exists() for x in {'config.json','model_index.json','learned_embeds.bin','pytorch_lora_weights.bin'}]): - try: - new_models_found.update(installer.heuristic_import(path)) - scanned_dirs.add(path) - except ValueError as e: - self.logger.warning(str(e)) - - for f in files: - path = Path(root) / f - if path in known_paths or path.parent in scanned_dirs: - continue - if path.suffix in {'.ckpt','.bin','.pth','.safetensors','.pt'}: - try: - import_result = installer.heuristic_import(path) - new_models_found.update(import_result) - except ValueError as e: - self.logger.warning(str(e)) - - self.logger.info(f'Scanned {items_scanned} files and directories, imported {len(new_models_found)} models') - installed.update(new_models_found) - - return installed + known_paths = {config.root_path / x['path'] for x in self.list_models()} + directories = {config.root_path / x for x in [config.autoimport_dir, + config.lora_dir, + config.embedding_dir, + config.controlnet_dir] + } + scanner = ScanAndImport(directories, self.logger, ignore=known_paths, installer=installer) + scanner.search() + return scanner.models_found() def heuristic_import(self, items_to_import: Set[str], @@ -909,18 +975,18 @@ class ModelManager(object): that model. May return the following exceptions: - - KeyError - one or more of the items to import is not a valid path, repo_id or URL + - ModelNotFoundException - one or more of the items to import is not a valid path, repo_id or URL - ValueError - a corresponding model already exists ''' # avoid circular import here from invokeai.backend.install.model_install_backend import ModelInstall successfully_installed = dict() - + installer = ModelInstall(config = self.app_config, prediction_type_helper = prediction_type_helper, model_manager = self) for thing in items_to_import: installed = installer.heuristic_import(thing) successfully_installed.update(installed) - self.commit() + self.commit() return successfully_installed diff --git a/invokeai/backend/model_management/model_merge.py b/invokeai/backend/model_management/model_merge.py index 39f951d2b4..6427b9e430 100644 --- a/invokeai/backend/model_management/model_merge.py +++ b/invokeai/backend/model_management/model_merge.py @@ -11,7 +11,7 @@ from enum import Enum from pathlib import Path from diffusers import DiffusionPipeline from diffusers import logging as dlogging -from typing import List, Union +from typing import List, Union, Optional import invokeai.backend.util.logging as logger @@ -74,6 +74,7 @@ class ModelMerger(object): alpha: float = 0.5, interp: MergeInterpolationMethod = None, force: bool = False, + merge_dest_directory: Optional[Path] = None, **kwargs, ) -> AddModelResult: """ @@ -85,7 +86,7 @@ class ModelMerger(object): :param interp: The interpolation method to use for the merging. Supports "weighted_average", "sigmoid", "inv_sigmoid", "add_difference" and None. Passing None uses the default interpolation which is weighted sum interpolation. For merging three checkpoints, only "add_difference" is supported. Add_difference is A+(B-C). :param force: Whether to ignore mismatch in model_config.json for the current models. Defaults to False. - + :param merge_dest_directory: Save the merged model to the designated directory (with 'merged_model_name' appended) **kwargs - the default DiffusionPipeline.get_config_dict kwargs: cache_dir, resume_download, force_download, proxies, local_files_only, use_auth_token, revision, torch_dtype, device_map """ @@ -111,7 +112,7 @@ class ModelMerger(object): merged_pipe = self.merge_diffusion_models( model_paths, alpha, merge_method, force, **kwargs ) - dump_path = config.models_path / base_model.value / ModelType.Main.value + dump_path = Path(merge_dest_directory) if merge_dest_directory else config.models_path / base_model.value / ModelType.Main.value dump_path.mkdir(parents=True, exist_ok=True) dump_path = dump_path / merged_model_name diff --git a/invokeai/backend/model_management/model_probe.py b/invokeai/backend/model_management/model_probe.py index 57aa452d1d..8c59030fdb 100644 --- a/invokeai/backend/model_management/model_probe.py +++ b/invokeai/backend/model_management/model_probe.py @@ -12,6 +12,7 @@ from picklescan.scanner import scan_file_path from .models import ( BaseModelType, ModelType, ModelVariantType, SchedulerPredictionType, SilenceWarnings, + InvalidModelException ) from .models.base import read_checkpoint_meta @@ -38,6 +39,8 @@ class ModelProbe(object): CLASS2TYPE = { 'StableDiffusionPipeline' : ModelType.Main, + 'StableDiffusionXLPipeline' : ModelType.Main, + 'StableDiffusionXLImg2ImgPipeline' : ModelType.Main, 'AutoencoderKL' : ModelType.Vae, 'ControlNetModel' : ModelType.ControlNet, } @@ -59,7 +62,7 @@ class ModelProbe(object): elif isinstance(model,(dict,ModelMixin,ConfigMixin)): return cls.probe(model_path=None, model=model, prediction_type_helper=prediction_type_helper) else: - raise ValueError("model parameter {model} is neither a Path, nor a model") + raise InvalidModelException("model parameter {model} is neither a Path, nor a model") @classmethod def probe(cls, @@ -99,9 +102,10 @@ class ModelProbe(object): upcast_attention = (base_type==BaseModelType.StableDiffusion2 \ and prediction_type==SchedulerPredictionType.VPrediction), format = format, - image_size = 768 if (base_type==BaseModelType.StableDiffusion2 \ - and prediction_type==SchedulerPredictionType.VPrediction \ - ) else 512, + image_size = 1024 if (base_type in {BaseModelType.StableDiffusionXL,BaseModelType.StableDiffusionXLRefiner}) else \ + 768 if (base_type==BaseModelType.StableDiffusion2 \ + and prediction_type==SchedulerPredictionType.VPrediction ) else \ + 512 ) except Exception: raise @@ -138,7 +142,7 @@ class ModelProbe(object): if len(ckpt) < 10 and all(isinstance(v, torch.Tensor) for v in ckpt.values()): return ModelType.TextualInversion - raise ValueError(f"Unable to determine model type for {model_path}") + raise InvalidModelException(f"Unable to determine model type for {model_path}") @classmethod def get_model_type_from_folder(cls, folder_path: Path, model: ModelMixin)->ModelType: @@ -168,7 +172,7 @@ class ModelProbe(object): return type # give up - raise ValueError(f"Unable to determine model type for {folder_path}") + raise InvalidModelException(f"Unable to determine model type for {folder_path}") @classmethod def _scan_and_load_checkpoint(cls,model_path: Path)->dict: @@ -237,7 +241,7 @@ class CheckpointProbeBase(ProbeBase): elif in_channels == 4: return ModelVariantType.Normal else: - raise ValueError(f"Cannot determine variant type (in_channels={in_channels}) at {self.checkpoint_path}") + raise InvalidModelException(f"Cannot determine variant type (in_channels={in_channels}) at {self.checkpoint_path}") class PipelineCheckpointProbe(CheckpointProbeBase): def get_base_type(self)->BaseModelType: @@ -248,7 +252,10 @@ class PipelineCheckpointProbe(CheckpointProbeBase): return BaseModelType.StableDiffusion1 if key_name in state_dict and state_dict[key_name].shape[-1] == 1024: return BaseModelType.StableDiffusion2 - raise ValueError("Cannot determine base type") + # TODO: Verify that this is correct! Need an XL checkpoint file for this. + if key_name in state_dict and state_dict[key_name].shape[-1] == 2048: + return BaseModelType.StableDiffusionXL + raise InvalidModelException("Cannot determine base type") def get_scheduler_prediction_type(self)->SchedulerPredictionType: type = self.get_base_type() @@ -329,7 +336,7 @@ class ControlNetCheckpointProbe(CheckpointProbeBase): return BaseModelType.StableDiffusion2 elif self.checkpoint_path and self.helper: return self.helper(self.checkpoint_path) - raise ValueError("Unable to determine base type for {self.checkpoint_path}") + raise InvalidModelException("Unable to determine base type for {self.checkpoint_path}") ######################################################## # classes for probing folders @@ -360,8 +367,12 @@ class PipelineFolderProbe(FolderProbeBase): return BaseModelType.StableDiffusion1 elif unet_conf['cross_attention_dim'] == 1024: return BaseModelType.StableDiffusion2 + elif unet_conf['cross_attention_dim'] == 1280: + return BaseModelType.StableDiffusionXLRefiner + elif unet_conf['cross_attention_dim'] == 2048: + return BaseModelType.StableDiffusionXL else: - raise ValueError(f'Unknown base model for {self.folder_path}') + raise InvalidModelException(f'Unknown base model for {self.folder_path}') def get_scheduler_prediction_type(self)->SchedulerPredictionType: if self.model: @@ -418,7 +429,7 @@ class ControlNetFolderProbe(FolderProbeBase): def get_base_type(self)->BaseModelType: config_file = self.folder_path / 'config.json' if not config_file.exists(): - raise ValueError(f"Cannot determine base type for {self.folder_path}") + raise InvalidModelException(f"Cannot determine base type for {self.folder_path}") with open(config_file,'r') as file: config = json.load(file) # no obvious way to distinguish between sd2-base and sd2-768 @@ -435,7 +446,7 @@ class LoRAFolderProbe(FolderProbeBase): model_file = base_file break if not model_file: - raise ValueError('Unknown LoRA format encountered') + raise InvalidModelException('Unknown LoRA format encountered') return LoRACheckpointProbe(model_file,None).get_base_type() ############## register probe classes ###### diff --git a/invokeai/backend/model_management/model_search.py b/invokeai/backend/model_management/model_search.py new file mode 100644 index 0000000000..1e282b4bb8 --- /dev/null +++ b/invokeai/backend/model_management/model_search.py @@ -0,0 +1,103 @@ +# Copyright 2023, Lincoln D. Stein and the InvokeAI Team +""" +Abstract base class for recursive directory search for models. +""" + +import os +from abc import ABC, abstractmethod +from typing import List, Set, types +from pathlib import Path + +import invokeai.backend.util.logging as logger + +class ModelSearch(ABC): + def __init__(self, directories: List[Path], logger: types.ModuleType=logger): + """ + Initialize a recursive model directory search. + :param directories: List of directory Paths to recurse through + :param logger: Logger to use + """ + self.directories = directories + self.logger = logger + self._items_scanned = 0 + self._models_found = 0 + self._scanned_dirs = set() + self._scanned_paths = set() + self._pruned_paths = set() + + @abstractmethod + def on_search_started(self): + """ + Called before the scan starts. + """ + pass + + @abstractmethod + def on_model_found(self, model: Path): + """ + Process a found model. Raise an exception if something goes wrong. + :param model: Model to process - could be a directory or checkpoint. + """ + pass + + @abstractmethod + def on_search_completed(self): + """ + Perform some activity when the scan is completed. May use instance + variables, items_scanned and models_found + """ + pass + + def search(self): + self.on_search_started() + for dir in self.directories: + self.walk_directory(dir) + self.on_search_completed() + + def walk_directory(self, path: Path): + for root, dirs, files in os.walk(path): + if str(Path(root).name).startswith('.'): + self._pruned_paths.add(root) + if any([Path(root).is_relative_to(x) for x in self._pruned_paths]): + continue + + self._items_scanned += len(dirs) + len(files) + for d in dirs: + path = Path(root) / d + if path in self._scanned_paths or path.parent in self._scanned_dirs: + self._scanned_dirs.add(path) + continue + if any([(path/x).exists() for x in {'config.json','model_index.json','learned_embeds.bin','pytorch_lora_weights.bin'}]): + try: + self.on_model_found(path) + self._models_found += 1 + self._scanned_dirs.add(path) + except Exception as e: + self.logger.warning(str(e)) + + for f in files: + path = Path(root) / f + if path.parent in self._scanned_dirs: + continue + if path.suffix in {'.ckpt','.bin','.pth','.safetensors','.pt'}: + try: + self.on_model_found(path) + self._models_found += 1 + except Exception as e: + self.logger.warning(str(e)) + +class FindModels(ModelSearch): + def on_search_started(self): + self.models_found: Set[Path] = set() + + def on_model_found(self,model: Path): + self.models_found.add(model) + + def on_search_completed(self): + pass + + def list_models(self) -> List[Path]: + self.search() + return self.models_found + + diff --git a/invokeai/backend/model_management/models/__init__.py b/invokeai/backend/model_management/models/__init__.py index 3599a5a60b..142128ed47 100644 --- a/invokeai/backend/model_management/models/__init__.py +++ b/invokeai/backend/model_management/models/__init__.py @@ -4,6 +4,7 @@ from pydantic import BaseModel from typing import Literal, get_origin from .base import BaseModelType, ModelType, SubModelType, ModelBase, ModelConfigBase, ModelVariantType, SchedulerPredictionType, ModelError, SilenceWarnings, ModelNotFoundException, InvalidModelException from .stable_diffusion import StableDiffusion1Model, StableDiffusion2Model +from .sdxl import StableDiffusionXLModel from .vae import VaeModel from .lora import LoRAModel from .controlnet import ControlNetModel # TODO: @@ -28,6 +29,22 @@ MODEL_CLASSES = { ModelType.ControlNet: ControlNetModel, ModelType.TextualInversion: TextualInversionModel, }, + BaseModelType.StableDiffusionXL: { + ModelType.Main: StableDiffusionXLModel, + ModelType.Vae: VaeModel, + # will not work until support written + ModelType.Lora: LoRAModel, + ModelType.ControlNet: ControlNetModel, + ModelType.TextualInversion: TextualInversionModel, + }, + BaseModelType.StableDiffusionXLRefiner: { + ModelType.Main: StableDiffusionXLModel, + ModelType.Vae: VaeModel, + # will not work until support written + ModelType.Lora: LoRAModel, + ModelType.ControlNet: ControlNetModel, + ModelType.TextualInversion: TextualInversionModel, + }, #BaseModelType.Kandinsky2_1: { # ModelType.Main: Kandinsky2_1Model, # ModelType.MoVQ: MoVQModel, @@ -52,7 +69,9 @@ for base_model, models in MODEL_CLASSES.items(): model_configs.discard(None) MODEL_CONFIGS.extend(model_configs) - for cfg in model_configs: + # LS: sort to get the checkpoint configs first, which makes + # for a better template in the Swagger docs + for cfg in sorted(model_configs, key=lambda x: str(x)): model_name, cfg_name = cfg.__qualname__.split('.')[-2:] openapi_cfg_name = model_name + cfg_name if openapi_cfg_name in vars(): diff --git a/invokeai/backend/model_management/models/base.py b/invokeai/backend/model_management/models/base.py index 1219f1803d..b86712aebf 100644 --- a/invokeai/backend/model_management/models/base.py +++ b/invokeai/backend/model_management/models/base.py @@ -30,6 +30,8 @@ class ModelNotFoundException(Exception): class BaseModelType(str, Enum): StableDiffusion1 = "sd-1" StableDiffusion2 = "sd-2" + StableDiffusionXL = "sdxl" + StableDiffusionXLRefiner = "sdxl-refiner" #Kandinsky2_1 = "kandinsky-2.1" class ModelType(str, Enum): @@ -43,7 +45,9 @@ class ModelType(str, Enum): class SubModelType(str, Enum): UNet = "unet" TextEncoder = "text_encoder" + TextEncoder2 = "text_encoder_2" Tokenizer = "tokenizer" + Tokenizer2 = "tokenizer_2" Vae = "vae" VaeDecoder = "vae_decoder" VaeEncoder = "vae_encoder" @@ -68,7 +72,6 @@ class ModelConfigBase(BaseModel): path: str # or Path description: Optional[str] = Field(None) model_format: Optional[str] = Field(None) - # do not save to config error: Optional[ModelError] = Field(None) class Config: diff --git a/invokeai/backend/model_management/models/controlnet.py b/invokeai/backend/model_management/models/controlnet.py index 3b73097799..178fea4d13 100644 --- a/invokeai/backend/model_management/models/controlnet.py +++ b/invokeai/backend/model_management/models/controlnet.py @@ -1,8 +1,7 @@ import os import torch from enum import Enum -from pathlib import Path -from typing import Optional, Union, Literal +from typing import Optional from .base import ( ModelBase, ModelConfigBase, @@ -14,6 +13,7 @@ from .base import ( calc_model_size_by_data, classproperty, InvalidModelException, + ModelNotFoundException, ) class ControlNetModelFormat(str, Enum): @@ -60,10 +60,20 @@ class ControlNetModel(ModelBase): if child_type is not None: raise Exception("There is no child models in controlnet model") - model = self.model_class.from_pretrained( - self.model_path, - torch_dtype=torch_dtype, - ) + model = None + for variant in ['fp16',None]: + try: + model = self.model_class.from_pretrained( + self.model_path, + torch_dtype=torch_dtype, + variant=variant, + ) + break + except: + pass + if not model: + raise ModelNotFoundException() + # calc more accurate size self.model_size = calc_model_size_by_data(model) return model diff --git a/invokeai/backend/model_management/models/sdxl.py b/invokeai/backend/model_management/models/sdxl.py new file mode 100644 index 0000000000..76cabcdc62 --- /dev/null +++ b/invokeai/backend/model_management/models/sdxl.py @@ -0,0 +1,114 @@ +import os +import json +from enum import Enum +from pydantic import Field +from typing import Literal, Optional +from .base import ( + ModelConfigBase, + BaseModelType, + ModelType, + ModelVariantType, + DiffusersModel, + read_checkpoint_meta, + classproperty, +) +from omegaconf import OmegaConf + +class StableDiffusionXLModelFormat(str, Enum): + Checkpoint = "checkpoint" + Diffusers = "diffusers" + +class StableDiffusionXLModel(DiffusersModel): + + # TODO: check that configs overwriten properly + class DiffusersConfig(ModelConfigBase): + model_format: Literal[StableDiffusionXLModelFormat.Diffusers] + vae: Optional[str] = Field(None) + variant: ModelVariantType + + class CheckpointConfig(ModelConfigBase): + model_format: Literal[StableDiffusionXLModelFormat.Checkpoint] + vae: Optional[str] = Field(None) + config: str + variant: ModelVariantType + + def __init__(self, model_path: str, base_model: BaseModelType, model_type: ModelType): + assert base_model in {BaseModelType.StableDiffusionXL, BaseModelType.StableDiffusionXLRefiner} + assert model_type == ModelType.Main + super().__init__( + model_path=model_path, + base_model=BaseModelType.StableDiffusionXL, + model_type=ModelType.Main, + ) + + @classmethod + def probe_config(cls, path: str, **kwargs): + model_format = cls.detect_format(path) + ckpt_config_path = kwargs.get("config", None) + if model_format == StableDiffusionXLModelFormat.Checkpoint: + if ckpt_config_path: + ckpt_config = OmegaConf.load(ckpt_config_path) + ckpt_config["model"]["params"]["unet_config"]["params"]["in_channels"] + + else: + checkpoint = read_checkpoint_meta(path) + checkpoint = checkpoint.get('state_dict', checkpoint) + in_channels = checkpoint["model.diffusion_model.input_blocks.0.0.weight"].shape[1] + + elif model_format == StableDiffusionXLModelFormat.Diffusers: + unet_config_path = os.path.join(path, "unet", "config.json") + if os.path.exists(unet_config_path): + with open(unet_config_path, "r") as f: + unet_config = json.loads(f.read()) + in_channels = unet_config['in_channels'] + + else: + raise Exception("Not supported stable diffusion diffusers format(possibly onnx?)") + + else: + raise NotImplementedError(f"Unknown stable diffusion 2.* format: {model_format}") + + if in_channels == 9: + variant = ModelVariantType.Inpaint + elif in_channels == 5: + variant = ModelVariantType.Depth + elif in_channels == 4: + variant = ModelVariantType.Normal + else: + raise Exception("Unkown stable diffusion 2.* model format") + + if ckpt_config_path is None: + # TO DO: implement picking + pass + + return cls.create_config( + path=path, + model_format=model_format, + + config=ckpt_config_path, + variant=variant, + ) + + @classproperty + def save_to_config(cls) -> bool: + return True + + @classmethod + def detect_format(cls, model_path: str): + if os.path.isdir(model_path): + return StableDiffusionXLModelFormat.Diffusers + else: + return StableDiffusionXLModelFormat.Checkpoint + + @classmethod + def convert_if_required( + cls, + model_path: str, + output_path: str, + config: ModelConfigBase, + base_model: BaseModelType, + ) -> str: + if isinstance(config, cls.CheckpointConfig): + raise NotImplementedError('conversion of SDXL checkpoint models to diffusers format is not yet supported') + else: + return model_path diff --git a/invokeai/backend/model_management/models/stable_diffusion.py b/invokeai/backend/model_management/models/stable_diffusion.py index 74751a40dd..a90a72ba30 100644 --- a/invokeai/backend/model_management/models/stable_diffusion.py +++ b/invokeai/backend/model_management/models/stable_diffusion.py @@ -5,14 +5,11 @@ from pydantic import Field from pathlib import Path from typing import Literal, Optional, Union from .base import ( - ModelBase, ModelConfigBase, BaseModelType, ModelType, - SubModelType, ModelVariantType, DiffusersModel, - SchedulerPredictionType, SilenceWarnings, read_checkpoint_meta, classproperty, @@ -37,8 +34,7 @@ class StableDiffusion1Model(DiffusersModel): vae: Optional[str] = Field(None) config: str variant: ModelVariantType - - + def __init__(self, model_path: str, base_model: BaseModelType, model_type: ModelType): assert base_model == BaseModelType.StableDiffusion1 assert model_type == ModelType.Main @@ -249,6 +245,12 @@ def _select_ckpt_config(version: BaseModelType, variant: ModelVariantType): ModelVariantType.Normal: "v2-inference-v.yaml", # best guess, as we can't differentiate with base(512) ModelVariantType.Inpaint: "v2-inpainting-inference.yaml", ModelVariantType.Depth: "v2-midas-inference.yaml", + }, + # note that these .yaml files don't yet exist! + BaseModelType.StableDiffusionXL: { + ModelVariantType.Normal: "xl-inference-v.yaml", + ModelVariantType.Inpaint: "xl-inpainting-inference.yaml", + ModelVariantType.Depth: "xl-midas-inference.yaml", } } @@ -264,6 +266,7 @@ def _select_ckpt_config(version: BaseModelType, variant: ModelVariantType): # TODO: rework +# Note that convert_ckpt_to_diffuses does not currently support conversion of SDXL models def _convert_ckpt_and_cache( version: BaseModelType, model_config: Union[StableDiffusion1Model.CheckpointConfig, StableDiffusion2Model.CheckpointConfig], diff --git a/invokeai/backend/model_management/models/textual_inversion.py b/invokeai/backend/model_management/models/textual_inversion.py index 9cd62bb417..eea0e85245 100644 --- a/invokeai/backend/model_management/models/textual_inversion.py +++ b/invokeai/backend/model_management/models/textual_inversion.py @@ -68,7 +68,7 @@ class TextualInversionModel(ModelBase): return None # diffusers-ti if os.path.isfile(path): - if any([path.endswith(f".{ext}") for ext in ["safetensors", "ckpt", "pt"]]): + if any([path.endswith(f".{ext}") for ext in ["safetensors", "ckpt", "pt", "bin"]]): return None raise InvalidModelException(f"Not a valid model: {path}") diff --git a/invokeai/backend/model_management/models/vae.py b/invokeai/backend/model_management/models/vae.py index 2a5b7cff24..f740615509 100644 --- a/invokeai/backend/model_management/models/vae.py +++ b/invokeai/backend/model_management/models/vae.py @@ -16,6 +16,7 @@ from .base import ( calc_model_size_by_data, classproperty, InvalidModelException, + ModelNotFoundException, ) from invokeai.app.services.config import InvokeAIAppConfig from diffusers.utils import is_safetensors_available diff --git a/invokeai/backend/restoration/__init__.py b/invokeai/backend/restoration/__init__.py deleted file mode 100644 index 165ef080b3..0000000000 --- a/invokeai/backend/restoration/__init__.py +++ /dev/null @@ -1,4 +0,0 @@ -""" -Initialization file for the invokeai.backend.restoration package -""" -from .base import Restoration diff --git a/invokeai/backend/restoration/base.py b/invokeai/backend/restoration/base.py deleted file mode 100644 index 956f99cf16..0000000000 --- a/invokeai/backend/restoration/base.py +++ /dev/null @@ -1,45 +0,0 @@ -import invokeai.backend.util.logging as logger - -class Restoration: - def __init__(self) -> None: - pass - - def load_face_restore_models( - self, gfpgan_model_path="./models/core/face_restoration/gfpgan/GFPGANv1.4.pth" - ): - # Load GFPGAN - gfpgan = self.load_gfpgan(gfpgan_model_path) - if gfpgan.gfpgan_model_exists: - logger.info("GFPGAN Initialized") - else: - logger.info("GFPGAN Disabled") - gfpgan = None - - # Load CodeFormer - codeformer = self.load_codeformer() - if codeformer.codeformer_model_exists: - logger.info("CodeFormer Initialized") - else: - logger.info("CodeFormer Disabled") - codeformer = None - - return gfpgan, codeformer - - # Face Restore Models - def load_gfpgan(self, gfpgan_model_path): - from .gfpgan import GFPGAN - - return GFPGAN(gfpgan_model_path) - - def load_codeformer(self): - from .codeformer import CodeFormerRestoration - - return CodeFormerRestoration() - - # Upscale Models - def load_esrgan(self, esrgan_bg_tile=400): - from .realesrgan import ESRGAN - - esrgan = ESRGAN(esrgan_bg_tile) - logger.info("ESRGAN Initialized") - return esrgan diff --git a/invokeai/backend/restoration/codeformer.py b/invokeai/backend/restoration/codeformer.py deleted file mode 100644 index 92fcd06e0b..0000000000 --- a/invokeai/backend/restoration/codeformer.py +++ /dev/null @@ -1,120 +0,0 @@ -import os -import sys -import warnings - -import numpy as np -import torch - -import invokeai.backend.util.logging as logger -from invokeai.app.services.config import InvokeAIAppConfig - -pretrained_model_url = ( - "https://github.com/sczhou/CodeFormer/releases/download/v0.1.0/codeformer.pth" -) - - -class CodeFormerRestoration: - def __init__( - self, codeformer_dir="./models/core/face_restoration/codeformer", codeformer_model_path="codeformer.pth" - ) -> None: - - self.globals = InvokeAIAppConfig.get_config() - codeformer_dir = self.globals.root_dir / codeformer_dir - self.model_path = codeformer_dir / codeformer_model_path - self.codeformer_model_exists = self.model_path.exists() - - if not self.codeformer_model_exists: - logger.error(f"NOT FOUND: CodeFormer model not found at {self.model_path}") - sys.path.append(os.path.abspath(codeformer_dir)) - - def process(self, image, strength, device, seed=None, fidelity=0.75): - if seed is not None: - logger.info(f"CodeFormer - Restoring Faces for image seed:{seed}") - with warnings.catch_warnings(): - warnings.filterwarnings("ignore", category=DeprecationWarning) - warnings.filterwarnings("ignore", category=UserWarning) - - from basicsr.utils import img2tensor, tensor2img - from basicsr.utils.download_util import load_file_from_url - from facexlib.utils.face_restoration_helper import FaceRestoreHelper - from PIL import Image - from torchvision.transforms.functional import normalize - - from .codeformer_arch import CodeFormer - - cf_class = CodeFormer - - cf = cf_class( - dim_embd=512, - codebook_size=1024, - n_head=8, - n_layers=9, - connect_list=["32", "64", "128", "256"], - ).to(device) - - # note that this file should already be downloaded and cached at - # this point - checkpoint_path = load_file_from_url( - url=pretrained_model_url, - model_dir=os.path.abspath(os.path.dirname(self.model_path)), - progress=True, - ) - checkpoint = torch.load(checkpoint_path)["params_ema"] - cf.load_state_dict(checkpoint) - cf.eval() - - image = image.convert("RGB") - # Codeformer expects a BGR np array; make array and flip channels - bgr_image_array = np.array(image, dtype=np.uint8)[..., ::-1] - - face_helper = FaceRestoreHelper( - upscale_factor=1, - use_parse=True, - device=device, - model_rootpath = self.globals.model_path / 'core/face_restoration/gfpgan/weights' - ) - face_helper.clean_all() - face_helper.read_image(bgr_image_array) - face_helper.get_face_landmarks_5(resize=640, eye_dist_threshold=5) - face_helper.align_warp_face() - - for idx, cropped_face in enumerate(face_helper.cropped_faces): - cropped_face_t = img2tensor( - cropped_face / 255.0, bgr2rgb=True, float32=True - ) - normalize( - cropped_face_t, (0.5, 0.5, 0.5), (0.5, 0.5, 0.5), inplace=True - ) - cropped_face_t = cropped_face_t.unsqueeze(0).to(device) - - try: - with torch.no_grad(): - output = cf(cropped_face_t, w=fidelity, adain=True)[0] - restored_face = tensor2img( - output.squeeze(0), rgb2bgr=True, min_max=(-1, 1) - ) - del output - torch.cuda.empty_cache() - except RuntimeError as error: - logger.error(f"Failed inference for CodeFormer: {error}.") - restored_face = cropped_face - - restored_face = restored_face.astype("uint8") - face_helper.add_restored_face(restored_face) - - face_helper.get_inverse_affine(None) - - restored_img = face_helper.paste_faces_to_input_image() - - # Flip the channels back to RGB - res = Image.fromarray(restored_img[..., ::-1]) - - if strength < 1.0: - # Resize the image to the new image if the sizes have changed - if restored_img.size != image.size: - image = image.resize(res.size) - res = Image.blend(image, res, strength) - - cf = None - - return res diff --git a/invokeai/backend/restoration/codeformer_arch.py b/invokeai/backend/restoration/codeformer_arch.py deleted file mode 100644 index 0f6b881020..0000000000 --- a/invokeai/backend/restoration/codeformer_arch.py +++ /dev/null @@ -1,325 +0,0 @@ -import math -from typing import List, Optional - -import numpy as np -import torch -import torch.nn.functional as F -from basicsr.utils import get_root_logger -from basicsr.utils.registry import ARCH_REGISTRY -from torch import Tensor, nn - -from .vqgan_arch import * - - -def calc_mean_std(feat, eps=1e-5): - """Calculate mean and std for adaptive_instance_normalization. - - Args: - feat (Tensor): 4D tensor. - eps (float): A small value added to the variance to avoid - divide-by-zero. Default: 1e-5. - """ - size = feat.size() - assert len(size) == 4, "The input feature should be 4D tensor." - b, c = size[:2] - feat_var = feat.view(b, c, -1).var(dim=2) + eps - feat_std = feat_var.sqrt().view(b, c, 1, 1) - feat_mean = feat.view(b, c, -1).mean(dim=2).view(b, c, 1, 1) - return feat_mean, feat_std - - -def adaptive_instance_normalization(content_feat, style_feat): - """Adaptive instance normalization. - - Adjust the reference features to have the similar color and illuminations - as those in the degradate features. - - Args: - content_feat (Tensor): The reference feature. - style_feat (Tensor): The degradate features. - """ - size = content_feat.size() - style_mean, style_std = calc_mean_std(style_feat) - content_mean, content_std = calc_mean_std(content_feat) - normalized_feat = (content_feat - content_mean.expand(size)) / content_std.expand( - size - ) - return normalized_feat * style_std.expand(size) + style_mean.expand(size) - - -class PositionEmbeddingSine(nn.Module): - """ - This is a more standard version of the position embedding, very similar to the one - used by the Attention is all you need paper, generalized to work on images. - """ - - def __init__( - self, num_pos_feats=64, temperature=10000, normalize=False, scale=None - ): - super().__init__() - self.num_pos_feats = num_pos_feats - self.temperature = temperature - self.normalize = normalize - if scale is not None and normalize is False: - raise ValueError("normalize should be True if scale is passed") - if scale is None: - scale = 2 * math.pi - self.scale = scale - - def forward(self, x, mask=None): - if mask is None: - mask = torch.zeros( - (x.size(0), x.size(2), x.size(3)), device=x.device, dtype=torch.bool - ) - not_mask = ~mask - y_embed = not_mask.cumsum(1, dtype=torch.float32) - x_embed = not_mask.cumsum(2, dtype=torch.float32) - if self.normalize: - eps = 1e-6 - y_embed = y_embed / (y_embed[:, -1:, :] + eps) * self.scale - x_embed = x_embed / (x_embed[:, :, -1:] + eps) * self.scale - - dim_t = torch.arange(self.num_pos_feats, dtype=torch.float32, device=x.device) - dim_t = self.temperature ** (2 * (dim_t // 2) / self.num_pos_feats) - - pos_x = x_embed[:, :, :, None] / dim_t - pos_y = y_embed[:, :, :, None] / dim_t - pos_x = torch.stack( - (pos_x[:, :, :, 0::2].sin(), pos_x[:, :, :, 1::2].cos()), dim=4 - ).flatten(3) - pos_y = torch.stack( - (pos_y[:, :, :, 0::2].sin(), pos_y[:, :, :, 1::2].cos()), dim=4 - ).flatten(3) - pos = torch.cat((pos_y, pos_x), dim=3).permute(0, 3, 1, 2) - return pos - - -def _get_activation_fn(activation): - """Return an activation function given a string""" - if activation == "relu": - return F.relu - if activation == "gelu": - return F.gelu - if activation == "glu": - return F.glu - raise RuntimeError(f"activation should be relu/gelu, not {activation}.") - - -class TransformerSALayer(nn.Module): - def __init__( - self, embed_dim, nhead=8, dim_mlp=2048, dropout=0.0, activation="gelu" - ): - super().__init__() - self.self_attn = nn.MultiheadAttention(embed_dim, nhead, dropout=dropout) - # Implementation of Feedforward model - MLP - self.linear1 = nn.Linear(embed_dim, dim_mlp) - self.dropout = nn.Dropout(dropout) - self.linear2 = nn.Linear(dim_mlp, embed_dim) - - self.norm1 = nn.LayerNorm(embed_dim) - self.norm2 = nn.LayerNorm(embed_dim) - self.dropout1 = nn.Dropout(dropout) - self.dropout2 = nn.Dropout(dropout) - - self.activation = _get_activation_fn(activation) - - def with_pos_embed(self, tensor, pos: Optional[Tensor]): - return tensor if pos is None else tensor + pos - - def forward( - self, - tgt, - tgt_mask: Optional[Tensor] = None, - tgt_key_padding_mask: Optional[Tensor] = None, - query_pos: Optional[Tensor] = None, - ): - # self attention - tgt2 = self.norm1(tgt) - q = k = self.with_pos_embed(tgt2, query_pos) - tgt2 = self.self_attn( - q, k, value=tgt2, attn_mask=tgt_mask, key_padding_mask=tgt_key_padding_mask - )[0] - tgt = tgt + self.dropout1(tgt2) - - # ffn - tgt2 = self.norm2(tgt) - tgt2 = self.linear2(self.dropout(self.activation(self.linear1(tgt2)))) - tgt = tgt + self.dropout2(tgt2) - return tgt - - -class Fuse_sft_block(nn.Module): - def __init__(self, in_ch, out_ch): - super().__init__() - self.encode_enc = ResBlock(2 * in_ch, out_ch) - - self.scale = nn.Sequential( - nn.Conv2d(in_ch, out_ch, kernel_size=3, padding=1), - nn.LeakyReLU(0.2, True), - nn.Conv2d(out_ch, out_ch, kernel_size=3, padding=1), - ) - - self.shift = nn.Sequential( - nn.Conv2d(in_ch, out_ch, kernel_size=3, padding=1), - nn.LeakyReLU(0.2, True), - nn.Conv2d(out_ch, out_ch, kernel_size=3, padding=1), - ) - - def forward(self, enc_feat, dec_feat, w=1): - enc_feat = self.encode_enc(torch.cat([enc_feat, dec_feat], dim=1)) - scale = self.scale(enc_feat) - shift = self.shift(enc_feat) - residual = w * (dec_feat * scale + shift) - out = dec_feat + residual - return out - - -@ARCH_REGISTRY.register() -class CodeFormer(VQAutoEncoder): - def __init__( - self, - dim_embd=512, - n_head=8, - n_layers=9, - codebook_size=1024, - latent_size=256, - connect_list=["32", "64", "128", "256"], - fix_modules=["quantize", "generator"], - ): - super(CodeFormer, self).__init__( - 512, 64, [1, 2, 2, 4, 4, 8], "nearest", 2, [16], codebook_size - ) - - if fix_modules is not None: - for module in fix_modules: - for param in getattr(self, module).parameters(): - param.requires_grad = False - - self.connect_list = connect_list - self.n_layers = n_layers - self.dim_embd = dim_embd - self.dim_mlp = dim_embd * 2 - - self.position_emb = nn.Parameter(torch.zeros(latent_size, self.dim_embd)) - self.feat_emb = nn.Linear(256, self.dim_embd) - - # transformer - self.ft_layers = nn.Sequential( - *[ - TransformerSALayer( - embed_dim=dim_embd, nhead=n_head, dim_mlp=self.dim_mlp, dropout=0.0 - ) - for _ in range(self.n_layers) - ] - ) - - # logits_predict head - self.idx_pred_layer = nn.Sequential( - nn.LayerNorm(dim_embd), nn.Linear(dim_embd, codebook_size, bias=False) - ) - - self.channels = { - "16": 512, - "32": 256, - "64": 256, - "128": 128, - "256": 128, - "512": 64, - } - - # after second residual block for > 16, before attn layer for ==16 - self.fuse_encoder_block = { - "512": 2, - "256": 5, - "128": 8, - "64": 11, - "32": 14, - "16": 18, - } - # after first residual block for > 16, before attn layer for ==16 - self.fuse_generator_block = { - "16": 6, - "32": 9, - "64": 12, - "128": 15, - "256": 18, - "512": 21, - } - - # fuse_convs_dict - self.fuse_convs_dict = nn.ModuleDict() - for f_size in self.connect_list: - in_ch = self.channels[f_size] - self.fuse_convs_dict[f_size] = Fuse_sft_block(in_ch, in_ch) - - def _init_weights(self, module): - if isinstance(module, (nn.Linear, nn.Embedding)): - module.weight.data.normal_(mean=0.0, std=0.02) - if isinstance(module, nn.Linear) and module.bias is not None: - module.bias.data.zero_() - elif isinstance(module, nn.LayerNorm): - module.bias.data.zero_() - module.weight.data.fill_(1.0) - - def forward(self, x, w=0, detach_16=True, code_only=False, adain=False): - # ################### Encoder ##################### - enc_feat_dict = {} - out_list = [self.fuse_encoder_block[f_size] for f_size in self.connect_list] - for i, block in enumerate(self.encoder.blocks): - x = block(x) - if i in out_list: - enc_feat_dict[str(x.shape[-1])] = x.clone() - - lq_feat = x - # ################# Transformer ################### - # quant_feat, codebook_loss, quant_stats = self.quantize(lq_feat) - pos_emb = self.position_emb.unsqueeze(1).repeat(1, x.shape[0], 1) - # BCHW -> BC(HW) -> (HW)BC - feat_emb = self.feat_emb(lq_feat.flatten(2).permute(2, 0, 1)) - query_emb = feat_emb - # Transformer encoder - for layer in self.ft_layers: - query_emb = layer(query_emb, query_pos=pos_emb) - - # output logits - logits = self.idx_pred_layer(query_emb) # (hw)bn - logits = logits.permute(1, 0, 2) # (hw)bn -> b(hw)n - - if code_only: # for training stage II - # logits doesn't need softmax before cross_entropy loss - return logits, lq_feat - - # ################# Quantization ################### - # if self.training: - # quant_feat = torch.einsum('btn,nc->btc', [soft_one_hot, self.quantize.embedding.weight]) - # # b(hw)c -> bc(hw) -> bchw - # quant_feat = quant_feat.permute(0,2,1).view(lq_feat.shape) - # ------------ - soft_one_hot = F.softmax(logits, dim=2) - _, top_idx = torch.topk(soft_one_hot, 1, dim=2) - quant_feat = self.quantize.get_codebook_feat( - top_idx, shape=[x.shape[0], 16, 16, 256] - ) - # preserve gradients - # quant_feat = lq_feat + (quant_feat - lq_feat).detach() - - if detach_16: - quant_feat = quant_feat.detach() # for training stage III - if adain: - quant_feat = adaptive_instance_normalization(quant_feat, lq_feat) - - # ################## Generator #################### - x = quant_feat - fuse_list = [self.fuse_generator_block[f_size] for f_size in self.connect_list] - - for i, block in enumerate(self.generator.blocks): - x = block(x) - if i in fuse_list: # fuse after i-th block - f_size = str(x.shape[-1]) - if w > 0: - x = self.fuse_convs_dict[f_size]( - enc_feat_dict[f_size].detach(), x, w - ) - out = x - # logits doesn't need softmax before cross_entropy loss - return out, logits, lq_feat diff --git a/invokeai/backend/restoration/gfpgan.py b/invokeai/backend/restoration/gfpgan.py deleted file mode 100644 index 927d026c0c..0000000000 --- a/invokeai/backend/restoration/gfpgan.py +++ /dev/null @@ -1,84 +0,0 @@ -import os -import sys -import warnings - -import numpy as np -import torch -from PIL import Image - -import invokeai.backend.util.logging as logger -from invokeai.app.services.config import InvokeAIAppConfig - -class GFPGAN: - def __init__(self, gfpgan_model_path="models/gfpgan/GFPGANv1.4.pth") -> None: - self.globals = InvokeAIAppConfig.get_config() - if not os.path.isabs(gfpgan_model_path): - gfpgan_model_path = self.globals.root_dir / gfpgan_model_path - self.model_path = gfpgan_model_path - self.gfpgan_model_exists = os.path.isfile(self.model_path) - - if not self.gfpgan_model_exists: - logger.error(f"NOT FOUND: GFPGAN model not found at {self.model_path}") - return None - - def model_exists(self): - return os.path.isfile(self.model_path) - - def process(self, image, strength: float, seed: str = None): - if seed is not None: - logger.info(f"GFPGAN - Restoring Faces for image seed:{seed}") - - with warnings.catch_warnings(): - warnings.filterwarnings("ignore", category=DeprecationWarning) - warnings.filterwarnings("ignore", category=UserWarning) - cwd = os.getcwd() - os.chdir(self.globals.root_dir / 'models') - try: - from gfpgan import GFPGANer - - self.gfpgan = GFPGANer( - model_path=self.model_path, - upscale=1, - arch="clean", - channel_multiplier=2, - bg_upsampler=None, - ) - except Exception: - import traceback - - logger.error("Error loading GFPGAN:", file=sys.stderr) - print(traceback.format_exc(), file=sys.stderr) - os.chdir(cwd) - - if self.gfpgan is None: - logger.warning("WARNING: GFPGAN not initialized.") - logger.warning( - f"Download https://github.com/TencentARC/GFPGAN/releases/download/v1.3.0/GFPGANv1.4.pth to {self.model_path}" - ) - - image = image.convert("RGB") - - # GFPGAN expects a BGR np array; make array and flip channels - bgr_image_array = np.array(image, dtype=np.uint8)[..., ::-1] - - _, _, restored_img = self.gfpgan.enhance( - bgr_image_array, - has_aligned=False, - only_center_face=False, - paste_back=True, - ) - - # Flip the channels back to RGB - res = Image.fromarray(restored_img[..., ::-1]) - - if strength < 1.0: - # Resize the image to the new image if the sizes have changed - if restored_img.size != image.size: - image = image.resize(res.size) - res = Image.blend(image, res, strength) - - if torch.cuda.is_available(): - torch.cuda.empty_cache() - self.gfpgan = None - - return res diff --git a/invokeai/backend/restoration/outcrop.py b/invokeai/backend/restoration/outcrop.py deleted file mode 100644 index 07f76d6bf9..0000000000 --- a/invokeai/backend/restoration/outcrop.py +++ /dev/null @@ -1,118 +0,0 @@ -import math - -from PIL import Image -import invokeai.backend.util.logging as logger - -class Outcrop(object): - def __init__( - self, - image, - generate, # current generate object - ): - self.image = image - self.generate = generate - - def process( - self, - extents: dict, - opt, # current options - orig_opt, # ones originally used to generate the image - image_callback=None, - prefix=None, - ): - # grow and mask the image - extended_image = self._extend_all(extents) - - # switch samplers temporarily - curr_sampler = self.generate.sampler - self.generate.sampler_name = opt.sampler_name - self.generate._set_scheduler() - - def wrapped_callback(img, seed, **kwargs): - preferred_seed = ( - orig_opt.seed - if orig_opt.seed is not None and orig_opt.seed >= 0 - else seed - ) - image_callback(img, preferred_seed, use_prefix=prefix, **kwargs) - - result = self.generate.prompt2image( - opt.prompt, - seed=opt.seed or orig_opt.seed, - sampler=self.generate.sampler, - steps=opt.steps, - cfg_scale=opt.cfg_scale, - ddim_eta=self.generate.ddim_eta, - width=extended_image.width, - height=extended_image.height, - init_img=extended_image, - strength=0.90, - image_callback=wrapped_callback if image_callback else None, - seam_size=opt.seam_size or 96, - seam_blur=opt.seam_blur or 16, - seam_strength=opt.seam_strength or 0.7, - seam_steps=20, - tile_size=32, - color_match=True, - force_outpaint=True, # this just stops the warning about erased regions - ) - - # swap sampler back - self.generate.sampler = curr_sampler - return result - - def _extend_all( - self, - extents: dict, - ) -> Image: - """ - Extend the image in direction ('top','bottom','left','right') by - the indicated value. The image canvas is extended, and the empty - rectangular section will be filled with a blurred copy of the - adjacent image. - """ - image = self.image - for direction in extents: - assert direction in [ - "top", - "left", - "bottom", - "right", - ], 'Direction must be one of "top", "left", "bottom", "right"' - pixels = extents[direction] - # round pixels up to the nearest 64 - pixels = math.ceil(pixels / 64) * 64 - logger.info(f"extending image {direction}ward by {pixels} pixels") - image = self._rotate(image, direction) - image = self._extend(image, pixels) - image = self._rotate(image, direction, reverse=True) - return image - - def _rotate(self, image: Image, direction: str, reverse=False) -> Image: - """ - Rotates image so that the area to extend is always at the top top. - Simplifies logic later. The reverse argument, if true, will undo the - previous transpose. - """ - transposes = { - "right": ["ROTATE_90", "ROTATE_270"], - "bottom": ["ROTATE_180", "ROTATE_180"], - "left": ["ROTATE_270", "ROTATE_90"], - } - if direction not in transposes: - return image - transpose = transposes[direction][1 if reverse else 0] - return image.transpose(Image.Transpose.__dict__[transpose]) - - def _extend(self, image: Image, pixels: int) -> Image: - extended_img = Image.new("RGBA", (image.width, image.height + pixels)) - - extended_img.paste((0, 0, 0), [0, 0, image.width, image.height + pixels]) - extended_img.paste(image, box=(0, pixels)) - - # now make the top part transparent to use as a mask - alpha = extended_img.getchannel("A") - alpha.paste(0, (0, 0, extended_img.width, pixels)) - extended_img.putalpha(alpha) - - return extended_img diff --git a/invokeai/backend/restoration/outpaint.py b/invokeai/backend/restoration/outpaint.py deleted file mode 100644 index 184db10fa3..0000000000 --- a/invokeai/backend/restoration/outpaint.py +++ /dev/null @@ -1,102 +0,0 @@ -import math -import warnings - -from PIL import Image, ImageFilter - - -class Outpaint(object): - def __init__(self, image, generate): - self.image = image - self.generate = generate - - def process(self, opt, old_opt, image_callback=None, prefix=None): - image = self._create_outpaint_image(self.image, opt.out_direction) - - seed = old_opt.seed - prompt = old_opt.prompt - - def wrapped_callback(img, seed, **kwargs): - image_callback(img, seed, use_prefix=prefix, **kwargs) - - return self.generate.prompt2image( - prompt, - seed=seed, - sampler=self.generate.sampler, - steps=opt.steps, - cfg_scale=opt.cfg_scale, - ddim_eta=self.generate.ddim_eta, - width=opt.width, - height=opt.height, - init_img=image, - strength=0.83, - image_callback=wrapped_callback, - prefix=prefix, - ) - - def _create_outpaint_image(self, image, direction_args): - assert len(direction_args) in [ - 1, - 2, - ], "Direction (-D) must have exactly one or two arguments." - - if len(direction_args) == 1: - direction = direction_args[0] - pixels = None - elif len(direction_args) == 2: - direction = direction_args[0] - pixels = int(direction_args[1]) - - assert direction in [ - "top", - "left", - "bottom", - "right", - ], 'Direction (-D) must be one of "top", "left", "bottom", "right"' - - image = image.convert("RGBA") - # we always extend top, but rotate to extend along the requested side - if direction == "left": - image = image.transpose(Image.Transpose.ROTATE_270) - elif direction == "bottom": - image = image.transpose(Image.Transpose.ROTATE_180) - elif direction == "right": - image = image.transpose(Image.Transpose.ROTATE_90) - - pixels = image.height // 2 if pixels is None else int(pixels) - assert ( - 0 < pixels < image.height - ), "Direction (-D) pixels length must be in the range 0 - image.size" - - # the top part of the image is taken from the source image mirrored - # coordinates (0,0) are the upper left corner of an image - top = image.transpose(Image.Transpose.FLIP_TOP_BOTTOM).convert("RGBA") - top = top.crop((0, top.height - pixels, top.width, top.height)) - - # setting all alpha of the top part to 0 - alpha = top.getchannel("A") - alpha.paste(0, (0, 0, top.width, top.height)) - top.putalpha(alpha) - - # taking the bottom from the original image - bottom = image.crop((0, 0, image.width, image.height - pixels)) - - new_img = image.copy() - new_img.paste(top, (0, 0)) - new_img.paste(bottom, (0, pixels)) - - # create a 10% dither in the middle - dither = min(image.height // 10, pixels) - for x in range(0, image.width, 2): - for y in range(pixels - dither, pixels + dither): - (r, g, b, a) = new_img.getpixel((x, y)) - new_img.putpixel((x, y), (r, g, b, 0)) - - # let's rotate back again - if direction == "left": - new_img = new_img.transpose(Image.Transpose.ROTATE_90) - elif direction == "bottom": - new_img = new_img.transpose(Image.Transpose.ROTATE_180) - elif direction == "right": - new_img = new_img.transpose(Image.Transpose.ROTATE_270) - - return new_img diff --git a/invokeai/backend/restoration/realesrgan.py b/invokeai/backend/restoration/realesrgan.py deleted file mode 100644 index 1f29ceadba..0000000000 --- a/invokeai/backend/restoration/realesrgan.py +++ /dev/null @@ -1,104 +0,0 @@ -import warnings - -import numpy as np -import torch -from PIL import Image -from PIL.Image import Image as ImageType - -import invokeai.backend.util.logging as logger -from invokeai.app.services.config import InvokeAIAppConfig -config = InvokeAIAppConfig.get_config() - -class ESRGAN: - def __init__(self, bg_tile_size=400) -> None: - self.bg_tile_size = bg_tile_size - - def load_esrgan_bg_upsampler(self, denoise_str): - if not torch.cuda.is_available(): # CPU or MPS on M1 - use_half_precision = False - else: - use_half_precision = True - - from realesrgan import RealESRGANer - from realesrgan.archs.srvgg_arch import SRVGGNetCompact - - model = SRVGGNetCompact( - num_in_ch=3, - num_out_ch=3, - num_feat=64, - num_conv=32, - upscale=4, - act_type="prelu", - ) - model_path = config.models_path / "core/upscaling/realesrgan/realesr-general-x4v3.pth" - wdn_model_path = config.models_path / "core/upscaling/realesrgan/realesr-general-wdn-x4v3.pth" - scale = 4 - - bg_upsampler = RealESRGANer( - scale=scale, - model_path=[model_path, wdn_model_path], - model=model, - tile=self.bg_tile_size, - dni_weight=[denoise_str, 1 - denoise_str], - tile_pad=10, - pre_pad=0, - half=use_half_precision, - ) - - return bg_upsampler - - def process( - self, - image: ImageType, - strength: float, - seed: str = None, - upsampler_scale: int = 2, - denoise_str: float = 0.75, - ): - with warnings.catch_warnings(): - warnings.filterwarnings("ignore", category=DeprecationWarning) - warnings.filterwarnings("ignore", category=UserWarning) - - try: - upsampler = self.load_esrgan_bg_upsampler(denoise_str) - except Exception: - import sys - import traceback - - logger.error("Error loading Real-ESRGAN:") - print(traceback.format_exc(), file=sys.stderr) - - if upsampler_scale == 0: - logger.warning("Real-ESRGAN: Invalid scaling option. Image not upscaled.") - return image - - if seed is not None: - logger.info( - f"Real-ESRGAN Upscaling seed:{seed}, scale:{upsampler_scale}x, tile:{self.bg_tile_size}, denoise:{denoise_str}" - ) - # ESRGAN outputs images with partial transparency if given RGBA images; convert to RGB - image = image.convert("RGB") - - # REALSRGAN expects a BGR np array; make array and flip channels - bgr_image_array = np.array(image, dtype=np.uint8)[..., ::-1] - - output, _ = upsampler.enhance( - bgr_image_array, - outscale=upsampler_scale, - alpha_upsampler="realesrgan", - ) - - # Flip the channels back to RGB - res = Image.fromarray(output[..., ::-1]) - - if strength < 1.0: - # Resize the image to the new image if the sizes have changed - if output.size != image.size: - image = image.resize(res.size) - res = Image.blend(image, res, strength) - - if torch.cuda.is_available(): - torch.cuda.empty_cache() - upsampler = None - - return res diff --git a/invokeai/backend/restoration/vqgan_arch.py b/invokeai/backend/restoration/vqgan_arch.py deleted file mode 100644 index 96d5f04eee..0000000000 --- a/invokeai/backend/restoration/vqgan_arch.py +++ /dev/null @@ -1,514 +0,0 @@ -""" -VQGAN code, adapted from the original created by the Unleashing Transformers authors: -https://github.com/samb-t/unleashing-transformers/blob/master/models/vqgan.py - -""" -import copy - -import numpy as np -import torch -import torch.nn as nn -import torch.nn.functional as F -from basicsr.utils import get_root_logger -from basicsr.utils.registry import ARCH_REGISTRY - - -def normalize(in_channels): - return torch.nn.GroupNorm( - num_groups=32, num_channels=in_channels, eps=1e-6, affine=True - ) - - -@torch.jit.script -def swish(x): - return x * torch.sigmoid(x) - - -# Define VQVAE classes -class VectorQuantizer(nn.Module): - def __init__(self, codebook_size, emb_dim, beta): - super(VectorQuantizer, self).__init__() - self.codebook_size = codebook_size # number of embeddings - self.emb_dim = emb_dim # dimension of embedding - self.beta = beta # commitment cost used in loss term, beta * ||z_e(x)-sg[e]||^2 - self.embedding = nn.Embedding(self.codebook_size, self.emb_dim) - self.embedding.weight.data.uniform_( - -1.0 / self.codebook_size, 1.0 / self.codebook_size - ) - - def forward(self, z): - # reshape z -> (batch, height, width, channel) and flatten - z = z.permute(0, 2, 3, 1).contiguous() - z_flattened = z.view(-1, self.emb_dim) - - # distances from z to embeddings e_j (z - e)^2 = z^2 + e^2 - 2 e * z - d = ( - (z_flattened**2).sum(dim=1, keepdim=True) - + (self.embedding.weight**2).sum(1) - - 2 * torch.matmul(z_flattened, self.embedding.weight.t()) - ) - - mean_distance = torch.mean(d) - # find closest encodings - # min_encoding_indices = torch.argmin(d, dim=1).unsqueeze(1) - min_encoding_scores, min_encoding_indices = torch.topk( - d, 1, dim=1, largest=False - ) - # [0-1], higher score, higher confidence - min_encoding_scores = torch.exp(-min_encoding_scores / 10) - - min_encodings = torch.zeros( - min_encoding_indices.shape[0], self.codebook_size - ).to(z) - min_encodings.scatter_(1, min_encoding_indices, 1) - - # get quantized latent vectors - z_q = torch.matmul(min_encodings, self.embedding.weight).view(z.shape) - # compute loss for embedding - loss = torch.mean((z_q.detach() - z) ** 2) + self.beta * torch.mean( - (z_q - z.detach()) ** 2 - ) - # preserve gradients - z_q = z + (z_q - z).detach() - - # perplexity - e_mean = torch.mean(min_encodings, dim=0) - perplexity = torch.exp(-torch.sum(e_mean * torch.log(e_mean + 1e-10))) - # reshape back to match original input shape - z_q = z_q.permute(0, 3, 1, 2).contiguous() - - return ( - z_q, - loss, - { - "perplexity": perplexity, - "min_encodings": min_encodings, - "min_encoding_indices": min_encoding_indices, - "min_encoding_scores": min_encoding_scores, - "mean_distance": mean_distance, - }, - ) - - def get_codebook_feat(self, indices, shape): - # input indices: batch*token_num -> (batch*token_num)*1 - # shape: batch, height, width, channel - indices = indices.view(-1, 1) - min_encodings = torch.zeros(indices.shape[0], self.codebook_size).to(indices) - min_encodings.scatter_(1, indices, 1) - # get quantized latent vectors - z_q = torch.matmul(min_encodings.float(), self.embedding.weight) - - if shape is not None: # reshape back to match original input shape - z_q = z_q.view(shape).permute(0, 3, 1, 2).contiguous() - - return z_q - - -class GumbelQuantizer(nn.Module): - def __init__( - self, - codebook_size, - emb_dim, - num_hiddens, - straight_through=False, - kl_weight=5e-4, - temp_init=1.0, - ): - super().__init__() - self.codebook_size = codebook_size # number of embeddings - self.emb_dim = emb_dim # dimension of embedding - self.straight_through = straight_through - self.temperature = temp_init - self.kl_weight = kl_weight - self.proj = nn.Conv2d( - num_hiddens, codebook_size, 1 - ) # projects last encoder layer to quantized logits - self.embed = nn.Embedding(codebook_size, emb_dim) - - def forward(self, z): - hard = self.straight_through if self.training else True - - logits = self.proj(z) - - soft_one_hot = F.gumbel_softmax(logits, tau=self.temperature, dim=1, hard=hard) - - z_q = torch.einsum("b n h w, n d -> b d h w", soft_one_hot, self.embed.weight) - - # + kl divergence to the prior loss - qy = F.softmax(logits, dim=1) - diff = ( - self.kl_weight - * torch.sum(qy * torch.log(qy * self.codebook_size + 1e-10), dim=1).mean() - ) - min_encoding_indices = soft_one_hot.argmax(dim=1) - - return z_q, diff, {"min_encoding_indices": min_encoding_indices} - - -class Downsample(nn.Module): - def __init__(self, in_channels): - super().__init__() - self.conv = torch.nn.Conv2d( - in_channels, in_channels, kernel_size=3, stride=2, padding=0 - ) - - def forward(self, x): - pad = (0, 1, 0, 1) - x = torch.nn.functional.pad(x, pad, mode="constant", value=0) - x = self.conv(x) - return x - - -class Upsample(nn.Module): - def __init__(self, in_channels): - super().__init__() - self.conv = nn.Conv2d( - in_channels, in_channels, kernel_size=3, stride=1, padding=1 - ) - - def forward(self, x): - x = F.interpolate(x, scale_factor=2.0, mode="nearest") - x = self.conv(x) - - return x - - -class ResBlock(nn.Module): - def __init__(self, in_channels, out_channels=None): - super(ResBlock, self).__init__() - self.in_channels = in_channels - self.out_channels = in_channels if out_channels is None else out_channels - self.norm1 = normalize(in_channels) - self.conv1 = nn.Conv2d( - in_channels, out_channels, kernel_size=3, stride=1, padding=1 - ) - self.norm2 = normalize(out_channels) - self.conv2 = nn.Conv2d( - out_channels, out_channels, kernel_size=3, stride=1, padding=1 - ) - if self.in_channels != self.out_channels: - self.conv_out = nn.Conv2d( - in_channels, out_channels, kernel_size=1, stride=1, padding=0 - ) - - def forward(self, x_in): - x = x_in - x = self.norm1(x) - x = swish(x) - x = self.conv1(x) - x = self.norm2(x) - x = swish(x) - x = self.conv2(x) - if self.in_channels != self.out_channels: - x_in = self.conv_out(x_in) - - return x + x_in - - -class AttnBlock(nn.Module): - def __init__(self, in_channels): - super().__init__() - self.in_channels = in_channels - - self.norm = normalize(in_channels) - self.q = torch.nn.Conv2d( - in_channels, in_channels, kernel_size=1, stride=1, padding=0 - ) - self.k = torch.nn.Conv2d( - in_channels, in_channels, kernel_size=1, stride=1, padding=0 - ) - self.v = torch.nn.Conv2d( - in_channels, in_channels, kernel_size=1, stride=1, padding=0 - ) - self.proj_out = torch.nn.Conv2d( - in_channels, in_channels, kernel_size=1, stride=1, padding=0 - ) - - def forward(self, x): - h_ = x - h_ = self.norm(h_) - q = self.q(h_) - k = self.k(h_) - v = self.v(h_) - - # compute attention - b, c, h, w = q.shape - q = q.reshape(b, c, h * w) - q = q.permute(0, 2, 1) - k = k.reshape(b, c, h * w) - w_ = torch.bmm(q, k) - w_ = w_ * (int(c) ** (-0.5)) - w_ = F.softmax(w_, dim=2) - - # attend to values - v = v.reshape(b, c, h * w) - w_ = w_.permute(0, 2, 1) - h_ = torch.bmm(v, w_) - h_ = h_.reshape(b, c, h, w) - - h_ = self.proj_out(h_) - - return x + h_ - - -class Encoder(nn.Module): - def __init__( - self, - in_channels, - nf, - emb_dim, - ch_mult, - num_res_blocks, - resolution, - attn_resolutions, - ): - super().__init__() - self.nf = nf - self.num_resolutions = len(ch_mult) - self.num_res_blocks = num_res_blocks - self.resolution = resolution - self.attn_resolutions = attn_resolutions - - curr_res = self.resolution - in_ch_mult = (1,) + tuple(ch_mult) - - blocks = [] - # initial convultion - blocks.append(nn.Conv2d(in_channels, nf, kernel_size=3, stride=1, padding=1)) - - # residual and downsampling blocks, with attention on smaller res (16x16) - for i in range(self.num_resolutions): - block_in_ch = nf * in_ch_mult[i] - block_out_ch = nf * ch_mult[i] - for _ in range(self.num_res_blocks): - blocks.append(ResBlock(block_in_ch, block_out_ch)) - block_in_ch = block_out_ch - if curr_res in attn_resolutions: - blocks.append(AttnBlock(block_in_ch)) - - if i != self.num_resolutions - 1: - blocks.append(Downsample(block_in_ch)) - curr_res = curr_res // 2 - - # non-local attention block - blocks.append(ResBlock(block_in_ch, block_in_ch)) - blocks.append(AttnBlock(block_in_ch)) - blocks.append(ResBlock(block_in_ch, block_in_ch)) - - # normalise and convert to latent size - blocks.append(normalize(block_in_ch)) - blocks.append( - nn.Conv2d(block_in_ch, emb_dim, kernel_size=3, stride=1, padding=1) - ) - self.blocks = nn.ModuleList(blocks) - - def forward(self, x): - for block in self.blocks: - x = block(x) - - return x - - -class Generator(nn.Module): - def __init__(self, nf, emb_dim, ch_mult, res_blocks, img_size, attn_resolutions): - super().__init__() - self.nf = nf - self.ch_mult = ch_mult - self.num_resolutions = len(self.ch_mult) - self.num_res_blocks = res_blocks - self.resolution = img_size - self.attn_resolutions = attn_resolutions - self.in_channels = emb_dim - self.out_channels = 3 - block_in_ch = self.nf * self.ch_mult[-1] - curr_res = self.resolution // 2 ** (self.num_resolutions - 1) - - blocks = [] - # initial conv - blocks.append( - nn.Conv2d(self.in_channels, block_in_ch, kernel_size=3, stride=1, padding=1) - ) - - # non-local attention block - blocks.append(ResBlock(block_in_ch, block_in_ch)) - blocks.append(AttnBlock(block_in_ch)) - blocks.append(ResBlock(block_in_ch, block_in_ch)) - - for i in reversed(range(self.num_resolutions)): - block_out_ch = self.nf * self.ch_mult[i] - - for _ in range(self.num_res_blocks): - blocks.append(ResBlock(block_in_ch, block_out_ch)) - block_in_ch = block_out_ch - - if curr_res in self.attn_resolutions: - blocks.append(AttnBlock(block_in_ch)) - - if i != 0: - blocks.append(Upsample(block_in_ch)) - curr_res = curr_res * 2 - - blocks.append(normalize(block_in_ch)) - blocks.append( - nn.Conv2d( - block_in_ch, self.out_channels, kernel_size=3, stride=1, padding=1 - ) - ) - - self.blocks = nn.ModuleList(blocks) - - def forward(self, x): - for block in self.blocks: - x = block(x) - - return x - - -@ARCH_REGISTRY.register() -class VQAutoEncoder(nn.Module): - def __init__( - self, - img_size, - nf, - ch_mult, - quantizer="nearest", - res_blocks=2, - attn_resolutions=[16], - codebook_size=1024, - emb_dim=256, - beta=0.25, - gumbel_straight_through=False, - gumbel_kl_weight=1e-8, - model_path=None, - ): - super().__init__() - logger = get_root_logger() - self.in_channels = 3 - self.nf = nf - self.n_blocks = res_blocks - self.codebook_size = codebook_size - self.embed_dim = emb_dim - self.ch_mult = ch_mult - self.resolution = img_size - self.attn_resolutions = attn_resolutions - self.quantizer_type = quantizer - self.encoder = Encoder( - self.in_channels, - self.nf, - self.embed_dim, - self.ch_mult, - self.n_blocks, - self.resolution, - self.attn_resolutions, - ) - if self.quantizer_type == "nearest": - self.beta = beta # 0.25 - self.quantize = VectorQuantizer( - self.codebook_size, self.embed_dim, self.beta - ) - elif self.quantizer_type == "gumbel": - self.gumbel_num_hiddens = emb_dim - self.straight_through = gumbel_straight_through - self.kl_weight = gumbel_kl_weight - self.quantize = GumbelQuantizer( - self.codebook_size, - self.embed_dim, - self.gumbel_num_hiddens, - self.straight_through, - self.kl_weight, - ) - self.generator = Generator( - self.nf, - self.embed_dim, - self.ch_mult, - self.n_blocks, - self.resolution, - self.attn_resolutions, - ) - - if model_path is not None: - chkpt = torch.load(model_path, map_location="cpu") - if "params_ema" in chkpt: - self.load_state_dict( - torch.load(model_path, map_location="cpu")["params_ema"] - ) - logger.info(f"vqgan is loaded from: {model_path} [params_ema]") - elif "params" in chkpt: - self.load_state_dict( - torch.load(model_path, map_location="cpu")["params"] - ) - logger.info(f"vqgan is loaded from: {model_path} [params]") - else: - raise ValueError(f"Wrong params!") - - def forward(self, x): - x = self.encoder(x) - quant, codebook_loss, quant_stats = self.quantize(x) - x = self.generator(quant) - return x, codebook_loss, quant_stats - - -# patch based discriminator -@ARCH_REGISTRY.register() -class VQGANDiscriminator(nn.Module): - def __init__(self, nc=3, ndf=64, n_layers=4, model_path=None): - super().__init__() - - layers = [ - nn.Conv2d(nc, ndf, kernel_size=4, stride=2, padding=1), - nn.LeakyReLU(0.2, True), - ] - ndf_mult = 1 - ndf_mult_prev = 1 - for n in range(1, n_layers): # gradually increase the number of filters - ndf_mult_prev = ndf_mult - ndf_mult = min(2**n, 8) - layers += [ - nn.Conv2d( - ndf * ndf_mult_prev, - ndf * ndf_mult, - kernel_size=4, - stride=2, - padding=1, - bias=False, - ), - nn.BatchNorm2d(ndf * ndf_mult), - nn.LeakyReLU(0.2, True), - ] - - ndf_mult_prev = ndf_mult - ndf_mult = min(2**n_layers, 8) - - layers += [ - nn.Conv2d( - ndf * ndf_mult_prev, - ndf * ndf_mult, - kernel_size=4, - stride=1, - padding=1, - bias=False, - ), - nn.BatchNorm2d(ndf * ndf_mult), - nn.LeakyReLU(0.2, True), - ] - - layers += [ - nn.Conv2d(ndf * ndf_mult, 1, kernel_size=4, stride=1, padding=1) - ] # output 1 channel prediction map - self.main = nn.Sequential(*layers) - - if model_path is not None: - chkpt = torch.load(model_path, map_location="cpu") - if "params_d" in chkpt: - self.load_state_dict( - torch.load(model_path, map_location="cpu")["params_d"] - ) - elif "params" in chkpt: - self.load_state_dict( - torch.load(model_path, map_location="cpu")["params"] - ) - else: - raise ValueError(f"Wrong params!") - - def forward(self, x): - return self.main(x) diff --git a/invokeai/backend/stable_diffusion/diffusers_pipeline.py b/invokeai/backend/stable_diffusion/diffusers_pipeline.py index 1d701b21fd..228fbd0585 100644 --- a/invokeai/backend/stable_diffusion/diffusers_pipeline.py +++ b/invokeai/backend/stable_diffusion/diffusers_pipeline.py @@ -221,7 +221,7 @@ class ControlNetData: control_mode: str = Field(default="balanced") -@dataclass(frozen=True) +@dataclass class ConditioningData: unconditioned_embeddings: torch.Tensor text_embeddings: torch.Tensor @@ -422,7 +422,6 @@ class StableDiffusionGeneratorPipeline(StableDiffusionPipeline): noise: torch.Tensor, callback: Callable[[PipelineIntermediateState], None] = None, run_id=None, - **kwargs, ) -> InvokeAIStableDiffusionPipelineOutput: r""" Function invoked when calling the pipeline for generation. @@ -443,7 +442,6 @@ class StableDiffusionGeneratorPipeline(StableDiffusionPipeline): noise=noise, run_id=run_id, callback=callback, - **kwargs, ) # https://discuss.huggingface.co/t/memory-usage-by-later-pipeline-stages/23699 torch.cuda.empty_cache() @@ -469,7 +467,6 @@ class StableDiffusionGeneratorPipeline(StableDiffusionPipeline): run_id=None, callback: Callable[[PipelineIntermediateState], None] = None, control_data: List[ControlNetData] = None, - **kwargs, ) -> tuple[torch.Tensor, Optional[AttentionMapSaver]]: if self.scheduler.config.get("cpu_only", False): scheduler_device = torch.device('cpu') @@ -487,11 +484,11 @@ class StableDiffusionGeneratorPipeline(StableDiffusionPipeline): timesteps, conditioning_data, noise=noise, - additional_guidance=additional_guidance, run_id=run_id, - callback=callback, + additional_guidance=additional_guidance, control_data=control_data, - **kwargs, + + callback=callback, ) return result.latents, result.attention_map_saver @@ -505,7 +502,6 @@ class StableDiffusionGeneratorPipeline(StableDiffusionPipeline): run_id: str = None, additional_guidance: List[Callable] = None, control_data: List[ControlNetData] = None, - **kwargs, ): self._adjust_memory_efficient_attention(latents) if run_id is None: @@ -546,7 +542,6 @@ class StableDiffusionGeneratorPipeline(StableDiffusionPipeline): total_step_count=len(timesteps), additional_guidance=additional_guidance, control_data=control_data, - **kwargs, ) latents = step_output.prev_sample @@ -588,7 +583,6 @@ class StableDiffusionGeneratorPipeline(StableDiffusionPipeline): total_step_count: int, additional_guidance: List[Callable] = None, control_data: List[ControlNetData] = None, - **kwargs, ): # invokeai_diffuser has batched timesteps, but diffusers schedulers expect a single value timestep = t[0] @@ -632,9 +626,12 @@ class StableDiffusionGeneratorPipeline(StableDiffusionPipeline): if cfg_injection: # only applying ControlNet to conditional instead of in unconditioned encoder_hidden_states = conditioning_data.text_embeddings + encoder_attention_mask = None else: - encoder_hidden_states = torch.cat([conditioning_data.unconditioned_embeddings, - conditioning_data.text_embeddings]) + encoder_hidden_states, encoder_attention_mask = self.invokeai_diffuser._concat_conditionings_for_batch( + conditioning_data.unconditioned_embeddings, + conditioning_data.text_embeddings, + ) if isinstance(control_datum.weight, list): # if controlnet has multiple weights, use the weight for the current step controlnet_weight = control_datum.weight[step_index] @@ -649,6 +646,7 @@ class StableDiffusionGeneratorPipeline(StableDiffusionPipeline): encoder_hidden_states=encoder_hidden_states, controlnet_cond=control_datum.image_tensor, conditioning_scale=controlnet_weight, # controlnet specific, NOT the guidance scale + encoder_attention_mask=encoder_attention_mask, guess_mode=soft_injection, # this is still called guess_mode in diffusers ControlNetModel return_dict=False, ) diff --git a/invokeai/backend/stable_diffusion/diffusion/shared_invokeai_diffusion.py b/invokeai/backend/stable_diffusion/diffusion/shared_invokeai_diffusion.py index 1175475bba..f44578cd47 100644 --- a/invokeai/backend/stable_diffusion/diffusion/shared_invokeai_diffusion.py +++ b/invokeai/backend/stable_diffusion/diffusion/shared_invokeai_diffusion.py @@ -237,15 +237,53 @@ class InvokeAIDiffuserComponent: ) return latents + def _concat_conditionings_for_batch(self, unconditioning, conditioning): + def _pad_conditioning(cond, target_len, encoder_attention_mask): + conditioning_attention_mask = torch.ones((cond.shape[0], cond.shape[1]), device=cond.device, dtype=cond.dtype) + + if cond.shape[1] < max_len: + conditioning_attention_mask = torch.cat([ + conditioning_attention_mask, + torch.zeros((cond.shape[0], max_len - cond.shape[1]), device=cond.device, dtype=cond.dtype), + ], dim=1) + + cond = torch.cat([ + cond, + torch.zeros((cond.shape[0], max_len - cond.shape[1], cond.shape[2]), device=cond.device, dtype=cond.dtype), + ], dim=1) + + if encoder_attention_mask is None: + encoder_attention_mask = conditioning_attention_mask + else: + encoder_attention_mask = torch.cat([ + encoder_attention_mask, + conditioning_attention_mask, + ]) + + return cond, encoder_attention_mask + + encoder_attention_mask = None + if unconditioning.shape[1] != conditioning.shape[1]: + max_len = max(unconditioning.shape[1], conditioning.shape[1]) + unconditioning, encoder_attention_mask = _pad_conditioning(unconditioning, max_len, encoder_attention_mask) + conditioning, encoder_attention_mask = _pad_conditioning(conditioning, max_len, encoder_attention_mask) + + return torch.cat([unconditioning, conditioning]), encoder_attention_mask + # methods below are called from do_diffusion_step and should be considered private to this class. def _apply_standard_conditioning(self, x, sigma, unconditioning, conditioning, **kwargs): # fast batched path x_twice = torch.cat([x] * 2) sigma_twice = torch.cat([sigma] * 2) - both_conditionings = torch.cat([unconditioning, conditioning]) + + both_conditionings, encoder_attention_mask = self._concat_conditionings_for_batch( + unconditioning, conditioning + ) both_results = self.model_forward_callback( - x_twice, sigma_twice, both_conditionings, **kwargs, + x_twice, sigma_twice, both_conditionings, + encoder_attention_mask=encoder_attention_mask, + **kwargs, ) unconditioned_next_x, conditioned_next_x = both_results.chunk(2) return unconditioned_next_x, conditioned_next_x @@ -259,8 +297,32 @@ class InvokeAIDiffuserComponent: **kwargs, ): # low-memory sequential path - unconditioned_next_x = self.model_forward_callback(x, sigma, unconditioning, **kwargs) - conditioned_next_x = self.model_forward_callback(x, sigma, conditioning, **kwargs) + uncond_down_block, cond_down_block = None, None + down_block_additional_residuals = kwargs.pop("down_block_additional_residuals", None) + if down_block_additional_residuals is not None: + uncond_down_block, cond_down_block = [], [] + for down_block in down_block_additional_residuals: + _uncond_down, _cond_down = down_block.chunk(2) + uncond_down_block.append(_uncond_down) + cond_down_block.append(_cond_down) + + uncond_mid_block, cond_mid_block = None, None + mid_block_additional_residual = kwargs.pop("mid_block_additional_residual", None) + if mid_block_additional_residual is not None: + uncond_mid_block, cond_mid_block = mid_block_additional_residual.chunk(2) + + unconditioned_next_x = self.model_forward_callback( + x, sigma, unconditioning, + down_block_additional_residuals=uncond_down_block, + mid_block_additional_residual=uncond_mid_block, + **kwargs, + ) + conditioned_next_x = self.model_forward_callback( + x, sigma, conditioning, + down_block_additional_residuals=cond_down_block, + mid_block_additional_residual=cond_mid_block, + **kwargs, + ) return unconditioned_next_x, conditioned_next_x # TODO: looks unused @@ -294,6 +356,20 @@ class InvokeAIDiffuserComponent: ): context: Context = self.cross_attention_control_context + uncond_down_block, cond_down_block = None, None + down_block_additional_residuals = kwargs.pop("down_block_additional_residuals", None) + if down_block_additional_residuals is not None: + uncond_down_block, cond_down_block = [], [] + for down_block in down_block_additional_residuals: + _uncond_down, _cond_down = down_block.chunk(2) + uncond_down_block.append(_uncond_down) + cond_down_block.append(_cond_down) + + uncond_mid_block, cond_mid_block = None, None + mid_block_additional_residual = kwargs.pop("mid_block_additional_residual", None) + if mid_block_additional_residual is not None: + uncond_mid_block, cond_mid_block = mid_block_additional_residual.chunk(2) + cross_attn_processor_context = SwapCrossAttnContext( modified_text_embeddings=context.arguments.edited_conditioning, index_map=context.cross_attention_index_map, @@ -306,6 +382,8 @@ class InvokeAIDiffuserComponent: sigma, unconditioning, {"swap_cross_attn_context": cross_attn_processor_context}, + down_block_additional_residuals=uncond_down_block, + mid_block_additional_residual=uncond_mid_block, **kwargs, ) @@ -318,6 +396,8 @@ class InvokeAIDiffuserComponent: sigma, conditioning, {"swap_cross_attn_context": cross_attn_processor_context}, + down_block_additional_residuals=cond_down_block, + mid_block_additional_residual=cond_mid_block, **kwargs, ) return unconditioned_next_x, conditioned_next_x diff --git a/invokeai/backend/training/textual_inversion_training.py b/invokeai/backend/training/textual_inversion_training.py index c4290cacb3..aadf8c76a3 100644 --- a/invokeai/backend/training/textual_inversion_training.py +++ b/invokeai/backend/training/textual_inversion_training.py @@ -24,7 +24,7 @@ import torch.utils.checkpoint import transformers from accelerate import Accelerator from accelerate.logging import get_logger -from accelerate.utils import set_seed +from accelerate.utils import set_seed, ProjectConfiguration from diffusers import ( AutoencoderKL, DDPMScheduler, @@ -35,7 +35,6 @@ from diffusers.optimization import get_scheduler from diffusers.utils import check_min_version from diffusers.utils.import_utils import is_xformers_available from huggingface_hub import HfFolder, Repository, whoami -from omegaconf import OmegaConf # TODO: remove and import from diffusers.utils when the new version of diffusers is released from packaging import version @@ -47,6 +46,8 @@ from transformers import CLIPTextModel, CLIPTokenizer # invokeai stuff from invokeai.app.services.config import InvokeAIAppConfig,PagingArgumentParser +from invokeai.app.services.model_manager_service import ModelManagerService +from invokeai.backend.model_management.models import SubModelType if version.parse(version.parse(PIL.__version__).base_version) >= version.parse("9.1.0"): PIL_INTERPOLATION = { @@ -132,7 +133,7 @@ def parse_args(): model_group.add_argument( "--model", type=str, - default="stable-diffusion-1.5", + default="sd-1/main/stable-diffusion-v1-5", help="Name of the diffusers model to train against, as defined in configs/models.yaml.", ) model_group.add_argument( @@ -565,7 +566,6 @@ def do_textual_inversion_training( checkpointing_steps: int = 500, resume_from_checkpoint: Path = None, enable_xformers_memory_efficient_attention: bool = False, - root_dir: Path = None, hub_model_id: str = None, **kwargs, ): @@ -584,13 +584,17 @@ def do_textual_inversion_training( logging_dir = output_dir / logging_dir + accelerator_config = ProjectConfiguration() + accelerator_config.logging_dir = logging_dir accelerator = Accelerator( gradient_accumulation_steps=gradient_accumulation_steps, mixed_precision=mixed_precision, log_with=report_to, - logging_dir=logging_dir, + project_config=accelerator_config, ) + model_manager = ModelManagerService(config,logger) + # Make one log on every process with the configuration for debugging. logging.basicConfig( format="%(asctime)s - %(levelname)s - %(name)s - %(message)s", @@ -628,46 +632,46 @@ def do_textual_inversion_training( elif output_dir is not None: os.makedirs(output_dir, exist_ok=True) - models_conf = OmegaConf.load(config.model_conf_path) - model_conf = models_conf.get(model, None) - assert model_conf is not None, f"Unknown model: {model}" + known_models = model_manager.model_names() + model_name = model.split('/')[-1] + model_meta = next((mm for mm in known_models if mm[0].endswith(model_name)), None) + assert model_meta is not None, f"Unknown model: {model}" + model_info = model_manager.model_info(*model_meta) assert ( - model_conf.get("format", "diffusers") == "diffusers" + model_info['model_format'] == "diffusers" ), "This script only works with models of type 'diffusers'" - pretrained_model_name_or_path = model_conf.get("repo_id", None) or Path( - model_conf.get("path") - ) - assert ( - pretrained_model_name_or_path - ), f"models.yaml error: neither 'repo_id' nor 'path' is defined for {model}" - pipeline_args = dict(cache_dir=config.cache_dir) + tokenizer_info = model_manager.get_model(*model_meta, submodel=SubModelType.Tokenizer) + noise_scheduler_info = model_manager.get_model(*model_meta, submodel=SubModelType.Scheduler) + text_encoder_info = model_manager.get_model(*model_meta, submodel=SubModelType.TextEncoder) + vae_info = model_manager.get_model(*model_meta, submodel=SubModelType.Vae) + unet_info = model_manager.get_model(*model_meta, submodel=SubModelType.UNet) - # Load tokenizer + pipeline_args = dict(local_files_only=True) if tokenizer_name: tokenizer = CLIPTokenizer.from_pretrained(tokenizer_name, **pipeline_args) else: tokenizer = CLIPTokenizer.from_pretrained( - pretrained_model_name_or_path, subfolder="tokenizer", **pipeline_args + tokenizer_info.location, subfolder='tokenizer', **pipeline_args ) # Load scheduler and models noise_scheduler = DDPMScheduler.from_pretrained( - pretrained_model_name_or_path, subfolder="scheduler", **pipeline_args + noise_scheduler_info.location, subfolder="scheduler", **pipeline_args ) text_encoder = CLIPTextModel.from_pretrained( - pretrained_model_name_or_path, + text_encoder_info.location, subfolder="text_encoder", revision=revision, **pipeline_args, ) vae = AutoencoderKL.from_pretrained( - pretrained_model_name_or_path, + vae_info.location, subfolder="vae", revision=revision, **pipeline_args, ) unet = UNet2DConditionModel.from_pretrained( - pretrained_model_name_or_path, + unet_info.location, subfolder="unet", revision=revision, **pipeline_args, @@ -989,7 +993,7 @@ def do_textual_inversion_training( save_full_model = not only_save_embeds if save_full_model: pipeline = StableDiffusionPipeline.from_pretrained( - pretrained_model_name_or_path, + unet_info.location, text_encoder=accelerator.unwrap_model(text_encoder), vae=vae, unet=unet, diff --git a/invokeai/backend/util/hotfixes.py b/invokeai/backend/util/hotfixes.py new file mode 100644 index 0000000000..67e46a426f --- /dev/null +++ b/invokeai/backend/util/hotfixes.py @@ -0,0 +1,634 @@ +from typing import Any, Dict, List, Optional, Tuple, Union + +import torch +from torch import nn + +from diffusers.configuration_utils import ConfigMixin, register_to_config +from diffusers.models.attention_processor import AttentionProcessor, AttnProcessor +from diffusers.models.embeddings import TimestepEmbedding, Timesteps +from diffusers.models.modeling_utils import ModelMixin +from diffusers.models.unet_2d_blocks import ( + CrossAttnDownBlock2D, + DownBlock2D, + UNetMidBlock2DCrossAttn, + get_down_block, +) +from diffusers.models.unet_2d_condition import UNet2DConditionModel + +import diffusers +from diffusers.models.controlnet import ControlNetConditioningEmbedding, ControlNetOutput, zero_module + +# Modified ControlNetModel with encoder_attention_mask argument added + +class ControlNetModel(ModelMixin, ConfigMixin): + """ + A ControlNet model. + + Args: + in_channels (`int`, defaults to 4): + The number of channels in the input sample. + flip_sin_to_cos (`bool`, defaults to `True`): + Whether to flip the sin to cos in the time embedding. + freq_shift (`int`, defaults to 0): + The frequency shift to apply to the time embedding. + down_block_types (`tuple[str]`, defaults to `("CrossAttnDownBlock2D", "CrossAttnDownBlock2D", "CrossAttnDownBlock2D", "DownBlock2D")`): + The tuple of downsample blocks to use. + only_cross_attention (`Union[bool, Tuple[bool]]`, defaults to `False`): + block_out_channels (`tuple[int]`, defaults to `(320, 640, 1280, 1280)`): + The tuple of output channels for each block. + layers_per_block (`int`, defaults to 2): + The number of layers per block. + downsample_padding (`int`, defaults to 1): + The padding to use for the downsampling convolution. + mid_block_scale_factor (`float`, defaults to 1): + The scale factor to use for the mid block. + act_fn (`str`, defaults to "silu"): + The activation function to use. + norm_num_groups (`int`, *optional*, defaults to 32): + The number of groups to use for the normalization. If None, normalization and activation layers is skipped + in post-processing. + norm_eps (`float`, defaults to 1e-5): + The epsilon to use for the normalization. + cross_attention_dim (`int`, defaults to 1280): + The dimension of the cross attention features. + attention_head_dim (`Union[int, Tuple[int]]`, defaults to 8): + The dimension of the attention heads. + use_linear_projection (`bool`, defaults to `False`): + class_embed_type (`str`, *optional*, defaults to `None`): + The type of class embedding to use which is ultimately summed with the time embeddings. Choose from None, + `"timestep"`, `"identity"`, `"projection"`, or `"simple_projection"`. + num_class_embeds (`int`, *optional*, defaults to 0): + Input dimension of the learnable embedding matrix to be projected to `time_embed_dim`, when performing + class conditioning with `class_embed_type` equal to `None`. + upcast_attention (`bool`, defaults to `False`): + resnet_time_scale_shift (`str`, defaults to `"default"`): + Time scale shift config for ResNet blocks (see `ResnetBlock2D`). Choose from `default` or `scale_shift`. + projection_class_embeddings_input_dim (`int`, *optional*, defaults to `None`): + The dimension of the `class_labels` input when `class_embed_type="projection"`. Required when + `class_embed_type="projection"`. + controlnet_conditioning_channel_order (`str`, defaults to `"rgb"`): + The channel order of conditional image. Will convert to `rgb` if it's `bgr`. + conditioning_embedding_out_channels (`tuple[int]`, *optional*, defaults to `(16, 32, 96, 256)`): + The tuple of output channel for each block in the `conditioning_embedding` layer. + global_pool_conditions (`bool`, defaults to `False`): + """ + + _supports_gradient_checkpointing = True + + @register_to_config + def __init__( + self, + in_channels: int = 4, + conditioning_channels: int = 3, + flip_sin_to_cos: bool = True, + freq_shift: int = 0, + down_block_types: Tuple[str] = ( + "CrossAttnDownBlock2D", + "CrossAttnDownBlock2D", + "CrossAttnDownBlock2D", + "DownBlock2D", + ), + only_cross_attention: Union[bool, Tuple[bool]] = False, + block_out_channels: Tuple[int] = (320, 640, 1280, 1280), + layers_per_block: int = 2, + downsample_padding: int = 1, + mid_block_scale_factor: float = 1, + act_fn: str = "silu", + norm_num_groups: Optional[int] = 32, + norm_eps: float = 1e-5, + cross_attention_dim: int = 1280, + attention_head_dim: Union[int, Tuple[int]] = 8, + num_attention_heads: Optional[Union[int, Tuple[int]]] = None, + use_linear_projection: bool = False, + class_embed_type: Optional[str] = None, + num_class_embeds: Optional[int] = None, + upcast_attention: bool = False, + resnet_time_scale_shift: str = "default", + projection_class_embeddings_input_dim: Optional[int] = None, + controlnet_conditioning_channel_order: str = "rgb", + conditioning_embedding_out_channels: Optional[Tuple[int]] = (16, 32, 96, 256), + global_pool_conditions: bool = False, + ): + super().__init__() + + # If `num_attention_heads` is not defined (which is the case for most models) + # it will default to `attention_head_dim`. This looks weird upon first reading it and it is. + # The reason for this behavior is to correct for incorrectly named variables that were introduced + # when this library was created. The incorrect naming was only discovered much later in https://github.com/huggingface/diffusers/issues/2011#issuecomment-1547958131 + # Changing `attention_head_dim` to `num_attention_heads` for 40,000+ configurations is too backwards breaking + # which is why we correct for the naming here. + num_attention_heads = num_attention_heads or attention_head_dim + + # Check inputs + if len(block_out_channels) != len(down_block_types): + raise ValueError( + f"Must provide the same number of `block_out_channels` as `down_block_types`. `block_out_channels`: {block_out_channels}. `down_block_types`: {down_block_types}." + ) + + if not isinstance(only_cross_attention, bool) and len(only_cross_attention) != len(down_block_types): + raise ValueError( + f"Must provide the same number of `only_cross_attention` as `down_block_types`. `only_cross_attention`: {only_cross_attention}. `down_block_types`: {down_block_types}." + ) + + if not isinstance(num_attention_heads, int) and len(num_attention_heads) != len(down_block_types): + raise ValueError( + f"Must provide the same number of `num_attention_heads` as `down_block_types`. `num_attention_heads`: {num_attention_heads}. `down_block_types`: {down_block_types}." + ) + + # input + conv_in_kernel = 3 + conv_in_padding = (conv_in_kernel - 1) // 2 + self.conv_in = nn.Conv2d( + in_channels, block_out_channels[0], kernel_size=conv_in_kernel, padding=conv_in_padding + ) + + # time + time_embed_dim = block_out_channels[0] * 4 + + self.time_proj = Timesteps(block_out_channels[0], flip_sin_to_cos, freq_shift) + timestep_input_dim = block_out_channels[0] + + self.time_embedding = TimestepEmbedding( + timestep_input_dim, + time_embed_dim, + act_fn=act_fn, + ) + + # class embedding + if class_embed_type is None and num_class_embeds is not None: + self.class_embedding = nn.Embedding(num_class_embeds, time_embed_dim) + elif class_embed_type == "timestep": + self.class_embedding = TimestepEmbedding(timestep_input_dim, time_embed_dim) + elif class_embed_type == "identity": + self.class_embedding = nn.Identity(time_embed_dim, time_embed_dim) + elif class_embed_type == "projection": + if projection_class_embeddings_input_dim is None: + raise ValueError( + "`class_embed_type`: 'projection' requires `projection_class_embeddings_input_dim` be set" + ) + # The projection `class_embed_type` is the same as the timestep `class_embed_type` except + # 1. the `class_labels` inputs are not first converted to sinusoidal embeddings + # 2. it projects from an arbitrary input dimension. + # + # Note that `TimestepEmbedding` is quite general, being mainly linear layers and activations. + # When used for embedding actual timesteps, the timesteps are first converted to sinusoidal embeddings. + # As a result, `TimestepEmbedding` can be passed arbitrary vectors. + self.class_embedding = TimestepEmbedding(projection_class_embeddings_input_dim, time_embed_dim) + else: + self.class_embedding = None + + # control net conditioning embedding + self.controlnet_cond_embedding = ControlNetConditioningEmbedding( + conditioning_embedding_channels=block_out_channels[0], + block_out_channels=conditioning_embedding_out_channels, + conditioning_channels=conditioning_channels, + ) + + self.down_blocks = nn.ModuleList([]) + self.controlnet_down_blocks = nn.ModuleList([]) + + if isinstance(only_cross_attention, bool): + only_cross_attention = [only_cross_attention] * len(down_block_types) + + if isinstance(attention_head_dim, int): + attention_head_dim = (attention_head_dim,) * len(down_block_types) + + if isinstance(num_attention_heads, int): + num_attention_heads = (num_attention_heads,) * len(down_block_types) + + # down + output_channel = block_out_channels[0] + + controlnet_block = nn.Conv2d(output_channel, output_channel, kernel_size=1) + controlnet_block = zero_module(controlnet_block) + self.controlnet_down_blocks.append(controlnet_block) + + for i, down_block_type in enumerate(down_block_types): + input_channel = output_channel + output_channel = block_out_channels[i] + is_final_block = i == len(block_out_channels) - 1 + + down_block = get_down_block( + down_block_type, + num_layers=layers_per_block, + in_channels=input_channel, + out_channels=output_channel, + temb_channels=time_embed_dim, + add_downsample=not is_final_block, + resnet_eps=norm_eps, + resnet_act_fn=act_fn, + resnet_groups=norm_num_groups, + cross_attention_dim=cross_attention_dim, + num_attention_heads=num_attention_heads[i], + attention_head_dim=attention_head_dim[i] if attention_head_dim[i] is not None else output_channel, + downsample_padding=downsample_padding, + use_linear_projection=use_linear_projection, + only_cross_attention=only_cross_attention[i], + upcast_attention=upcast_attention, + resnet_time_scale_shift=resnet_time_scale_shift, + ) + self.down_blocks.append(down_block) + + for _ in range(layers_per_block): + controlnet_block = nn.Conv2d(output_channel, output_channel, kernel_size=1) + controlnet_block = zero_module(controlnet_block) + self.controlnet_down_blocks.append(controlnet_block) + + if not is_final_block: + controlnet_block = nn.Conv2d(output_channel, output_channel, kernel_size=1) + controlnet_block = zero_module(controlnet_block) + self.controlnet_down_blocks.append(controlnet_block) + + # mid + mid_block_channel = block_out_channels[-1] + + controlnet_block = nn.Conv2d(mid_block_channel, mid_block_channel, kernel_size=1) + controlnet_block = zero_module(controlnet_block) + self.controlnet_mid_block = controlnet_block + + self.mid_block = UNetMidBlock2DCrossAttn( + in_channels=mid_block_channel, + temb_channels=time_embed_dim, + resnet_eps=norm_eps, + resnet_act_fn=act_fn, + output_scale_factor=mid_block_scale_factor, + resnet_time_scale_shift=resnet_time_scale_shift, + cross_attention_dim=cross_attention_dim, + num_attention_heads=num_attention_heads[-1], + resnet_groups=norm_num_groups, + use_linear_projection=use_linear_projection, + upcast_attention=upcast_attention, + ) + + @classmethod + def from_unet( + cls, + unet: UNet2DConditionModel, + controlnet_conditioning_channel_order: str = "rgb", + conditioning_embedding_out_channels: Optional[Tuple[int]] = (16, 32, 96, 256), + load_weights_from_unet: bool = True, + ): + r""" + Instantiate a [`ControlNetModel`] from [`UNet2DConditionModel`]. + + Parameters: + unet (`UNet2DConditionModel`): + The UNet model weights to copy to the [`ControlNetModel`]. All configuration options are also copied + where applicable. + """ + controlnet = cls( + in_channels=unet.config.in_channels, + flip_sin_to_cos=unet.config.flip_sin_to_cos, + freq_shift=unet.config.freq_shift, + down_block_types=unet.config.down_block_types, + only_cross_attention=unet.config.only_cross_attention, + block_out_channels=unet.config.block_out_channels, + layers_per_block=unet.config.layers_per_block, + downsample_padding=unet.config.downsample_padding, + mid_block_scale_factor=unet.config.mid_block_scale_factor, + act_fn=unet.config.act_fn, + norm_num_groups=unet.config.norm_num_groups, + norm_eps=unet.config.norm_eps, + cross_attention_dim=unet.config.cross_attention_dim, + attention_head_dim=unet.config.attention_head_dim, + num_attention_heads=unet.config.num_attention_heads, + use_linear_projection=unet.config.use_linear_projection, + class_embed_type=unet.config.class_embed_type, + num_class_embeds=unet.config.num_class_embeds, + upcast_attention=unet.config.upcast_attention, + resnet_time_scale_shift=unet.config.resnet_time_scale_shift, + projection_class_embeddings_input_dim=unet.config.projection_class_embeddings_input_dim, + controlnet_conditioning_channel_order=controlnet_conditioning_channel_order, + conditioning_embedding_out_channels=conditioning_embedding_out_channels, + ) + + if load_weights_from_unet: + controlnet.conv_in.load_state_dict(unet.conv_in.state_dict()) + controlnet.time_proj.load_state_dict(unet.time_proj.state_dict()) + controlnet.time_embedding.load_state_dict(unet.time_embedding.state_dict()) + + if controlnet.class_embedding: + controlnet.class_embedding.load_state_dict(unet.class_embedding.state_dict()) + + controlnet.down_blocks.load_state_dict(unet.down_blocks.state_dict()) + controlnet.mid_block.load_state_dict(unet.mid_block.state_dict()) + + return controlnet + + @property + # Copied from diffusers.models.unet_2d_condition.UNet2DConditionModel.attn_processors + def attn_processors(self) -> Dict[str, AttentionProcessor]: + r""" + Returns: + `dict` of attention processors: A dictionary containing all attention processors used in the model with + indexed by its weight name. + """ + # set recursively + processors = {} + + def fn_recursive_add_processors(name: str, module: torch.nn.Module, processors: Dict[str, AttentionProcessor]): + if hasattr(module, "set_processor"): + processors[f"{name}.processor"] = module.processor + + for sub_name, child in module.named_children(): + fn_recursive_add_processors(f"{name}.{sub_name}", child, processors) + + return processors + + for name, module in self.named_children(): + fn_recursive_add_processors(name, module, processors) + + return processors + + # Copied from diffusers.models.unet_2d_condition.UNet2DConditionModel.set_attn_processor + def set_attn_processor(self, processor: Union[AttentionProcessor, Dict[str, AttentionProcessor]]): + r""" + Sets the attention processor to use to compute attention. + + Parameters: + processor (`dict` of `AttentionProcessor` or only `AttentionProcessor`): + The instantiated processor class or a dictionary of processor classes that will be set as the processor + for **all** `Attention` layers. + + If `processor` is a dict, the key needs to define the path to the corresponding cross attention + processor. This is strongly recommended when setting trainable attention processors. + + """ + count = len(self.attn_processors.keys()) + + if isinstance(processor, dict) and len(processor) != count: + raise ValueError( + f"A dict of processors was passed, but the number of processors {len(processor)} does not match the" + f" number of attention layers: {count}. Please make sure to pass {count} processor classes." + ) + + def fn_recursive_attn_processor(name: str, module: torch.nn.Module, processor): + if hasattr(module, "set_processor"): + if not isinstance(processor, dict): + module.set_processor(processor) + else: + module.set_processor(processor.pop(f"{name}.processor")) + + for sub_name, child in module.named_children(): + fn_recursive_attn_processor(f"{name}.{sub_name}", child, processor) + + for name, module in self.named_children(): + fn_recursive_attn_processor(name, module, processor) + + # Copied from diffusers.models.unet_2d_condition.UNet2DConditionModel.set_default_attn_processor + def set_default_attn_processor(self): + """ + Disables custom attention processors and sets the default attention implementation. + """ + self.set_attn_processor(AttnProcessor()) + + # Copied from diffusers.models.unet_2d_condition.UNet2DConditionModel.set_attention_slice + def set_attention_slice(self, slice_size): + r""" + Enable sliced attention computation. + + When this option is enabled, the attention module splits the input tensor in slices to compute attention in + several steps. This is useful for saving some memory in exchange for a small decrease in speed. + + Args: + slice_size (`str` or `int` or `list(int)`, *optional*, defaults to `"auto"`): + When `"auto"`, input to the attention heads is halved, so attention is computed in two steps. If + `"max"`, maximum amount of memory is saved by running only one slice at a time. If a number is + provided, uses as many slices as `attention_head_dim // slice_size`. In this case, `attention_head_dim` + must be a multiple of `slice_size`. + """ + sliceable_head_dims = [] + + def fn_recursive_retrieve_sliceable_dims(module: torch.nn.Module): + if hasattr(module, "set_attention_slice"): + sliceable_head_dims.append(module.sliceable_head_dim) + + for child in module.children(): + fn_recursive_retrieve_sliceable_dims(child) + + # retrieve number of attention layers + for module in self.children(): + fn_recursive_retrieve_sliceable_dims(module) + + num_sliceable_layers = len(sliceable_head_dims) + + if slice_size == "auto": + # half the attention head size is usually a good trade-off between + # speed and memory + slice_size = [dim // 2 for dim in sliceable_head_dims] + elif slice_size == "max": + # make smallest slice possible + slice_size = num_sliceable_layers * [1] + + slice_size = num_sliceable_layers * [slice_size] if not isinstance(slice_size, list) else slice_size + + if len(slice_size) != len(sliceable_head_dims): + raise ValueError( + f"You have provided {len(slice_size)}, but {self.config} has {len(sliceable_head_dims)} different" + f" attention layers. Make sure to match `len(slice_size)` to be {len(sliceable_head_dims)}." + ) + + for i in range(len(slice_size)): + size = slice_size[i] + dim = sliceable_head_dims[i] + if size is not None and size > dim: + raise ValueError(f"size {size} has to be smaller or equal to {dim}.") + + # Recursively walk through all the children. + # Any children which exposes the set_attention_slice method + # gets the message + def fn_recursive_set_attention_slice(module: torch.nn.Module, slice_size: List[int]): + if hasattr(module, "set_attention_slice"): + module.set_attention_slice(slice_size.pop()) + + for child in module.children(): + fn_recursive_set_attention_slice(child, slice_size) + + reversed_slice_size = list(reversed(slice_size)) + for module in self.children(): + fn_recursive_set_attention_slice(module, reversed_slice_size) + + def _set_gradient_checkpointing(self, module, value=False): + if isinstance(module, (CrossAttnDownBlock2D, DownBlock2D)): + module.gradient_checkpointing = value + + def forward( + self, + sample: torch.FloatTensor, + timestep: Union[torch.Tensor, float, int], + encoder_hidden_states: torch.Tensor, + controlnet_cond: torch.FloatTensor, + conditioning_scale: float = 1.0, + class_labels: Optional[torch.Tensor] = None, + timestep_cond: Optional[torch.Tensor] = None, + attention_mask: Optional[torch.Tensor] = None, + cross_attention_kwargs: Optional[Dict[str, Any]] = None, + encoder_attention_mask: Optional[torch.Tensor] = None, + guess_mode: bool = False, + return_dict: bool = True, + ) -> Union[ControlNetOutput, Tuple]: + """ + The [`ControlNetModel`] forward method. + + Args: + sample (`torch.FloatTensor`): + The noisy input tensor. + timestep (`Union[torch.Tensor, float, int]`): + The number of timesteps to denoise an input. + encoder_hidden_states (`torch.Tensor`): + The encoder hidden states. + controlnet_cond (`torch.FloatTensor`): + The conditional input tensor of shape `(batch_size, sequence_length, hidden_size)`. + conditioning_scale (`float`, defaults to `1.0`): + The scale factor for ControlNet outputs. + class_labels (`torch.Tensor`, *optional*, defaults to `None`): + Optional class labels for conditioning. Their embeddings will be summed with the timestep embeddings. + timestep_cond (`torch.Tensor`, *optional*, defaults to `None`): + attention_mask (`torch.Tensor`, *optional*, defaults to `None`): + cross_attention_kwargs(`dict[str]`, *optional*, defaults to `None`): + A kwargs dictionary that if specified is passed along to the `AttnProcessor`. + encoder_attention_mask (`torch.Tensor`): + A cross-attention mask of shape `(batch, sequence_length)` is applied to `encoder_hidden_states`. If + `True` the mask is kept, otherwise if `False` it is discarded. Mask will be converted into a bias, + which adds large negative values to the attention scores corresponding to "discard" tokens. + guess_mode (`bool`, defaults to `False`): + In this mode, the ControlNet encoder tries its best to recognize the input content of the input even if + you remove all prompts. A `guidance_scale` between 3.0 and 5.0 is recommended. + return_dict (`bool`, defaults to `True`): + Whether or not to return a [`~models.controlnet.ControlNetOutput`] instead of a plain tuple. + + Returns: + [`~models.controlnet.ControlNetOutput`] **or** `tuple`: + If `return_dict` is `True`, a [`~models.controlnet.ControlNetOutput`] is returned, otherwise a tuple is + returned where the first element is the sample tensor. + """ + # check channel order + channel_order = self.config.controlnet_conditioning_channel_order + + if channel_order == "rgb": + # in rgb order by default + ... + elif channel_order == "bgr": + controlnet_cond = torch.flip(controlnet_cond, dims=[1]) + else: + raise ValueError(f"unknown `controlnet_conditioning_channel_order`: {channel_order}") + + # prepare attention_mask + if attention_mask is not None: + attention_mask = (1 - attention_mask.to(sample.dtype)) * -10000.0 + attention_mask = attention_mask.unsqueeze(1) + + # convert encoder_attention_mask to a bias the same way we do for attention_mask + if encoder_attention_mask is not None: + encoder_attention_mask = (1 - encoder_attention_mask.to(sample.dtype)) * -10000.0 + encoder_attention_mask = encoder_attention_mask.unsqueeze(1) + + # 1. time + timesteps = timestep + if not torch.is_tensor(timesteps): + # TODO: this requires sync between CPU and GPU. So try to pass timesteps as tensors if you can + # This would be a good case for the `match` statement (Python 3.10+) + is_mps = sample.device.type == "mps" + if isinstance(timestep, float): + dtype = torch.float32 if is_mps else torch.float64 + else: + dtype = torch.int32 if is_mps else torch.int64 + timesteps = torch.tensor([timesteps], dtype=dtype, device=sample.device) + elif len(timesteps.shape) == 0: + timesteps = timesteps[None].to(sample.device) + + # broadcast to batch dimension in a way that's compatible with ONNX/Core ML + timesteps = timesteps.expand(sample.shape[0]) + + t_emb = self.time_proj(timesteps) + + # timesteps does not contain any weights and will always return f32 tensors + # but time_embedding might actually be running in fp16. so we need to cast here. + # there might be better ways to encapsulate this. + t_emb = t_emb.to(dtype=sample.dtype) + + emb = self.time_embedding(t_emb, timestep_cond) + + if self.class_embedding is not None: + if class_labels is None: + raise ValueError("class_labels should be provided when num_class_embeds > 0") + + if self.config.class_embed_type == "timestep": + class_labels = self.time_proj(class_labels) + + class_emb = self.class_embedding(class_labels).to(dtype=self.dtype) + emb = emb + class_emb + + # 2. pre-process + sample = self.conv_in(sample) + + controlnet_cond = self.controlnet_cond_embedding(controlnet_cond) + + sample = sample + controlnet_cond + + # 3. down + down_block_res_samples = (sample,) + for downsample_block in self.down_blocks: + if hasattr(downsample_block, "has_cross_attention") and downsample_block.has_cross_attention: + sample, res_samples = downsample_block( + hidden_states=sample, + temb=emb, + encoder_hidden_states=encoder_hidden_states, + attention_mask=attention_mask, + cross_attention_kwargs=cross_attention_kwargs, + encoder_attention_mask=encoder_attention_mask, + ) + else: + sample, res_samples = downsample_block(hidden_states=sample, temb=emb) + + down_block_res_samples += res_samples + + # 4. mid + if self.mid_block is not None: + sample = self.mid_block( + sample, + emb, + encoder_hidden_states=encoder_hidden_states, + attention_mask=attention_mask, + cross_attention_kwargs=cross_attention_kwargs, + encoder_attention_mask=encoder_attention_mask, + ) + + # 5. Control net blocks + + controlnet_down_block_res_samples = () + + for down_block_res_sample, controlnet_block in zip(down_block_res_samples, self.controlnet_down_blocks): + down_block_res_sample = controlnet_block(down_block_res_sample) + controlnet_down_block_res_samples = controlnet_down_block_res_samples + (down_block_res_sample,) + + down_block_res_samples = controlnet_down_block_res_samples + + mid_block_res_sample = self.controlnet_mid_block(sample) + + # 6. scaling + if guess_mode and not self.config.global_pool_conditions: + scales = torch.logspace(-1, 0, len(down_block_res_samples) + 1, device=sample.device) # 0.1 to 1.0 + + scales = scales * conditioning_scale + down_block_res_samples = [sample * scale for sample, scale in zip(down_block_res_samples, scales)] + mid_block_res_sample = mid_block_res_sample * scales[-1] # last one + else: + down_block_res_samples = [sample * conditioning_scale for sample in down_block_res_samples] + mid_block_res_sample = mid_block_res_sample * conditioning_scale + + if self.config.global_pool_conditions: + down_block_res_samples = [ + torch.mean(sample, dim=(2, 3), keepdim=True) for sample in down_block_res_samples + ] + mid_block_res_sample = torch.mean(mid_block_res_sample, dim=(2, 3), keepdim=True) + + if not return_dict: + return (down_block_res_samples, mid_block_res_sample) + + return ControlNetOutput( + down_block_res_samples=down_block_res_samples, mid_block_res_sample=mid_block_res_sample + ) + +diffusers.ControlNetModel = ControlNetModel +diffusers.models.controlnet.ControlNetModel = ControlNetModel \ No newline at end of file diff --git a/invokeai/configs/INITIAL_MODELS.yaml b/invokeai/configs/INITIAL_MODELS.yaml index 4ba67bc4bc..e148ee9b55 100644 --- a/invokeai/configs/INITIAL_MODELS.yaml +++ b/invokeai/configs/INITIAL_MODELS.yaml @@ -16,6 +16,14 @@ sd-2/main/stable-diffusion-2-inpainting: description: Stable Diffusion version 2.0 inpainting model (5.21 GB) repo_id: stabilityai/stable-diffusion-2-inpainting recommended: False +sdxl/main/stable-diffusion-xl-base-0-9: + description: Stable Diffusion XL base model (12 GB; access token required) + repo_id: stabilityai/stable-diffusion-xl-base-0.9 + recommended: False +sdxl-refiner/main/stable-diffusion-xl-refiner-0-9: + description: Stable Diffusion XL refiner model (12 GB; access token required) + repo_id: stabilityai/stable-diffusion-xl-refiner-0.9 + recommended: False sd-1/main/Analog-Diffusion: description: An SD-1.5 model trained on diverse analog photographs (2.13 GB) repo_id: wavymulder/Analog-Diffusion @@ -58,22 +66,29 @@ sd-1/main/waifu-diffusion: recommended: False sd-1/controlnet/canny: repo_id: lllyasviel/control_v11p_sd15_canny + recommended: True sd-1/controlnet/inpaint: repo_id: lllyasviel/control_v11p_sd15_inpaint sd-1/controlnet/mlsd: repo_id: lllyasviel/control_v11p_sd15_mlsd sd-1/controlnet/depth: repo_id: lllyasviel/control_v11f1p_sd15_depth + recommended: True sd-1/controlnet/normal_bae: repo_id: lllyasviel/control_v11p_sd15_normalbae sd-1/controlnet/seg: repo_id: lllyasviel/control_v11p_sd15_seg sd-1/controlnet/lineart: repo_id: lllyasviel/control_v11p_sd15_lineart + recommended: True sd-1/controlnet/lineart_anime: repo_id: lllyasviel/control_v11p_sd15s2_lineart_anime +sd-1/controlnet/openpose: + repo_id: lllyasviel/control_v11p_sd15_openpose + recommended: True sd-1/controlnet/scribble: repo_id: lllyasviel/control_v11p_sd15_scribble + recommended: False sd-1/controlnet/softedge: repo_id: lllyasviel/control_v11p_sd15_softedge sd-1/controlnet/shuffle: @@ -84,9 +99,11 @@ sd-1/controlnet/ip2p: repo_id: lllyasviel/control_v11e_sd15_ip2p sd-1/embedding/EasyNegative: path: https://huggingface.co/embed/EasyNegative/resolve/main/EasyNegative.safetensors + recommended: True sd-1/embedding/ahx-beta-453407d: repo_id: sd-concepts-library/ahx-beta-453407d sd-1/lora/LowRA: path: https://civitai.com/api/download/models/63006 + recommended: True sd-1/lora/Ink scenery: path: https://civitai.com/api/download/models/83390 diff --git a/invokeai/frontend/install/model_install.py b/invokeai/frontend/install/model_install.py index 736d27a321..c4b19157a4 100644 --- a/invokeai/frontend/install/model_install.py +++ b/invokeai/frontend/install/model_install.py @@ -256,6 +256,8 @@ class addModelsForm(CyclingForm, npyscreen.FormMultiPage): widgets = dict() model_list = [x for x in self.all_models if self.all_models[x].model_type==model_type and not x in exclude] model_labels = [self.model_labels[x] for x in model_list] + + show_recommended = len(self.installed_models)==0 if len(model_list) > 0: max_width = max([len(x) for x in model_labels]) columns = window_width // (max_width+8) # 8 characters for "[x] " and padding @@ -280,7 +282,8 @@ class addModelsForm(CyclingForm, npyscreen.FormMultiPage): value=[ model_list.index(x) for x in model_list - if self.all_models[x].installed + if (show_recommended and self.all_models[x].recommended) \ + or self.all_models[x].installed ], max_height=len(model_list)//columns + 1, relx=4, @@ -672,7 +675,9 @@ def select_and_download_models(opt: Namespace): # pass installer = ModelInstall(config, prediction_type_helper=helper) - if opt.add or opt.delete: + if opt.list_models: + installer.list_models(opt.list_models) + elif opt.add or opt.delete: selections = InstallSelections( install_models = opt.add or [], remove_models = opt.delete or [] @@ -696,7 +701,7 @@ def select_and_download_models(opt: Namespace): # the third argument is needed in the Windows 11 environment in # order to launch and resize a console window running this program - set_min_terminal_size(MIN_COLS, MIN_LINES,'invokeai-model-install') + set_min_terminal_size(MIN_COLS, MIN_LINES) installApp = AddModelApplication(opt) try: installApp.run() @@ -745,7 +750,7 @@ def main(): ) parser.add_argument( "--list-models", - choices=["diffusers","loras","controlnets","tis"], + choices=[x.value for x in ModelType], help="list installed models", ) parser.add_argument( @@ -773,7 +778,7 @@ def main(): config.parse_args(invoke_args) logger = InvokeAILogger().getLogger(config=config) - if not (config.conf_path / 'models.yaml').exists(): + if not config.model_conf_path.exists(): logger.info( "Your InvokeAI root directory is not set up. Calling invokeai-configure." ) diff --git a/invokeai/frontend/install/widgets.py b/invokeai/frontend/install/widgets.py index c3bb3542ae..82d3753eb4 100644 --- a/invokeai/frontend/install/widgets.py +++ b/invokeai/frontend/install/widgets.py @@ -17,28 +17,20 @@ from shutil import get_terminal_size from curses import BUTTON2_CLICKED,BUTTON3_CLICKED # minimum size for UIs -MIN_COLS = 130 +MIN_COLS = 136 MIN_LINES = 45 # ------------------------------------- -def set_terminal_size(columns: int, lines: int, launch_command: str=None): +def set_terminal_size(columns: int, lines: int): ts = get_terminal_size() width = max(columns,ts.columns) height = max(lines,ts.lines) OS = platform.uname().system if OS == "Windows": - # The new Windows Terminal doesn't resize, so we relaunch in a CMD window. - # Would prefer to use execvpe() here, but somehow it is not working properly - # in the Windows 10 environment. - if 'IA_RELAUNCHED' not in os.environ: - args=['conhost'] - args.extend([launch_command] if launch_command else [sys.argv[0]]) - args.extend(sys.argv[1:]) - os.environ['IA_RELAUNCHED'] = 'True' - os.execvp('conhost',args) - else: - _set_terminal_size_powershell(width,height) + pass + # not working reliably - ask user to adjust the window + #_set_terminal_size_powershell(width,height) elif OS in ["Darwin", "Linux"]: _set_terminal_size_unix(width,height) @@ -84,20 +76,14 @@ def _set_terminal_size_unix(width: int, height: int): sys.stdout.write("\x1b[8;{height};{width}t".format(height=height, width=width)) sys.stdout.flush() -def set_min_terminal_size(min_cols: int, min_lines: int, launch_command: str=None): +def set_min_terminal_size(min_cols: int, min_lines: int): # make sure there's enough room for the ui term_cols, term_lines = get_terminal_size() if term_cols >= min_cols and term_lines >= min_lines: return cols = max(term_cols, min_cols) lines = max(term_lines, min_lines) - set_terminal_size(cols, lines, launch_command) - - # did it work? - term_cols, term_lines = get_terminal_size() - if term_cols < cols or term_lines < lines: - print(f'This window is too small for optimal display. For best results please enlarge it.') - input('After resizing, press any key to continue...') + set_terminal_size(cols, lines) class IntSlider(npyscreen.Slider): def translate_value(self): diff --git a/invokeai/frontend/web/.eslintrc.js b/invokeai/frontend/web/.eslintrc.js index 34db9d466b..c48e08d45e 100644 --- a/invokeai/frontend/web/.eslintrc.js +++ b/invokeai/frontend/web/.eslintrc.js @@ -36,6 +36,7 @@ module.exports = { ], 'prettier/prettier': ['error', { endOfLine: 'auto' }], '@typescript-eslint/ban-ts-comment': 'warn', + '@typescript-eslint/no-explicit-any': 'warn', '@typescript-eslint/no-empty-interface': [ 'error', { diff --git a/invokeai/frontend/web/dist/assets/App-4c33c38e.css b/invokeai/frontend/web/dist/assets/App-4c33c38e.css deleted file mode 100644 index 482eef3217..0000000000 --- a/invokeai/frontend/web/dist/assets/App-4c33c38e.css +++ /dev/null @@ -1 +0,0 @@ -.ltr-image-gallery-css-transition-enter{transform:translate(150%)}.ltr-image-gallery-css-transition-enter-active{transform:translate(0);transition:all .12s ease-out}.ltr-image-gallery-css-transition-exit{transform:translate(0)}.ltr-image-gallery-css-transition-exit-active{transform:translate(150%);transition:all .12s ease-out}.rtl-image-gallery-css-transition-enter{transform:translate(-150%)}.rtl-image-gallery-css-transition-enter-active{transform:translate(0);transition:all .12s ease-out}.rtl-image-gallery-css-transition-exit{transform:translate(0)}.rtl-image-gallery-css-transition-exit-active{transform:translate(-150%);transition:all .12s ease-out}.react-flow__container{position:absolute;width:100%;height:100%;top:0;left:0}.react-flow__pane{z-index:1;cursor:-webkit-grab;cursor:grab}.react-flow__pane.selection{cursor:pointer}.react-flow__pane.dragging{cursor:-webkit-grabbing;cursor:grabbing}.react-flow__viewport{transform-origin:0 0;z-index:2;pointer-events:none}.react-flow__renderer{z-index:4}.react-flow__selection{z-index:6}.react-flow__nodesselection-rect:focus,.react-flow__nodesselection-rect:focus-visible{outline:none}.react-flow .react-flow__edges{pointer-events:none;overflow:visible}.react-flow__edge-path,.react-flow__connection-path{stroke:#b1b1b7;stroke-width:1;fill:none}.react-flow__edge{pointer-events:visibleStroke;cursor:pointer}.react-flow__edge.animated path{stroke-dasharray:5;-webkit-animation:dashdraw .5s linear infinite;animation:dashdraw .5s linear infinite}.react-flow__edge.animated path.react-flow__edge-interaction{stroke-dasharray:none;-webkit-animation:none;animation:none}.react-flow__edge.inactive{pointer-events:none}.react-flow__edge.selected,.react-flow__edge:focus,.react-flow__edge:focus-visible{outline:none}.react-flow__edge.selected .react-flow__edge-path,.react-flow__edge:focus .react-flow__edge-path,.react-flow__edge:focus-visible .react-flow__edge-path{stroke:#555}.react-flow__edge-textwrapper{pointer-events:all}.react-flow__edge-textbg{fill:#fff}.react-flow__edge .react-flow__edge-text{pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none}.react-flow__connection{pointer-events:none}.react-flow__connection .animated{stroke-dasharray:5;-webkit-animation:dashdraw .5s linear infinite;animation:dashdraw .5s linear infinite}.react-flow__connectionline{z-index:1001}.react-flow__nodes{pointer-events:none;transform-origin:0 0}.react-flow__node{position:absolute;-webkit-user-select:none;-moz-user-select:none;user-select:none;pointer-events:all;transform-origin:0 0;box-sizing:border-box;cursor:-webkit-grab;cursor:grab}.react-flow__node.dragging{cursor:-webkit-grabbing;cursor:grabbing}.react-flow__nodesselection{z-index:3;transform-origin:left top;pointer-events:none}.react-flow__nodesselection-rect{position:absolute;pointer-events:all;cursor:-webkit-grab;cursor:grab}.react-flow__handle{position:absolute;pointer-events:none;min-width:5px;min-height:5px;width:6px;height:6px;background:#1a192b;border:1px solid white;border-radius:100%}.react-flow__handle.connectionindicator{pointer-events:all;cursor:crosshair}.react-flow__handle-bottom{top:auto;left:50%;bottom:-4px;transform:translate(-50%)}.react-flow__handle-top{left:50%;top:-4px;transform:translate(-50%)}.react-flow__handle-left{top:50%;left:-4px;transform:translateY(-50%)}.react-flow__handle-right{right:-4px;top:50%;transform:translateY(-50%)}.react-flow__edgeupdater{cursor:move;pointer-events:all}.react-flow__panel{position:absolute;z-index:5;margin:15px}.react-flow__panel.top{top:0}.react-flow__panel.bottom{bottom:0}.react-flow__panel.left{left:0}.react-flow__panel.right{right:0}.react-flow__panel.center{left:50%;transform:translate(-50%)}.react-flow__attribution{font-size:10px;background:rgba(255,255,255,.5);padding:2px 3px;margin:0}.react-flow__attribution a{text-decoration:none;color:#999}@-webkit-keyframes dashdraw{0%{stroke-dashoffset:10}}@keyframes dashdraw{0%{stroke-dashoffset:10}}.react-flow__edgelabel-renderer{position:absolute;width:100%;height:100%;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none}.react-flow__edge.updating .react-flow__edge-path{stroke:#777}.react-flow__edge-text{font-size:10px}.react-flow__node.selectable:focus,.react-flow__node.selectable:focus-visible{outline:none}.react-flow__node-default,.react-flow__node-input,.react-flow__node-output,.react-flow__node-group{padding:10px;border-radius:3px;width:150px;font-size:12px;color:#222;text-align:center;border-width:1px;border-style:solid;border-color:#1a192b;background-color:#fff}.react-flow__node-default.selectable:hover,.react-flow__node-input.selectable:hover,.react-flow__node-output.selectable:hover,.react-flow__node-group.selectable:hover{box-shadow:0 1px 4px 1px #00000014}.react-flow__node-default.selectable.selected,.react-flow__node-default.selectable:focus,.react-flow__node-default.selectable:focus-visible,.react-flow__node-input.selectable.selected,.react-flow__node-input.selectable:focus,.react-flow__node-input.selectable:focus-visible,.react-flow__node-output.selectable.selected,.react-flow__node-output.selectable:focus,.react-flow__node-output.selectable:focus-visible,.react-flow__node-group.selectable.selected,.react-flow__node-group.selectable:focus,.react-flow__node-group.selectable:focus-visible{box-shadow:0 0 0 .5px #1a192b}.react-flow__node-group{background-color:#f0f0f040}.react-flow__nodesselection-rect,.react-flow__selection{background:rgba(0,89,220,.08);border:1px dotted rgba(0,89,220,.8)}.react-flow__nodesselection-rect:focus,.react-flow__nodesselection-rect:focus-visible,.react-flow__selection:focus,.react-flow__selection:focus-visible{outline:none}.react-flow__controls{box-shadow:0 0 2px 1px #00000014}.react-flow__controls-button{border:none;background:#fefefe;border-bottom:1px solid #eee;box-sizing:content-box;display:flex;justify-content:center;align-items:center;width:16px;height:16px;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;user-select:none;padding:5px}.react-flow__controls-button:hover{background:#f4f4f4}.react-flow__controls-button svg{width:100%;max-width:12px;max-height:12px}.react-flow__controls-button:disabled{pointer-events:none}.react-flow__controls-button:disabled svg{fill-opacity:.4}.react-flow__minimap{background-color:#fff}.react-flow__resize-control{position:absolute}.react-flow__resize-control.left,.react-flow__resize-control.right{cursor:ew-resize}.react-flow__resize-control.top,.react-flow__resize-control.bottom{cursor:ns-resize}.react-flow__resize-control.top.left,.react-flow__resize-control.bottom.right{cursor:nwse-resize}.react-flow__resize-control.bottom.left,.react-flow__resize-control.top.right{cursor:nesw-resize}.react-flow__resize-control.handle{width:4px;height:4px;border:1px solid #fff;border-radius:1px;background-color:#3367d9;transform:translate(-50%,-50%)}.react-flow__resize-control.handle.left{left:0;top:50%}.react-flow__resize-control.handle.right{left:100%;top:50%}.react-flow__resize-control.handle.top{left:50%;top:0}.react-flow__resize-control.handle.bottom{left:50%;top:100%}.react-flow__resize-control.handle.top.left,.react-flow__resize-control.handle.bottom.left{left:0}.react-flow__resize-control.handle.top.right,.react-flow__resize-control.handle.bottom.right{left:100%}.react-flow__resize-control.line{border-color:#3367d9;border-width:0;border-style:solid}.react-flow__resize-control.line.left,.react-flow__resize-control.line.right{width:1px;transform:translate(-50%);top:0;height:100%}.react-flow__resize-control.line.left{left:0;border-left-width:1px}.react-flow__resize-control.line.right{left:100%;border-right-width:1px}.react-flow__resize-control.line.top,.react-flow__resize-control.line.bottom{height:1px;transform:translateY(-50%);left:0;width:100%}.react-flow__resize-control.line.top{top:0;border-top-width:1px}.react-flow__resize-control.line.bottom{border-bottom-width:1px;top:100%} diff --git a/invokeai/frontend/web/dist/assets/App-6125620a.css b/invokeai/frontend/web/dist/assets/App-6125620a.css new file mode 100644 index 0000000000..b231132262 --- /dev/null +++ b/invokeai/frontend/web/dist/assets/App-6125620a.css @@ -0,0 +1 @@ +.react-flow__container{position:absolute;width:100%;height:100%;top:0;left:0}.react-flow__pane{z-index:1;cursor:-webkit-grab;cursor:grab}.react-flow__pane.selection{cursor:pointer}.react-flow__pane.dragging{cursor:-webkit-grabbing;cursor:grabbing}.react-flow__viewport{transform-origin:0 0;z-index:2;pointer-events:none}.react-flow__renderer{z-index:4}.react-flow__selection{z-index:6}.react-flow__nodesselection-rect:focus,.react-flow__nodesselection-rect:focus-visible{outline:none}.react-flow .react-flow__edges{pointer-events:none;overflow:visible}.react-flow__edge-path,.react-flow__connection-path{stroke:#b1b1b7;stroke-width:1;fill:none}.react-flow__edge{pointer-events:visibleStroke;cursor:pointer}.react-flow__edge.animated path{stroke-dasharray:5;-webkit-animation:dashdraw .5s linear infinite;animation:dashdraw .5s linear infinite}.react-flow__edge.animated path.react-flow__edge-interaction{stroke-dasharray:none;-webkit-animation:none;animation:none}.react-flow__edge.inactive{pointer-events:none}.react-flow__edge.selected,.react-flow__edge:focus,.react-flow__edge:focus-visible{outline:none}.react-flow__edge.selected .react-flow__edge-path,.react-flow__edge:focus .react-flow__edge-path,.react-flow__edge:focus-visible .react-flow__edge-path{stroke:#555}.react-flow__edge-textwrapper{pointer-events:all}.react-flow__edge-textbg{fill:#fff}.react-flow__edge .react-flow__edge-text{pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none}.react-flow__connection{pointer-events:none}.react-flow__connection .animated{stroke-dasharray:5;-webkit-animation:dashdraw .5s linear infinite;animation:dashdraw .5s linear infinite}.react-flow__connectionline{z-index:1001}.react-flow__nodes{pointer-events:none;transform-origin:0 0}.react-flow__node{position:absolute;-webkit-user-select:none;-moz-user-select:none;user-select:none;pointer-events:all;transform-origin:0 0;box-sizing:border-box;cursor:-webkit-grab;cursor:grab}.react-flow__node.dragging{cursor:-webkit-grabbing;cursor:grabbing}.react-flow__nodesselection{z-index:3;transform-origin:left top;pointer-events:none}.react-flow__nodesselection-rect{position:absolute;pointer-events:all;cursor:-webkit-grab;cursor:grab}.react-flow__handle{position:absolute;pointer-events:none;min-width:5px;min-height:5px;width:6px;height:6px;background:#1a192b;border:1px solid white;border-radius:100%}.react-flow__handle.connectionindicator{pointer-events:all;cursor:crosshair}.react-flow__handle-bottom{top:auto;left:50%;bottom:-4px;transform:translate(-50%)}.react-flow__handle-top{left:50%;top:-4px;transform:translate(-50%)}.react-flow__handle-left{top:50%;left:-4px;transform:translateY(-50%)}.react-flow__handle-right{right:-4px;top:50%;transform:translateY(-50%)}.react-flow__edgeupdater{cursor:move;pointer-events:all}.react-flow__panel{position:absolute;z-index:5;margin:15px}.react-flow__panel.top{top:0}.react-flow__panel.bottom{bottom:0}.react-flow__panel.left{left:0}.react-flow__panel.right{right:0}.react-flow__panel.center{left:50%;transform:translate(-50%)}.react-flow__attribution{font-size:10px;background:rgba(255,255,255,.5);padding:2px 3px;margin:0}.react-flow__attribution a{text-decoration:none;color:#999}@-webkit-keyframes dashdraw{0%{stroke-dashoffset:10}}@keyframes dashdraw{0%{stroke-dashoffset:10}}.react-flow__edgelabel-renderer{position:absolute;width:100%;height:100%;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none}.react-flow__edge.updating .react-flow__edge-path{stroke:#777}.react-flow__edge-text{font-size:10px}.react-flow__node.selectable:focus,.react-flow__node.selectable:focus-visible{outline:none}.react-flow__node-default,.react-flow__node-input,.react-flow__node-output,.react-flow__node-group{padding:10px;border-radius:3px;width:150px;font-size:12px;color:#222;text-align:center;border-width:1px;border-style:solid;border-color:#1a192b;background-color:#fff}.react-flow__node-default.selectable:hover,.react-flow__node-input.selectable:hover,.react-flow__node-output.selectable:hover,.react-flow__node-group.selectable:hover{box-shadow:0 1px 4px 1px #00000014}.react-flow__node-default.selectable.selected,.react-flow__node-default.selectable:focus,.react-flow__node-default.selectable:focus-visible,.react-flow__node-input.selectable.selected,.react-flow__node-input.selectable:focus,.react-flow__node-input.selectable:focus-visible,.react-flow__node-output.selectable.selected,.react-flow__node-output.selectable:focus,.react-flow__node-output.selectable:focus-visible,.react-flow__node-group.selectable.selected,.react-flow__node-group.selectable:focus,.react-flow__node-group.selectable:focus-visible{box-shadow:0 0 0 .5px #1a192b}.react-flow__node-group{background-color:#f0f0f040}.react-flow__nodesselection-rect,.react-flow__selection{background:rgba(0,89,220,.08);border:1px dotted rgba(0,89,220,.8)}.react-flow__nodesselection-rect:focus,.react-flow__nodesselection-rect:focus-visible,.react-flow__selection:focus,.react-flow__selection:focus-visible{outline:none}.react-flow__controls{box-shadow:0 0 2px 1px #00000014}.react-flow__controls-button{border:none;background:#fefefe;border-bottom:1px solid #eee;box-sizing:content-box;display:flex;justify-content:center;align-items:center;width:16px;height:16px;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;user-select:none;padding:5px}.react-flow__controls-button:hover{background:#f4f4f4}.react-flow__controls-button svg{width:100%;max-width:12px;max-height:12px}.react-flow__controls-button:disabled{pointer-events:none}.react-flow__controls-button:disabled svg{fill-opacity:.4}.react-flow__minimap{background-color:#fff}.react-flow__resize-control{position:absolute}.react-flow__resize-control.left,.react-flow__resize-control.right{cursor:ew-resize}.react-flow__resize-control.top,.react-flow__resize-control.bottom{cursor:ns-resize}.react-flow__resize-control.top.left,.react-flow__resize-control.bottom.right{cursor:nwse-resize}.react-flow__resize-control.bottom.left,.react-flow__resize-control.top.right{cursor:nesw-resize}.react-flow__resize-control.handle{width:4px;height:4px;border:1px solid #fff;border-radius:1px;background-color:#3367d9;transform:translate(-50%,-50%)}.react-flow__resize-control.handle.left{left:0;top:50%}.react-flow__resize-control.handle.right{left:100%;top:50%}.react-flow__resize-control.handle.top{left:50%;top:0}.react-flow__resize-control.handle.bottom{left:50%;top:100%}.react-flow__resize-control.handle.top.left,.react-flow__resize-control.handle.bottom.left{left:0}.react-flow__resize-control.handle.top.right,.react-flow__resize-control.handle.bottom.right{left:100%}.react-flow__resize-control.line{border-color:#3367d9;border-width:0;border-style:solid}.react-flow__resize-control.line.left,.react-flow__resize-control.line.right{width:1px;transform:translate(-50%);top:0;height:100%}.react-flow__resize-control.line.left{left:0;border-left-width:1px}.react-flow__resize-control.line.right{left:100%;border-right-width:1px}.react-flow__resize-control.line.top,.react-flow__resize-control.line.bottom{height:1px;transform:translateY(-50%);left:0;width:100%}.react-flow__resize-control.line.top{top:0;border-top-width:1px}.react-flow__resize-control.line.bottom{border-bottom-width:1px;top:100%} diff --git a/invokeai/frontend/web/dist/assets/App-9c3ea767.js b/invokeai/frontend/web/dist/assets/App-9c3ea767.js new file mode 100644 index 0000000000..1f9db4063e --- /dev/null +++ b/invokeai/frontend/web/dist/assets/App-9c3ea767.js @@ -0,0 +1,169 @@ +import{t as Wg,r as aE,i as iE,a as hu,b as a4,S as i4,c as l4,d as c4,e as Vg,f as u4,g as Ug,h as lE,j as cE,k as uE,l as dE,m as fE,n as pE,o as hE,p as mE,q as gE,s as f,u as tt,v as a,I as mo,w as cr,x as Wn,y as He,z as Ot,A as mu,B as mt,C as gu,D as ws,E as io,F as lo,G as xr,H as vE,J as yE,K as Ua,L as Wc,M as Ni,N as sn,O as Sa,P as Vp,Q as ev,R as Sl,T as tv,U as vu,_ as Qn,V as bE,W as N,X as d4,Y as f4,Z as zb,$ as p4,a0 as Up,a1 as nv,a2 as Kl,a3 as xE,a4 as wE,a5 as SE,a6 as CE,a7 as h4,a8 as m4,a9 as Gp,aa as xf,ab as _E,ac as kE,ad as Hm,ae as Lb,af as PE,ag as g4,ah as v4,ai as Yl,aj as Bb,ak as Fb,al as jE,am as IE,an as EE,ao as OE,ap as ME,aq as Wm,ar as nl,as as Vm,at as RE,au as DE,av as TE,aw as rv,ax as qp,ay as wf,az as AE,aA as y4,aB as b4,aC as NE,aD as yu,aE as ov,aF as $E,aG as zE,aH as LE,aI as BE,aJ as FE,aK as HE,aL as WE,aM as Hb,aN as ze,aO as F,aP as aa,aQ as ve,aR as Mo,aS as ur,aT as te,aU as L,aV as Ql,aW as fe,aX as x4,aY as w4,aZ as Xl,a_ as Ro,a$ as Ve,b0 as _n,b1 as Sf,b2 as VE,b3 as Ga,b4 as sv,b5 as Cf,b6 as S4,b7 as av,b8 as Rt,b9 as iv,ba as UE,bb as GE,bc as qE,bd as rl,be as gs,bf as C4,bg as KE,bh as YE,bi as bu,bj as it,bk as lv,bl as qa,bm as Wb,bn as QE,bo as XE,bp as JE,bq as _d,br as kd,bs as Vc,bt as Uc,bu as Vb,bv as _f,bw as Ub,bx as kf,by as Gb,bz as Gg,bA as qb,bB as qg,bC as Kb,bD as Pf,bE as Yb,bF as Tl,bG as Qb,bH as Al,bI as Xb,bJ as jf,bK as ZE,bL as If,bM as _4,bN as cv,bO as uv,bP as e8,bQ as k4,bR as t8,bS as n8,bT as Kp,bU as gl,bV as r8,bW as ff,bX as je,bY as o8,bZ as s8,b_ as a8,b$ as Ef,c0 as Jl,c1 as P4,c2 as i8,c3 as j4,c4 as Jb,c5 as Zb,c6 as l8,c7 as Ws,c8 as ex,c9 as St,ca as Of,cb as c8,cc as I4,cd as Jr,ce as u8,cf as Xn,cg as Qt,ch as Kg,ci as Vs,cj as Ss,ck as vs,cl as E4,cm as d8,cn as O4,co as tx,cp as f8,cq as p8,cr as h8,cs as m8,ct as vr,cu as M4,cv as g8,cw as v8,cx as y8,cy as b8,cz as x8,cA as dv,cB as Ko,cC as R4,cD as D4,cE as w8,cF as nx,cG as S8,cH as C8,cI as _8,cJ as k8,cK as P8,cL as j8,cM as I8,cN as T4,cO as E8,cP as O8,cQ as M8,cR as R8,cS as D8,cT as T8,cU as $r,cV as A4,cW as A8,cX as rx,cY as N8,cZ as $8,c_ as z8,c$ as L8,d0 as B8,d1 as F8,d2 as H8,d3 as W8,d4 as N4,d5 as Qo,d6 as V8,d7 as U8,d8 as G8,d9 as Yp,da as q8,db as fv,dc as $4,dd as K8,de as Y8,df as Q8,dg as Xo,dh as X8,di as ox,dj as sx,dk as Cl,dl as J8,dm as Z8,dn as e7,dp as t7,dq as n7,dr as r7,ds as o7,dt as s7,du as a7,dv as i7,dw as l7,dx as pv,dy as hv,dz as c7,dA as ax,dB as u7,dC as ix,dD as Jo,dE as d7,dF as f7,dG as lx,dH as cx,dI as p7,dJ as ux,dK as h7,dL as m7,dM as g7,dN as v7,dO as y7,dP as b7,dQ as z4,dR as L4,dS as B4,dT as F4,dU as H4,dV as xu,dW as dx,dX as x7,dY as ji,dZ as w7,d_ as W4,d$ as fx,e0 as S7,e1 as cs,e2 as C7,e3 as _7,e4 as V4,e5 as U4,e6 as k7,e7 as G4,e8 as q4,e9 as rr,ea as or,eb as wu,ec as K4,ed as Y4,ee as px,ef as P7,eg as hx,eh as j7,ei as Q4,ej as I7,ek as Qp,el as mx,em as X4,en as E7,eo as gx,ep as J4,eq as Yo,er as O7,es as M7,et as Z4,eu as R7,ev as D7,ew as T7,ex as A7,ey as N7,ez as $7,eA as z7,eB as L7,eC as B7,eD as F7,eE as H7,eF as W7,eG as V7,eH as U7,eI as G7,eJ as q7,eK as K7,eL as Y7,eM as Q7,eN as vx,eO as pf,eP as X7,eQ as en,eR as Mf,eS as e3,eT as eu,eU as J7,eV as Z7,eW as Hs,eX as t3,eY as mv,eZ as Su,e_ as eO,e$ as tO,f0 as nO,f1 as ha,f2 as n3,f3 as rO,f4 as oO,f5 as r3,f6 as sO,f7 as aO,f8 as iO,f9 as lO,fa as cO,fb as uO,fc as dO,fd as fO,fe as pO,ff as hO,fg as mO,fh as yx,fi as gO,fj as vO,fk as yO,fl as bO,fm as xO,fn as wO,fo as Um,fp as Bs,fq as Pd,fr as Gm,fs as qm,ft as jd,fu as bx,fv as Yg,fw as SO,fx as CO,fy as _O,fz as kO,fA as PO,fB as Rf,fC as o3,fD as s3,fE as jO,fF as IO,fG as a3,fH as i3,fI as l3,fJ as c3,fK as u3,fL as d3,fM as f3,fN as p3,fO as _l,fP as kl,fQ as h3,fR as m3,fS as EO,fT as g3,fU as v3,fV as y3,fW as b3,fX as x3,fY as w3,fZ as S3,f_ as gv,f$ as OO,g0 as MO,g1 as xx,g2 as RO,g3 as DO,g4 as Df,g5 as wx,g6 as Sx,g7 as Cx,g8 as _x,g9 as TO,ga as AO,gb as NO,gc as $O,gd as zO,ge as LO,gf as BO,gg as FO,gh as HO,gi as WO}from"./index-adc79457.js";import{m as C3,u as _3,a as Ca,b as VO,r as $e,f as UO,g as kx,c as At,d as mr}from"./MantineProvider-bb0be923.js";function GO(e,t){if(e==null)return{};var n={},r=Object.keys(e),o,s;for(s=0;s=0)&&(n[o]=e[o]);return n}var Px=1/0,qO=17976931348623157e292;function Km(e){if(!e)return e===0?e:0;if(e=Wg(e),e===Px||e===-Px){var t=e<0?-1:1;return t*qO}return e===e?e:0}var KO=function(){return aE.Date.now()};const Ym=KO;var YO="Expected a function",QO=Math.max,XO=Math.min;function JO(e,t,n){var r,o,s,i,u,d,p=0,h=!1,g=!1,v=!0;if(typeof e!="function")throw new TypeError(YO);t=Wg(t)||0,iE(n)&&(h=!!n.leading,g="maxWait"in n,s=g?QO(Wg(n.maxWait)||0,t):s,v="trailing"in n?!!n.trailing:v);function b(O){var M=r,T=o;return r=o=void 0,p=O,i=e.apply(T,M),i}function S(O){return p=O,u=setTimeout(_,t),h?b(O):i}function w(O){var M=O-d,T=O-p,A=t-M;return g?XO(A,s-T):A}function C(O){var M=O-d,T=O-p;return d===void 0||M>=t||M<0||g&&T>=s}function _(){var O=Ym();if(C(O))return k(O);u=setTimeout(_,w(O))}function k(O){return u=void 0,v&&r?b(O):(r=o=void 0,i)}function j(){u!==void 0&&clearTimeout(u),p=0,r=d=o=u=void 0}function E(){return u===void 0?i:k(Ym())}function I(){var O=Ym(),M=C(O);if(r=arguments,o=this,d=O,M){if(u===void 0)return S(d);if(g)return clearTimeout(u),u=setTimeout(_,t),b(d)}return u===void 0&&(u=setTimeout(_,t)),i}return I.cancel=j,I.flush=E,I}var ZO=200;function e9(e,t,n,r){var o=-1,s=l4,i=!0,u=e.length,d=[],p=t.length;if(!u)return d;n&&(t=hu(t,a4(n))),r?(s=c4,i=!1):t.length>=ZO&&(s=Vg,i=!1,t=new i4(t));e:for(;++o=120&&h.length>=120)?new i4(i&&h):void 0}h=e[0];var g=-1,v=u[0];e:for(;++ga.jsx(mo,{ref:d,viewBox:t,...o,...u,children:s.length?s:a.jsx("path",{fill:"currentColor",d:n})}));return i.displayName=r,i}var v9=Object.defineProperty,y9=(e,t,n)=>t in e?v9(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,lr=(e,t,n)=>(y9(e,typeof t!="symbol"?t+"":t,n),n);function Ix(e){return e.sort((t,n)=>{const r=t.compareDocumentPosition(n);if(r&Node.DOCUMENT_POSITION_FOLLOWING||r&Node.DOCUMENT_POSITION_CONTAINED_BY)return-1;if(r&Node.DOCUMENT_POSITION_PRECEDING||r&Node.DOCUMENT_POSITION_CONTAINS)return 1;if(r&Node.DOCUMENT_POSITION_DISCONNECTED||r&Node.DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC)throw Error("Cannot sort the given nodes.");return 0})}var b9=e=>typeof e=="object"&&"nodeType"in e&&e.nodeType===Node.ELEMENT_NODE;function Ex(e,t,n){let r=e+1;return n&&r>=t&&(r=0),r}function Ox(e,t,n){let r=e-1;return n&&r<0&&(r=t),r}var Qg=typeof window<"u"?f.useLayoutEffect:f.useEffect,Tf=e=>e,x9=class{constructor(){lr(this,"descendants",new Map),lr(this,"register",e=>{if(e!=null)return b9(e)?this.registerNode(e):t=>{this.registerNode(t,e)}}),lr(this,"unregister",e=>{this.descendants.delete(e);const t=Ix(Array.from(this.descendants.keys()));this.assignIndex(t)}),lr(this,"destroy",()=>{this.descendants.clear()}),lr(this,"assignIndex",e=>{this.descendants.forEach(t=>{const n=e.indexOf(t.node);t.index=n,t.node.dataset.index=t.index.toString()})}),lr(this,"count",()=>this.descendants.size),lr(this,"enabledCount",()=>this.enabledValues().length),lr(this,"values",()=>Array.from(this.descendants.values()).sort((t,n)=>t.index-n.index)),lr(this,"enabledValues",()=>this.values().filter(e=>!e.disabled)),lr(this,"item",e=>{if(this.count()!==0)return this.values()[e]}),lr(this,"enabledItem",e=>{if(this.enabledCount()!==0)return this.enabledValues()[e]}),lr(this,"first",()=>this.item(0)),lr(this,"firstEnabled",()=>this.enabledItem(0)),lr(this,"last",()=>this.item(this.descendants.size-1)),lr(this,"lastEnabled",()=>{const e=this.enabledValues().length-1;return this.enabledItem(e)}),lr(this,"indexOf",e=>{var t,n;return e&&(n=(t=this.descendants.get(e))==null?void 0:t.index)!=null?n:-1}),lr(this,"enabledIndexOf",e=>e==null?-1:this.enabledValues().findIndex(t=>t.node.isSameNode(e))),lr(this,"next",(e,t=!0)=>{const n=Ex(e,this.count(),t);return this.item(n)}),lr(this,"nextEnabled",(e,t=!0)=>{const n=this.item(e);if(!n)return;const r=this.enabledIndexOf(n.node),o=Ex(r,this.enabledCount(),t);return this.enabledItem(o)}),lr(this,"prev",(e,t=!0)=>{const n=Ox(e,this.count()-1,t);return this.item(n)}),lr(this,"prevEnabled",(e,t=!0)=>{const n=this.item(e);if(!n)return;const r=this.enabledIndexOf(n.node),o=Ox(r,this.enabledCount()-1,t);return this.enabledItem(o)}),lr(this,"registerNode",(e,t)=>{if(!e||this.descendants.has(e))return;const n=Array.from(this.descendants.keys()).concat(e),r=Ix(n);t!=null&&t.disabled&&(t.disabled=!!t.disabled);const o={node:e,index:-1,...t};this.descendants.set(e,o),this.assignIndex(r)})}};function w9(){const e=f.useRef(new x9);return Qg(()=>()=>e.current.destroy()),e.current}var[S9,k3]=cr({name:"DescendantsProvider",errorMessage:"useDescendantsContext must be used within DescendantsProvider"});function C9(e){const t=k3(),[n,r]=f.useState(-1),o=f.useRef(null);Qg(()=>()=>{o.current&&t.unregister(o.current)},[]),Qg(()=>{if(!o.current)return;const i=Number(o.current.dataset.index);n!=i&&!Number.isNaN(i)&&r(i)});const s=Tf(e?t.register(e):t.register);return{descendants:t,index:n,enabledIndex:t.enabledIndexOf(o.current),register:Wn(s,o)}}function yv(){return[Tf(S9),()=>Tf(k3()),()=>w9(),o=>C9(o)]}var[_9,Xp]=cr({name:"AccordionStylesContext",hookName:"useAccordionStyles",providerName:""}),[k9,bv]=cr({name:"AccordionItemContext",hookName:"useAccordionItemContext",providerName:""}),[P9,Hoe,j9,I9]=yv(),Ac=tt(function(t,n){const{getButtonProps:r}=bv(),o=r(t,n),i={display:"flex",alignItems:"center",width:"100%",outline:0,...Xp().button};return a.jsx(He.button,{...o,className:Ot("chakra-accordion__button",t.className),__css:i})});Ac.displayName="AccordionButton";function E9(e){const{onChange:t,defaultIndex:n,index:r,allowMultiple:o,allowToggle:s,...i}=e;R9(e),D9(e);const u=j9(),[d,p]=f.useState(-1);f.useEffect(()=>()=>{p(-1)},[]);const[h,g]=mu({value:r,defaultValue(){return o?n??[]:n??-1},onChange:t});return{index:h,setIndex:g,htmlProps:i,getAccordionItemProps:b=>{let S=!1;return b!==null&&(S=Array.isArray(h)?h.includes(b):h===b),{isOpen:S,onChange:C=>{if(b!==null)if(o&&Array.isArray(h)){const _=C?h.concat(b):h.filter(k=>k!==b);g(_)}else C?g(b):s&&g(-1)}}},focusedIndex:d,setFocusedIndex:p,descendants:u}}var[O9,xv]=cr({name:"AccordionContext",hookName:"useAccordionContext",providerName:"Accordion"});function M9(e){const{isDisabled:t,isFocusable:n,id:r,...o}=e,{getAccordionItemProps:s,setFocusedIndex:i}=xv(),u=f.useRef(null),d=f.useId(),p=r??d,h=`accordion-button-${p}`,g=`accordion-panel-${p}`;T9(e);const{register:v,index:b,descendants:S}=I9({disabled:t&&!n}),{isOpen:w,onChange:C}=s(b===-1?null:b);A9({isOpen:w,isDisabled:t});const _=()=>{C==null||C(!0)},k=()=>{C==null||C(!1)},j=f.useCallback(()=>{C==null||C(!w),i(b)},[b,i,w,C]),E=f.useCallback(T=>{const z={ArrowDown:()=>{const $=S.nextEnabled(b);$==null||$.node.focus()},ArrowUp:()=>{const $=S.prevEnabled(b);$==null||$.node.focus()},Home:()=>{const $=S.firstEnabled();$==null||$.node.focus()},End:()=>{const $=S.lastEnabled();$==null||$.node.focus()}}[T.key];z&&(T.preventDefault(),z(T))},[S,b]),I=f.useCallback(()=>{i(b)},[i,b]),O=f.useCallback(function(A={},z=null){return{...A,type:"button",ref:Wn(v,u,z),id:h,disabled:!!t,"aria-expanded":!!w,"aria-controls":g,onClick:mt(A.onClick,j),onFocus:mt(A.onFocus,I),onKeyDown:mt(A.onKeyDown,E)}},[h,t,w,j,I,E,g,v]),M=f.useCallback(function(A={},z=null){return{...A,ref:z,role:"region",id:g,"aria-labelledby":h,hidden:!w}},[h,w,g]);return{isOpen:w,isDisabled:t,isFocusable:n,onOpen:_,onClose:k,getButtonProps:O,getPanelProps:M,htmlProps:o}}function R9(e){const t=e.index||e.defaultIndex,n=t!=null&&!Array.isArray(t)&&e.allowMultiple;gu({condition:!!n,message:`If 'allowMultiple' is passed, then 'index' or 'defaultIndex' must be an array. You passed: ${typeof t},`})}function D9(e){gu({condition:!!(e.allowMultiple&&e.allowToggle),message:"If 'allowMultiple' is passed, 'allowToggle' will be ignored. Either remove 'allowToggle' or 'allowMultiple' depending on whether you want multiple accordions visible or not"})}function T9(e){gu({condition:!!(e.isFocusable&&!e.isDisabled),message:`Using only 'isFocusable', this prop is reserved for situations where you pass 'isDisabled' but you still want the element to receive focus (A11y). Either remove it or pass 'isDisabled' as well. + `})}function A9(e){gu({condition:e.isOpen&&!!e.isDisabled,message:"Cannot open a disabled accordion item"})}function Nc(e){const{isOpen:t,isDisabled:n}=bv(),{reduceMotion:r}=xv(),o=Ot("chakra-accordion__icon",e.className),s=Xp(),i={opacity:n?.4:1,transform:t?"rotate(-180deg)":void 0,transition:r?void 0:"transform 0.2s",transformOrigin:"center",...s.icon};return a.jsx(mo,{viewBox:"0 0 24 24","aria-hidden":!0,className:o,__css:i,...e,children:a.jsx("path",{fill:"currentColor",d:"M16.59 8.59L12 13.17 7.41 8.59 6 10l6 6 6-6z"})})}Nc.displayName="AccordionIcon";var $c=tt(function(t,n){const{children:r,className:o}=t,{htmlProps:s,...i}=M9(t),d={...Xp().container,overflowAnchor:"none"},p=f.useMemo(()=>i,[i]);return a.jsx(k9,{value:p,children:a.jsx(He.div,{ref:n,...s,className:Ot("chakra-accordion__item",o),__css:d,children:typeof r=="function"?r({isExpanded:!!i.isOpen,isDisabled:!!i.isDisabled}):r})})});$c.displayName="AccordionItem";var bi={ease:[.25,.1,.25,1],easeIn:[.4,0,1,1],easeOut:[0,0,.2,1],easeInOut:[.4,0,.2,1]},kc={scale:{enter:{scale:1},exit:{scale:.95}},fade:{enter:{opacity:1},exit:{opacity:0}},pushLeft:{enter:{x:"100%"},exit:{x:"-30%"}},pushRight:{enter:{x:"-100%"},exit:{x:"30%"}},pushUp:{enter:{y:"100%"},exit:{y:"-30%"}},pushDown:{enter:{y:"-100%"},exit:{y:"30%"}},slideLeft:{position:{left:0,top:0,bottom:0,width:"100%"},enter:{x:0,y:0},exit:{x:"-100%",y:0}},slideRight:{position:{right:0,top:0,bottom:0,width:"100%"},enter:{x:0,y:0},exit:{x:"100%",y:0}},slideUp:{position:{top:0,left:0,right:0,maxWidth:"100vw"},enter:{x:0,y:0},exit:{x:0,y:"-100%"}},slideDown:{position:{bottom:0,left:0,right:0,maxWidth:"100vw"},enter:{x:0,y:0},exit:{x:0,y:"100%"}}};function Xg(e){var t;switch((t=e==null?void 0:e.direction)!=null?t:"right"){case"right":return kc.slideRight;case"left":return kc.slideLeft;case"bottom":return kc.slideDown;case"top":return kc.slideUp;default:return kc.slideRight}}var wi={enter:{duration:.2,ease:bi.easeOut},exit:{duration:.1,ease:bi.easeIn}},us={enter:(e,t)=>({...e,delay:typeof t=="number"?t:t==null?void 0:t.enter}),exit:(e,t)=>({...e,delay:typeof t=="number"?t:t==null?void 0:t.exit})},N9=e=>e!=null&&parseInt(e.toString(),10)>0,Mx={exit:{height:{duration:.2,ease:bi.ease},opacity:{duration:.3,ease:bi.ease}},enter:{height:{duration:.3,ease:bi.ease},opacity:{duration:.4,ease:bi.ease}}},$9={exit:({animateOpacity:e,startingHeight:t,transition:n,transitionEnd:r,delay:o})=>{var s;return{...e&&{opacity:N9(t)?1:0},height:t,transitionEnd:r==null?void 0:r.exit,transition:(s=n==null?void 0:n.exit)!=null?s:us.exit(Mx.exit,o)}},enter:({animateOpacity:e,endingHeight:t,transition:n,transitionEnd:r,delay:o})=>{var s;return{...e&&{opacity:1},height:t,transitionEnd:r==null?void 0:r.enter,transition:(s=n==null?void 0:n.enter)!=null?s:us.enter(Mx.enter,o)}}},Jp=f.forwardRef((e,t)=>{const{in:n,unmountOnExit:r,animateOpacity:o=!0,startingHeight:s=0,endingHeight:i="auto",style:u,className:d,transition:p,transitionEnd:h,...g}=e,[v,b]=f.useState(!1);f.useEffect(()=>{const k=setTimeout(()=>{b(!0)});return()=>clearTimeout(k)},[]),gu({condition:Number(s)>0&&!!r,message:"startingHeight and unmountOnExit are mutually exclusive. You can't use them together"});const S=parseFloat(s.toString())>0,w={startingHeight:s,endingHeight:i,animateOpacity:o,transition:v?p:{enter:{duration:0}},transitionEnd:{enter:h==null?void 0:h.enter,exit:r?h==null?void 0:h.exit:{...h==null?void 0:h.exit,display:S?"block":"none"}}},C=r?n:!0,_=n||r?"enter":"exit";return a.jsx(ws,{initial:!1,custom:w,children:C&&a.jsx(io.div,{ref:t,...g,className:Ot("chakra-collapse",d),style:{overflow:"hidden",display:"block",...u},custom:w,variants:$9,initial:r?"exit":!1,animate:_,exit:"exit"})})});Jp.displayName="Collapse";var z9={enter:({transition:e,transitionEnd:t,delay:n}={})=>{var r;return{opacity:1,transition:(r=e==null?void 0:e.enter)!=null?r:us.enter(wi.enter,n),transitionEnd:t==null?void 0:t.enter}},exit:({transition:e,transitionEnd:t,delay:n}={})=>{var r;return{opacity:0,transition:(r=e==null?void 0:e.exit)!=null?r:us.exit(wi.exit,n),transitionEnd:t==null?void 0:t.exit}}},P3={initial:"exit",animate:"enter",exit:"exit",variants:z9},L9=f.forwardRef(function(t,n){const{unmountOnExit:r,in:o,className:s,transition:i,transitionEnd:u,delay:d,...p}=t,h=o||r?"enter":"exit",g=r?o&&r:!0,v={transition:i,transitionEnd:u,delay:d};return a.jsx(ws,{custom:v,children:g&&a.jsx(io.div,{ref:n,className:Ot("chakra-fade",s),custom:v,...P3,animate:h,...p})})});L9.displayName="Fade";var B9={exit:({reverse:e,initialScale:t,transition:n,transitionEnd:r,delay:o})=>{var s;return{opacity:0,...e?{scale:t,transitionEnd:r==null?void 0:r.exit}:{transitionEnd:{scale:t,...r==null?void 0:r.exit}},transition:(s=n==null?void 0:n.exit)!=null?s:us.exit(wi.exit,o)}},enter:({transitionEnd:e,transition:t,delay:n})=>{var r;return{opacity:1,scale:1,transition:(r=t==null?void 0:t.enter)!=null?r:us.enter(wi.enter,n),transitionEnd:e==null?void 0:e.enter}}},j3={initial:"exit",animate:"enter",exit:"exit",variants:B9},F9=f.forwardRef(function(t,n){const{unmountOnExit:r,in:o,reverse:s=!0,initialScale:i=.95,className:u,transition:d,transitionEnd:p,delay:h,...g}=t,v=r?o&&r:!0,b=o||r?"enter":"exit",S={initialScale:i,reverse:s,transition:d,transitionEnd:p,delay:h};return a.jsx(ws,{custom:S,children:v&&a.jsx(io.div,{ref:n,className:Ot("chakra-offset-slide",u),...j3,animate:b,custom:S,...g})})});F9.displayName="ScaleFade";var H9={initial:({offsetX:e,offsetY:t,transition:n,transitionEnd:r,delay:o})=>{var s;return{opacity:0,x:e,y:t,transition:(s=n==null?void 0:n.exit)!=null?s:us.exit(wi.exit,o),transitionEnd:r==null?void 0:r.exit}},enter:({transition:e,transitionEnd:t,delay:n})=>{var r;return{opacity:1,x:0,y:0,transition:(r=e==null?void 0:e.enter)!=null?r:us.enter(wi.enter,n),transitionEnd:t==null?void 0:t.enter}},exit:({offsetY:e,offsetX:t,transition:n,transitionEnd:r,reverse:o,delay:s})=>{var i;const u={x:t,y:e};return{opacity:0,transition:(i=n==null?void 0:n.exit)!=null?i:us.exit(wi.exit,s),...o?{...u,transitionEnd:r==null?void 0:r.exit}:{transitionEnd:{...u,...r==null?void 0:r.exit}}}}},Jg={initial:"initial",animate:"enter",exit:"exit",variants:H9},W9=f.forwardRef(function(t,n){const{unmountOnExit:r,in:o,reverse:s=!0,className:i,offsetX:u=0,offsetY:d=8,transition:p,transitionEnd:h,delay:g,...v}=t,b=r?o&&r:!0,S=o||r?"enter":"exit",w={offsetX:u,offsetY:d,reverse:s,transition:p,transitionEnd:h,delay:g};return a.jsx(ws,{custom:w,children:b&&a.jsx(io.div,{ref:n,className:Ot("chakra-offset-slide",i),custom:w,...Jg,animate:S,...v})})});W9.displayName="SlideFade";var Rx={exit:{duration:.15,ease:bi.easeInOut},enter:{type:"spring",damping:25,stiffness:180}},V9={exit:({direction:e,transition:t,transitionEnd:n,delay:r})=>{var o;const{exit:s}=Xg({direction:e});return{...s,transition:(o=t==null?void 0:t.exit)!=null?o:us.exit(Rx.exit,r),transitionEnd:n==null?void 0:n.exit}},enter:({direction:e,transitionEnd:t,transition:n,delay:r})=>{var o;const{enter:s}=Xg({direction:e});return{...s,transition:(o=n==null?void 0:n.enter)!=null?o:us.enter(Rx.enter,r),transitionEnd:t==null?void 0:t.enter}}},I3=f.forwardRef(function(t,n){const{direction:r="right",style:o,unmountOnExit:s,in:i,className:u,transition:d,transitionEnd:p,delay:h,motionProps:g,...v}=t,b=Xg({direction:r}),S=Object.assign({position:"fixed"},b.position,o),w=s?i&&s:!0,C=i||s?"enter":"exit",_={transitionEnd:p,transition:d,direction:r,delay:h};return a.jsx(ws,{custom:_,children:w&&a.jsx(io.div,{...v,ref:n,initial:"exit",className:Ot("chakra-slide",u),animate:C,exit:"exit",custom:_,variants:V9,style:S,...g})})});I3.displayName="Slide";var zc=tt(function(t,n){const{className:r,motionProps:o,...s}=t,{reduceMotion:i}=xv(),{getPanelProps:u,isOpen:d}=bv(),p=u(s,n),h=Ot("chakra-accordion__panel",r),g=Xp();i||delete p.hidden;const v=a.jsx(He.div,{...p,__css:g.panel,className:h});return i?v:a.jsx(Jp,{in:d,...o,children:v})});zc.displayName="AccordionPanel";var E3=tt(function({children:t,reduceMotion:n,...r},o){const s=lo("Accordion",r),i=xr(r),{htmlProps:u,descendants:d,...p}=E9(i),h=f.useMemo(()=>({...p,reduceMotion:!!n}),[p,n]);return a.jsx(P9,{value:d,children:a.jsx(O9,{value:h,children:a.jsx(_9,{value:s,children:a.jsx(He.div,{ref:o,...u,className:Ot("chakra-accordion",r.className),__css:s.root,children:t})})})})});E3.displayName="Accordion";var U9={horizontal:{"> *:first-of-type:not(:last-of-type)":{borderEndRadius:0},"> *:not(:first-of-type):not(:last-of-type)":{borderRadius:0},"> *:not(:first-of-type):last-of-type":{borderStartRadius:0}},vertical:{"> *:first-of-type:not(:last-of-type)":{borderBottomRadius:0},"> *:not(:first-of-type):not(:last-of-type)":{borderRadius:0},"> *:not(:first-of-type):last-of-type":{borderTopRadius:0}}},G9={horizontal:e=>({"& > *:not(style) ~ *:not(style)":{marginStart:e}}),vertical:e=>({"& > *:not(style) ~ *:not(style)":{marginTop:e}})},Yn=tt(function(t,n){const{size:r,colorScheme:o,variant:s,className:i,spacing:u="0.5rem",isAttached:d,isDisabled:p,orientation:h="horizontal",...g}=t,v=Ot("chakra-button__group",i),b=f.useMemo(()=>({size:r,colorScheme:o,variant:s,isDisabled:p}),[r,o,s,p]);let S={display:"inline-flex",...d?U9[h]:G9[h](u)};const w=h==="vertical";return a.jsx(vE,{value:b,children:a.jsx(He.div,{ref:n,role:"group",__css:S,className:v,"data-attached":d?"":void 0,"data-orientation":h,flexDir:w?"column":void 0,...g})})});Yn.displayName="ButtonGroup";var[Woe,q9]=cr({name:"CheckboxGroupContext",strict:!1});function K9(e){const[t,n]=f.useState(e),[r,o]=f.useState(!1);return e!==t&&(o(!0),n(e)),r}function Y9(e){return a.jsx(He.svg,{width:"1.2em",viewBox:"0 0 12 10",style:{fill:"none",strokeWidth:2,stroke:"currentColor",strokeDasharray:16},...e,children:a.jsx("polyline",{points:"1.5 6 4.5 9 10.5 1"})})}function Q9(e){return a.jsx(He.svg,{width:"1.2em",viewBox:"0 0 24 24",style:{stroke:"currentColor",strokeWidth:4},...e,children:a.jsx("line",{x1:"21",x2:"3",y1:"12",y2:"12"})})}function X9(e){const{isIndeterminate:t,isChecked:n,...r}=e,o=t?Q9:Y9;return n||t?a.jsx(He.div,{style:{display:"flex",alignItems:"center",justifyContent:"center",height:"100%"},children:a.jsx(o,{...r})}):null}var wv={border:"0",clip:"rect(0, 0, 0, 0)",height:"1px",width:"1px",margin:"-1px",padding:"0",overflow:"hidden",whiteSpace:"nowrap",position:"absolute"},O3=He("span",{baseStyle:wv});O3.displayName="VisuallyHidden";var J9=He("input",{baseStyle:wv});J9.displayName="VisuallyHiddenInput";var Dx=!1,_u=null,Ii=!1,Zg=!1,e0=new Set;function Sv(e,t){e0.forEach(n=>n(e,t))}var Z9=typeof window<"u"&&window.navigator!=null?/^Mac/.test(window.navigator.platform):!1;function eM(e){return!(e.metaKey||!Z9&&e.altKey||e.ctrlKey||e.key==="Control"||e.key==="Shift"||e.key==="Meta")}function Tx(e){Ii=!0,eM(e)&&(_u="keyboard",Sv("keyboard",e))}function sl(e){if(_u="pointer",e.type==="mousedown"||e.type==="pointerdown"){Ii=!0;const t=e.composedPath?e.composedPath()[0]:e.target;let n=!1;try{n=t.matches(":focus-visible")}catch{}if(n)return;Sv("pointer",e)}}function tM(e){return e.mozInputSource===0&&e.isTrusted?!0:e.detail===0&&!e.pointerType}function nM(e){tM(e)&&(Ii=!0,_u="virtual")}function rM(e){e.target===window||e.target===document||(!Ii&&!Zg&&(_u="virtual",Sv("virtual",e)),Ii=!1,Zg=!1)}function oM(){Ii=!1,Zg=!0}function Ax(){return _u!=="pointer"}function sM(){if(typeof window>"u"||Dx)return;const{focus:e}=HTMLElement.prototype;HTMLElement.prototype.focus=function(...n){Ii=!0,e.apply(this,n)},document.addEventListener("keydown",Tx,!0),document.addEventListener("keyup",Tx,!0),document.addEventListener("click",nM,!0),window.addEventListener("focus",rM,!0),window.addEventListener("blur",oM,!1),typeof PointerEvent<"u"?(document.addEventListener("pointerdown",sl,!0),document.addEventListener("pointermove",sl,!0),document.addEventListener("pointerup",sl,!0)):(document.addEventListener("mousedown",sl,!0),document.addEventListener("mousemove",sl,!0),document.addEventListener("mouseup",sl,!0)),Dx=!0}function M3(e){sM(),e(Ax());const t=()=>e(Ax());return e0.add(t),()=>{e0.delete(t)}}function aM(e,t=[]){const n=Object.assign({},e);for(const r of t)r in n&&delete n[r];return n}function R3(e={}){const t=yE(e),{isDisabled:n,isReadOnly:r,isRequired:o,isInvalid:s,id:i,onBlur:u,onFocus:d,"aria-describedby":p}=t,{defaultChecked:h,isChecked:g,isFocusable:v,onChange:b,isIndeterminate:S,name:w,value:C,tabIndex:_=void 0,"aria-label":k,"aria-labelledby":j,"aria-invalid":E,...I}=e,O=aM(I,["isDisabled","isReadOnly","isRequired","isInvalid","id","onBlur","onFocus","aria-describedby"]),M=Ua(b),T=Ua(u),A=Ua(d),[z,$]=f.useState(!1),[ee,B]=f.useState(!1),[H,G]=f.useState(!1),[K,R]=f.useState(!1);f.useEffect(()=>M3($),[]);const U=f.useRef(null),[V,J]=f.useState(!0),[ie,xe]=f.useState(!!h),he=g!==void 0,ae=he?g:ie,Z=f.useCallback(me=>{if(r||n){me.preventDefault();return}he||xe(ae?me.target.checked:S?!0:me.target.checked),M==null||M(me)},[r,n,ae,he,S,M]);Wc(()=>{U.current&&(U.current.indeterminate=!!S)},[S]),Ni(()=>{n&&B(!1)},[n,B]),Wc(()=>{const me=U.current;me!=null&&me.form&&(me.form.onreset=()=>{xe(!!h)})},[]);const W=n&&!v,re=f.useCallback(me=>{me.key===" "&&R(!0)},[R]),pe=f.useCallback(me=>{me.key===" "&&R(!1)},[R]);Wc(()=>{if(!U.current)return;U.current.checked!==ae&&xe(U.current.checked)},[U.current]);const ne=f.useCallback((me={},_e=null)=>{const We=Le=>{ee&&Le.preventDefault(),R(!0)};return{...me,ref:_e,"data-active":sn(K),"data-hover":sn(H),"data-checked":sn(ae),"data-focus":sn(ee),"data-focus-visible":sn(ee&&z),"data-indeterminate":sn(S),"data-disabled":sn(n),"data-invalid":sn(s),"data-readonly":sn(r),"aria-hidden":!0,onMouseDown:mt(me.onMouseDown,We),onMouseUp:mt(me.onMouseUp,()=>R(!1)),onMouseEnter:mt(me.onMouseEnter,()=>G(!0)),onMouseLeave:mt(me.onMouseLeave,()=>G(!1))}},[K,ae,n,ee,z,H,S,s,r]),ge=f.useCallback((me={},_e=null)=>({...O,...me,ref:Wn(_e,We=>{We&&J(We.tagName==="LABEL")}),onClick:mt(me.onClick,()=>{var We;V||((We=U.current)==null||We.click(),requestAnimationFrame(()=>{var Le;(Le=U.current)==null||Le.focus({preventScroll:!0})}))}),"data-disabled":sn(n),"data-checked":sn(ae),"data-invalid":sn(s)}),[O,n,ae,s,V]),ue=f.useCallback((me={},_e=null)=>({...me,ref:Wn(U,_e),type:"checkbox",name:w,value:C,id:i,tabIndex:_,onChange:mt(me.onChange,Z),onBlur:mt(me.onBlur,T,()=>B(!1)),onFocus:mt(me.onFocus,A,()=>B(!0)),onKeyDown:mt(me.onKeyDown,re),onKeyUp:mt(me.onKeyUp,pe),required:o,checked:ae,disabled:W,readOnly:r,"aria-label":k,"aria-labelledby":j,"aria-invalid":E?!!E:s,"aria-describedby":p,"aria-disabled":n,style:wv}),[w,C,i,Z,T,A,re,pe,o,ae,W,r,k,j,E,s,p,n,_]),Ce=f.useCallback((me={},_e=null)=>({...me,ref:_e,onMouseDown:mt(me.onMouseDown,iM),"data-disabled":sn(n),"data-checked":sn(ae),"data-invalid":sn(s)}),[ae,n,s]);return{state:{isInvalid:s,isFocused:ee,isChecked:ae,isActive:K,isHovered:H,isIndeterminate:S,isDisabled:n,isReadOnly:r,isRequired:o},getRootProps:ge,getCheckboxProps:ne,getInputProps:ue,getLabelProps:Ce,htmlProps:O}}function iM(e){e.preventDefault(),e.stopPropagation()}var lM={display:"inline-flex",alignItems:"center",justifyContent:"center",verticalAlign:"top",userSelect:"none",flexShrink:0},cM={cursor:"pointer",display:"inline-flex",alignItems:"center",verticalAlign:"top",position:"relative"},uM=Sa({from:{opacity:0,strokeDashoffset:16,transform:"scale(0.95)"},to:{opacity:1,strokeDashoffset:0,transform:"scale(1)"}}),dM=Sa({from:{opacity:0},to:{opacity:1}}),fM=Sa({from:{transform:"scaleX(0.65)"},to:{transform:"scaleX(1)"}}),D3=tt(function(t,n){const r=q9(),o={...r,...t},s=lo("Checkbox",o),i=xr(t),{spacing:u="0.5rem",className:d,children:p,iconColor:h,iconSize:g,icon:v=a.jsx(X9,{}),isChecked:b,isDisabled:S=r==null?void 0:r.isDisabled,onChange:w,inputProps:C,..._}=i;let k=b;r!=null&&r.value&&i.value&&(k=r.value.includes(i.value));let j=w;r!=null&&r.onChange&&i.value&&(j=Vp(r.onChange,w));const{state:E,getInputProps:I,getCheckboxProps:O,getLabelProps:M,getRootProps:T}=R3({..._,isDisabled:S,isChecked:k,onChange:j}),A=K9(E.isChecked),z=f.useMemo(()=>({animation:A?E.isIndeterminate?`${dM} 20ms linear, ${fM} 200ms linear`:`${uM} 200ms linear`:void 0,fontSize:g,color:h,...s.icon}),[h,g,A,E.isIndeterminate,s.icon]),$=f.cloneElement(v,{__css:z,isIndeterminate:E.isIndeterminate,isChecked:E.isChecked});return a.jsxs(He.label,{__css:{...cM,...s.container},className:Ot("chakra-checkbox",d),...T(),children:[a.jsx("input",{className:"chakra-checkbox__input",...I(C,n)}),a.jsx(He.span,{__css:{...lM,...s.control},className:"chakra-checkbox__control",...O(),children:$}),p&&a.jsx(He.span,{className:"chakra-checkbox__label",...M(),__css:{marginStart:u,...s.label},children:p})]})});D3.displayName="Checkbox";var[pM,T3]=cr({name:"EditableStylesContext",errorMessage:`useEditableStyles returned is 'undefined'. Seems you forgot to wrap the components in "" `}),[hM,A3]=cr({name:"EditableContext",errorMessage:"useEditableContext: context is undefined. Seems you forgot to wrap the editable components in ``"}),N3={fontSize:"inherit",fontWeight:"inherit",textAlign:"inherit",bg:"transparent"},$3=tt(function(t,n){const{getInputProps:r}=A3(),o=T3(),s=r(t,n),i=Ot("chakra-editable__input",t.className);return a.jsx(He.input,{...s,__css:{outline:0,...N3,...o.input},className:i})});$3.displayName="EditableInput";var z3=tt(function(t,n){const{getPreviewProps:r}=A3(),o=T3(),s=r(t,n),i=Ot("chakra-editable__preview",t.className);return a.jsx(He.span,{...s,__css:{cursor:"text",display:"inline-block",...N3,...o.preview},className:i})});z3.displayName="EditablePreview";function mM(e){return"current"in e}var L3=()=>typeof window<"u";function gM(){var e;const t=navigator.userAgentData;return(e=t==null?void 0:t.platform)!=null?e:navigator.platform}var vM=e=>L3()&&e.test(navigator.vendor),yM=e=>L3()&&e.test(gM()),bM=()=>yM(/mac|iphone|ipad|ipod/i),xM=()=>bM()&&vM(/apple/i);function B3(e){const{ref:t,elements:n,enabled:r}=e,o=()=>{var s,i;return(i=(s=t.current)==null?void 0:s.ownerDocument)!=null?i:document};ev(o,"pointerdown",s=>{if(!xM()||!r)return;const i=s.target,d=(n??[t]).some(p=>{const h=mM(p)?p.current:p;return(h==null?void 0:h.contains(i))||h===i});o().activeElement!==i&&d&&(s.preventDefault(),i.focus())})}function Nx(e,t){return e?e===t||e.contains(t):!1}function wM(e={}){const{onChange:t,onCancel:n,onSubmit:r,onBlur:o,value:s,isDisabled:i,defaultValue:u,startWithEditView:d,isPreviewFocusable:p=!0,submitOnBlur:h=!0,selectAllOnFocus:g=!0,placeholder:v,onEdit:b,finalFocusRef:S,...w}=e,C=Ua(b),_=!!(d&&!i),[k,j]=f.useState(_),[E,I]=mu({defaultValue:u||"",value:s,onChange:t}),[O,M]=f.useState(E),T=f.useRef(null),A=f.useRef(null),z=f.useRef(null),$=f.useRef(null),ee=f.useRef(null);B3({ref:T,enabled:k,elements:[$,ee]});const B=!k&&!i;Wc(()=>{var ne,ge;k&&((ne=T.current)==null||ne.focus(),g&&((ge=T.current)==null||ge.select()))},[]),Ni(()=>{var ne,ge,ue,Ce;if(!k){S?(ne=S.current)==null||ne.focus():(ge=z.current)==null||ge.focus();return}(ue=T.current)==null||ue.focus(),g&&((Ce=T.current)==null||Ce.select()),C==null||C()},[k,C,g]);const H=f.useCallback(()=>{B&&j(!0)},[B]),G=f.useCallback(()=>{M(E)},[E]),K=f.useCallback(()=>{j(!1),I(O),n==null||n(O),o==null||o(O)},[n,o,I,O]),R=f.useCallback(()=>{j(!1),M(E),r==null||r(E),o==null||o(O)},[E,r,o,O]);f.useEffect(()=>{if(k)return;const ne=T.current;(ne==null?void 0:ne.ownerDocument.activeElement)===ne&&(ne==null||ne.blur())},[k]);const U=f.useCallback(ne=>{I(ne.currentTarget.value)},[I]),V=f.useCallback(ne=>{const ge=ne.key,Ce={Escape:K,Enter:Re=>{!Re.shiftKey&&!Re.metaKey&&R()}}[ge];Ce&&(ne.preventDefault(),Ce(ne))},[K,R]),J=f.useCallback(ne=>{const ge=ne.key,Ce={Escape:K}[ge];Ce&&(ne.preventDefault(),Ce(ne))},[K]),ie=E.length===0,xe=f.useCallback(ne=>{var ge;if(!k)return;const ue=ne.currentTarget.ownerDocument,Ce=(ge=ne.relatedTarget)!=null?ge:ue.activeElement,Re=Nx($.current,Ce),me=Nx(ee.current,Ce);!Re&&!me&&(h?R():K())},[h,R,K,k]),he=f.useCallback((ne={},ge=null)=>{const ue=B&&p?0:void 0;return{...ne,ref:Wn(ge,A),children:ie?v:E,hidden:k,"aria-disabled":Sl(i),tabIndex:ue,onFocus:mt(ne.onFocus,H,G)}},[i,k,B,p,ie,H,G,v,E]),ae=f.useCallback((ne={},ge=null)=>({...ne,hidden:!k,placeholder:v,ref:Wn(ge,T),disabled:i,"aria-disabled":Sl(i),value:E,onBlur:mt(ne.onBlur,xe),onChange:mt(ne.onChange,U),onKeyDown:mt(ne.onKeyDown,V),onFocus:mt(ne.onFocus,G)}),[i,k,xe,U,V,G,v,E]),Z=f.useCallback((ne={},ge=null)=>({...ne,hidden:!k,placeholder:v,ref:Wn(ge,T),disabled:i,"aria-disabled":Sl(i),value:E,onBlur:mt(ne.onBlur,xe),onChange:mt(ne.onChange,U),onKeyDown:mt(ne.onKeyDown,J),onFocus:mt(ne.onFocus,G)}),[i,k,xe,U,J,G,v,E]),W=f.useCallback((ne={},ge=null)=>({"aria-label":"Edit",...ne,type:"button",onClick:mt(ne.onClick,H),ref:Wn(ge,z),disabled:i}),[H,i]),re=f.useCallback((ne={},ge=null)=>({...ne,"aria-label":"Submit",ref:Wn(ee,ge),type:"button",onClick:mt(ne.onClick,R),disabled:i}),[R,i]),pe=f.useCallback((ne={},ge=null)=>({"aria-label":"Cancel",id:"cancel",...ne,ref:Wn($,ge),type:"button",onClick:mt(ne.onClick,K),disabled:i}),[K,i]);return{isEditing:k,isDisabled:i,isValueEmpty:ie,value:E,onEdit:H,onCancel:K,onSubmit:R,getPreviewProps:he,getInputProps:ae,getTextareaProps:Z,getEditButtonProps:W,getSubmitButtonProps:re,getCancelButtonProps:pe,htmlProps:w}}var F3=tt(function(t,n){const r=lo("Editable",t),o=xr(t),{htmlProps:s,...i}=wM(o),{isEditing:u,onSubmit:d,onCancel:p,onEdit:h}=i,g=Ot("chakra-editable",t.className),v=tv(t.children,{isEditing:u,onSubmit:d,onCancel:p,onEdit:h});return a.jsx(hM,{value:i,children:a.jsx(pM,{value:r,children:a.jsx(He.div,{ref:n,...s,className:g,children:v})})})});F3.displayName="Editable";var H3={exports:{}},SM="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED",CM=SM,_M=CM;function W3(){}function V3(){}V3.resetWarningCache=W3;var kM=function(){function e(r,o,s,i,u,d){if(d!==_M){var p=new Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw p.name="Invariant Violation",p}}e.isRequired=e;function t(){return e}var n={array:e,bigint:e,bool:e,func:e,number:e,object:e,string:e,symbol:e,any:e,arrayOf:t,element:e,elementType:e,instanceOf:t,node:e,objectOf:t,oneOf:t,oneOfType:t,shape:t,exact:t,checkPropTypes:V3,resetWarningCache:W3};return n.PropTypes=n,n};H3.exports=kM();var PM=H3.exports;const Tn=vu(PM);var t0="data-focus-lock",U3="data-focus-lock-disabled",jM="data-no-focus-lock",IM="data-autofocus-inside",EM="data-no-autofocus";function OM(e,t){return typeof e=="function"?e(t):e&&(e.current=t),e}function MM(e,t){var n=f.useState(function(){return{value:e,callback:t,facade:{get current(){return n.value},set current(r){var o=n.value;o!==r&&(n.value=r,n.callback(r,o))}}}})[0];return n.callback=t,n.facade}function G3(e,t){return MM(t||null,function(n){return e.forEach(function(r){return OM(r,n)})})}var Qm={width:"1px",height:"0px",padding:0,overflow:"hidden",position:"fixed",top:"1px",left:"1px"},Ls=function(){return Ls=Object.assign||function(t){for(var n,r=1,o=arguments.length;r0&&s[s.length-1])&&(p[0]===6||p[0]===2)){n=0;continue}if(p[0]===3&&(!s||p[1]>s[0]&&p[1]0)&&!(o=r.next()).done;)s.push(o.value)}catch(u){i={error:u}}finally{try{o&&!o.done&&(n=r.return)&&n.call(r)}finally{if(i)throw i.error}}return s}function n0(e,t,n){if(n||arguments.length===2)for(var r=0,o=t.length,s;r=0}).sort(UM)},GM=["button:enabled","select:enabled","textarea:enabled","input:enabled","a[href]","area[href]","summary","iframe","object","embed","audio[controls]","video[controls]","[tabindex]","[contenteditable]","[autofocus]"],Pv=GM.join(","),qM="".concat(Pv,", [data-focus-guard]"),u6=function(e,t){return Ks((e.shadowRoot||e).children).reduce(function(n,r){return n.concat(r.matches(t?qM:Pv)?[r]:[],u6(r))},[])},KM=function(e,t){var n;return e instanceof HTMLIFrameElement&&(!((n=e.contentDocument)===null||n===void 0)&&n.body)?Zp([e.contentDocument.body],t):[e]},Zp=function(e,t){return e.reduce(function(n,r){var o,s=u6(r,t),i=(o=[]).concat.apply(o,s.map(function(u){return KM(u,t)}));return n.concat(i,r.parentNode?Ks(r.parentNode.querySelectorAll(Pv)).filter(function(u){return u===r}):[])},[])},YM=function(e){var t=e.querySelectorAll("[".concat(IM,"]"));return Ks(t).map(function(n){return Zp([n])}).reduce(function(n,r){return n.concat(r)},[])},jv=function(e,t){return Ks(e).filter(function(n){return o6(t,n)}).filter(function(n){return HM(n)})},zx=function(e,t){return t===void 0&&(t=new Map),Ks(e).filter(function(n){return s6(t,n)})},o0=function(e,t,n){return c6(jv(Zp(e,n),t),!0,n)},Lx=function(e,t){return c6(jv(Zp(e),t),!1)},QM=function(e,t){return jv(YM(e),t)},Pl=function(e,t){return e.shadowRoot?Pl(e.shadowRoot,t):Object.getPrototypeOf(e).contains!==void 0&&Object.getPrototypeOf(e).contains.call(e,t)?!0:Ks(e.children).some(function(n){var r;if(n instanceof HTMLIFrameElement){var o=(r=n.contentDocument)===null||r===void 0?void 0:r.body;return o?Pl(o,t):!1}return Pl(n,t)})},XM=function(e){for(var t=new Set,n=e.length,r=0;r0&&t.add(o),(s&Node.DOCUMENT_POSITION_CONTAINS)>0&&t.add(r)}return e.filter(function(i,u){return!t.has(u)})},d6=function(e){return e.parentNode?d6(e.parentNode):e},Iv=function(e){var t=Af(e);return t.filter(Boolean).reduce(function(n,r){var o=r.getAttribute(t0);return n.push.apply(n,o?XM(Ks(d6(r).querySelectorAll("[".concat(t0,'="').concat(o,'"]:not([').concat(U3,'="disabled"])')))):[r]),n},[])},JM=function(e){try{return e()}catch{return}},tu=function(e){if(e===void 0&&(e=document),!(!e||!e.activeElement)){var t=e.activeElement;return t.shadowRoot?tu(t.shadowRoot):t instanceof HTMLIFrameElement&&JM(function(){return t.contentWindow.document})?tu(t.contentWindow.document):t}},ZM=function(e,t){return e===t},eR=function(e,t){return!!Ks(e.querySelectorAll("iframe")).some(function(n){return ZM(n,t)})},f6=function(e,t){return t===void 0&&(t=tu(t6(e).ownerDocument)),!t||t.dataset&&t.dataset.focusGuard?!1:Iv(e).some(function(n){return Pl(n,t)||eR(n,t)})},tR=function(e){e===void 0&&(e=document);var t=tu(e);return t?Ks(e.querySelectorAll("[".concat(jM,"]"))).some(function(n){return Pl(n,t)}):!1},nR=function(e,t){return t.filter(l6).filter(function(n){return n.name===e.name}).filter(function(n){return n.checked})[0]||e},Ev=function(e,t){return l6(e)&&e.name?nR(e,t):e},rR=function(e){var t=new Set;return e.forEach(function(n){return t.add(Ev(n,e))}),e.filter(function(n){return t.has(n)})},Bx=function(e){return e[0]&&e.length>1?Ev(e[0],e):e[0]},Fx=function(e,t){return e.length>1?e.indexOf(Ev(e[t],e)):t},p6="NEW_FOCUS",oR=function(e,t,n,r){var o=e.length,s=e[0],i=e[o-1],u=kv(n);if(!(n&&e.indexOf(n)>=0)){var d=n!==void 0?t.indexOf(n):-1,p=r?t.indexOf(r):d,h=r?e.indexOf(r):-1,g=d-p,v=t.indexOf(s),b=t.indexOf(i),S=rR(t),w=n!==void 0?S.indexOf(n):-1,C=w-(r?S.indexOf(r):d),_=Fx(e,0),k=Fx(e,o-1);if(d===-1||h===-1)return p6;if(!g&&h>=0)return h;if(d<=v&&u&&Math.abs(g)>1)return k;if(d>=b&&u&&Math.abs(g)>1)return _;if(g&&Math.abs(C)>1)return h;if(d<=v)return k;if(d>b)return _;if(g)return Math.abs(g)>1?h:(o+h+g)%o}},sR=function(e){return function(t){var n,r=(n=a6(t))===null||n===void 0?void 0:n.autofocus;return t.autofocus||r!==void 0&&r!=="false"||e.indexOf(t)>=0}},aR=function(e,t,n){var r=e.map(function(s){var i=s.node;return i}),o=zx(r.filter(sR(n)));return o&&o.length?Bx(o):Bx(zx(t))},s0=function(e,t){return t===void 0&&(t=[]),t.push(e),e.parentNode&&s0(e.parentNode.host||e.parentNode,t),t},Xm=function(e,t){for(var n=s0(e),r=s0(t),o=0;o=0)return s}return!1},h6=function(e,t,n){var r=Af(e),o=Af(t),s=r[0],i=!1;return o.filter(Boolean).forEach(function(u){i=Xm(i||u,u)||i,n.filter(Boolean).forEach(function(d){var p=Xm(s,d);p&&(!i||Pl(p,i)?i=p:i=Xm(p,i))})}),i},iR=function(e,t){return e.reduce(function(n,r){return n.concat(QM(r,t))},[])},lR=function(e,t){var n=new Map;return t.forEach(function(r){return n.set(r.node,r)}),e.map(function(r){return n.get(r)}).filter(VM)},cR=function(e,t){var n=tu(Af(e).length>0?document:t6(e).ownerDocument),r=Iv(e).filter(Nf),o=h6(n||e,e,r),s=new Map,i=Lx(r,s),u=o0(r,s).filter(function(b){var S=b.node;return Nf(S)});if(!(!u[0]&&(u=i,!u[0]))){var d=Lx([o],s).map(function(b){var S=b.node;return S}),p=lR(d,u),h=p.map(function(b){var S=b.node;return S}),g=oR(h,d,n,t);if(g===p6){var v=aR(i,h,iR(r,s));if(v)return{node:v};console.warn("focus-lock: cannot find any node to move focus into");return}return g===void 0?g:p[g]}},uR=function(e){var t=Iv(e).filter(Nf),n=h6(e,e,t),r=new Map,o=o0([n],r,!0),s=o0(t,r).filter(function(i){var u=i.node;return Nf(u)}).map(function(i){var u=i.node;return u});return o.map(function(i){var u=i.node,d=i.index;return{node:u,index:d,lockItem:s.indexOf(u)>=0,guard:kv(u)}})},dR=function(e,t){"focus"in e&&e.focus(t),"contentWindow"in e&&e.contentWindow&&e.contentWindow.focus()},Jm=0,Zm=!1,m6=function(e,t,n){n===void 0&&(n={});var r=cR(e,t);if(!Zm&&r){if(Jm>2){console.error("FocusLock: focus-fighting detected. Only one focus management system could be active. See https://github.com/theKashey/focus-lock/#focus-fighting"),Zm=!0,setTimeout(function(){Zm=!1},1);return}Jm++,dR(r.node,n.focusOptions),Jm--}};function Ov(e){setTimeout(e,1)}var fR=function(){return document&&document.activeElement===document.body},pR=function(){return fR()||tR()},jl=null,vl=null,Il=null,nu=!1,hR=function(){return!0},mR=function(t){return(jl.whiteList||hR)(t)},gR=function(t,n){Il={observerNode:t,portaledElement:n}},vR=function(t){return Il&&Il.portaledElement===t};function Hx(e,t,n,r){var o=null,s=e;do{var i=r[s];if(i.guard)i.node.dataset.focusAutoGuard&&(o=i);else if(i.lockItem){if(s!==e)return;o=null}else break}while((s+=n)!==t);o&&(o.node.tabIndex=0)}var yR=function(t){return t&&"current"in t?t.current:t},bR=function(t){return t?!!nu:nu==="meanwhile"},xR=function e(t,n,r){return n&&(n.host===t&&(!n.activeElement||r.contains(n.activeElement))||n.parentNode&&e(t,n.parentNode,r))},wR=function(t,n){return n.some(function(r){return xR(t,r,r)})},$f=function(){var t=!1;if(jl){var n=jl,r=n.observed,o=n.persistentFocus,s=n.autoFocus,i=n.shards,u=n.crossFrame,d=n.focusOptions,p=r||Il&&Il.portaledElement,h=document&&document.activeElement;if(p){var g=[p].concat(i.map(yR).filter(Boolean));if((!h||mR(h))&&(o||bR(u)||!pR()||!vl&&s)&&(p&&!(f6(g)||h&&wR(h,g)||vR(h))&&(document&&!vl&&h&&!s?(h.blur&&h.blur(),document.body.focus()):(t=m6(g,vl,{focusOptions:d}),Il={})),nu=!1,vl=document&&document.activeElement),document){var v=document&&document.activeElement,b=uR(g),S=b.map(function(w){var C=w.node;return C}).indexOf(v);S>-1&&(b.filter(function(w){var C=w.guard,_=w.node;return C&&_.dataset.focusAutoGuard}).forEach(function(w){var C=w.node;return C.removeAttribute("tabIndex")}),Hx(S,b.length,1,b),Hx(S,-1,-1,b))}}}return t},g6=function(t){$f()&&t&&(t.stopPropagation(),t.preventDefault())},Mv=function(){return Ov($f)},SR=function(t){var n=t.target,r=t.currentTarget;r.contains(n)||gR(r,n)},CR=function(){return null},v6=function(){nu="just",Ov(function(){nu="meanwhile"})},_R=function(){document.addEventListener("focusin",g6),document.addEventListener("focusout",Mv),window.addEventListener("blur",v6)},kR=function(){document.removeEventListener("focusin",g6),document.removeEventListener("focusout",Mv),window.removeEventListener("blur",v6)};function PR(e){return e.filter(function(t){var n=t.disabled;return!n})}function jR(e){var t=e.slice(-1)[0];t&&!jl&&_R();var n=jl,r=n&&t&&t.id===n.id;jl=t,n&&!r&&(n.onDeactivation(),e.filter(function(o){var s=o.id;return s===n.id}).length||n.returnFocus(!t)),t?(vl=null,(!r||n.observed!==t.observed)&&t.onActivation(),$f(),Ov($f)):(kR(),vl=null)}J3.assignSyncMedium(SR);Z3.assignMedium(Mv);DM.assignMedium(function(e){return e({moveFocusInside:m6,focusInside:f6})});const IR=$M(PR,jR)(CR);var y6=f.forwardRef(function(t,n){return f.createElement(e6,Qn({sideCar:IR,ref:n},t))}),b6=e6.propTypes||{};b6.sideCar;GO(b6,["sideCar"]);y6.propTypes={};const Wx=y6;var x6=e=>e.hasAttribute("tabindex"),ER=e=>x6(e)&&e.tabIndex===-1;function OR(e){return!!e.getAttribute("disabled")||!!e.getAttribute("aria-disabled")}function w6(e){return e.parentElement&&w6(e.parentElement)?!0:e.hidden}function MR(e){const t=e.getAttribute("contenteditable");return t!=="false"&&t!=null}function S6(e){if(!d4(e)||w6(e)||OR(e))return!1;const{localName:t}=e;if(["input","select","textarea","button"].indexOf(t)>=0)return!0;const r={a:()=>e.hasAttribute("href"),audio:()=>e.hasAttribute("controls"),video:()=>e.hasAttribute("controls")};return t in r?r[t]():MR(e)?!0:x6(e)}function RR(e){return e?d4(e)&&S6(e)&&!ER(e):!1}var DR=["input:not(:disabled):not([disabled])","select:not(:disabled):not([disabled])","textarea:not(:disabled):not([disabled])","embed","iframe","object","a[href]","area[href]","button:not(:disabled):not([disabled])","[tabindex]","audio[controls]","video[controls]","*[tabindex]:not([aria-disabled])","*[contenteditable]"],TR=DR.join(),AR=e=>e.offsetWidth>0&&e.offsetHeight>0;function C6(e){const t=Array.from(e.querySelectorAll(TR));return t.unshift(e),t.filter(n=>S6(n)&&AR(n))}var Vx,NR=(Vx=Wx.default)!=null?Vx:Wx,_6=e=>{const{initialFocusRef:t,finalFocusRef:n,contentRef:r,restoreFocus:o,children:s,isDisabled:i,autoFocus:u,persistentFocus:d,lockFocusAcrossFrames:p}=e,h=f.useCallback(()=>{t!=null&&t.current?t.current.focus():r!=null&&r.current&&C6(r.current).length===0&&requestAnimationFrame(()=>{var S;(S=r.current)==null||S.focus()})},[t,r]),g=f.useCallback(()=>{var b;(b=n==null?void 0:n.current)==null||b.focus()},[n]),v=o&&!n;return a.jsx(NR,{crossFrame:p,persistentFocus:d,autoFocus:u,disabled:i,onActivation:h,onDeactivation:g,returnFocus:v,children:s})};_6.displayName="FocusLock";function $R(e,t,n,r){const o=f4(t);return f.useEffect(()=>{var s;const i=(s=zb(n))!=null?s:document;if(t)return i.addEventListener(e,o,r),()=>{i.removeEventListener(e,o,r)}},[e,n,r,o,t]),()=>{var s;((s=zb(n))!=null?s:document).removeEventListener(e,o,r)}}function zR(e){const{ref:t,handler:n,enabled:r=!0}=e,o=f4(n),i=f.useRef({isPointerDown:!1,ignoreEmulatedMouseEvents:!1}).current;f.useEffect(()=>{if(!r)return;const u=g=>{eg(g,t)&&(i.isPointerDown=!0)},d=g=>{if(i.ignoreEmulatedMouseEvents){i.ignoreEmulatedMouseEvents=!1;return}i.isPointerDown&&n&&eg(g,t)&&(i.isPointerDown=!1,o(g))},p=g=>{i.ignoreEmulatedMouseEvents=!0,n&&i.isPointerDown&&eg(g,t)&&(i.isPointerDown=!1,o(g))},h=p4(t.current);return h.addEventListener("mousedown",u,!0),h.addEventListener("mouseup",d,!0),h.addEventListener("touchstart",u,!0),h.addEventListener("touchend",p,!0),()=>{h.removeEventListener("mousedown",u,!0),h.removeEventListener("mouseup",d,!0),h.removeEventListener("touchstart",u,!0),h.removeEventListener("touchend",p,!0)}},[n,t,o,i,r])}function eg(e,t){var n;const r=e.target;return r&&!p4(r).contains(r)?!1:!((n=t.current)!=null&&n.contains(r))}var[LR,BR]=cr({name:"InputGroupStylesContext",errorMessage:`useInputGroupStyles returned is 'undefined'. Seems you forgot to wrap the components in "" `}),k6=tt(function(t,n){const r=lo("Input",t),{children:o,className:s,...i}=xr(t),u=Ot("chakra-input__group",s),d={},p=Up(o),h=r.field;p.forEach(v=>{var b,S;r&&(h&&v.type.id==="InputLeftElement"&&(d.paddingStart=(b=h.height)!=null?b:h.h),h&&v.type.id==="InputRightElement"&&(d.paddingEnd=(S=h.height)!=null?S:h.h),v.type.id==="InputRightAddon"&&(d.borderEndRadius=0),v.type.id==="InputLeftAddon"&&(d.borderStartRadius=0))});const g=p.map(v=>{var b,S;const w=vv({size:((b=v.props)==null?void 0:b.size)||t.size,variant:((S=v.props)==null?void 0:S.variant)||t.variant});return v.type.id!=="Input"?f.cloneElement(v,w):f.cloneElement(v,Object.assign(w,d,v.props))});return a.jsx(He.div,{className:u,ref:n,__css:{width:"100%",display:"flex",position:"relative",isolation:"isolate"},"data-group":!0,...i,children:a.jsx(LR,{value:r,children:g})})});k6.displayName="InputGroup";var FR=He("div",{baseStyle:{display:"flex",alignItems:"center",justifyContent:"center",position:"absolute",top:"0",zIndex:2}}),eh=tt(function(t,n){var r,o;const{placement:s="left",...i}=t,u=BR(),d=u.field,h={[s==="left"?"insetStart":"insetEnd"]:"0",width:(r=d==null?void 0:d.height)!=null?r:d==null?void 0:d.h,height:(o=d==null?void 0:d.height)!=null?o:d==null?void 0:d.h,fontSize:d==null?void 0:d.fontSize,...u.element};return a.jsx(FR,{ref:n,__css:h,...i})});eh.id="InputElement";eh.displayName="InputElement";var P6=tt(function(t,n){const{className:r,...o}=t,s=Ot("chakra-input__left-element",r);return a.jsx(eh,{ref:n,placement:"left",className:s,...o})});P6.id="InputLeftElement";P6.displayName="InputLeftElement";var Rv=tt(function(t,n){const{className:r,...o}=t,s=Ot("chakra-input__right-element",r);return a.jsx(eh,{ref:n,placement:"right",className:s,...o})});Rv.id="InputRightElement";Rv.displayName="InputRightElement";var ku=tt(function(t,n){const{htmlSize:r,...o}=t,s=lo("Input",o),i=xr(o),u=nv(i),d=Ot("chakra-input",t.className);return a.jsx(He.input,{size:r,...u,__css:s.field,ref:n,className:d})});ku.displayName="Input";ku.id="Input";var Ka=tt(function(t,n){const r=Kl("Link",t),{className:o,isExternal:s,...i}=xr(t);return a.jsx(He.a,{target:s?"_blank":void 0,rel:s?"noopener":void 0,ref:n,className:Ot("chakra-link",o),...i,__css:r})});Ka.displayName="Link";var[HR,j6]=cr({name:"ListStylesContext",errorMessage:`useListStyles returned is 'undefined'. Seems you forgot to wrap the components in "" `}),Dv=tt(function(t,n){const r=lo("List",t),{children:o,styleType:s="none",stylePosition:i,spacing:u,...d}=xr(t),p=Up(o),g=u?{["& > *:not(style) ~ *:not(style)"]:{mt:u}}:{};return a.jsx(HR,{value:r,children:a.jsx(He.ul,{ref:n,listStyleType:s,listStylePosition:i,role:"list",__css:{...r.container,...g},...d,children:p})})});Dv.displayName="List";var WR=tt((e,t)=>{const{as:n,...r}=e;return a.jsx(Dv,{ref:t,as:"ol",styleType:"decimal",marginStart:"1em",...r})});WR.displayName="OrderedList";var th=tt(function(t,n){const{as:r,...o}=t;return a.jsx(Dv,{ref:n,as:"ul",styleType:"initial",marginStart:"1em",...o})});th.displayName="UnorderedList";var Io=tt(function(t,n){const r=j6();return a.jsx(He.li,{ref:n,...t,__css:r.item})});Io.displayName="ListItem";var VR=tt(function(t,n){const r=j6();return a.jsx(mo,{ref:n,role:"presentation",...t,__css:r.icon})});VR.displayName="ListIcon";var Ei=tt(function(t,n){const{templateAreas:r,gap:o,rowGap:s,columnGap:i,column:u,row:d,autoFlow:p,autoRows:h,templateRows:g,autoColumns:v,templateColumns:b,...S}=t,w={display:"grid",gridTemplateAreas:r,gridGap:o,gridRowGap:s,gridColumnGap:i,gridAutoColumns:v,gridColumn:u,gridRow:d,gridAutoFlow:p,gridAutoRows:h,gridTemplateRows:g,gridTemplateColumns:b};return a.jsx(He.div,{ref:n,__css:w,...S})});Ei.displayName="Grid";var $i=He("div",{baseStyle:{flex:1,justifySelf:"stretch",alignSelf:"stretch"}});$i.displayName="Spacer";var nt=tt(function(t,n){const r=Kl("Text",t),{className:o,align:s,decoration:i,casing:u,...d}=xr(t),p=vv({textAlign:t.align,textDecoration:t.decoration,textTransform:t.casing});return a.jsx(He.p,{ref:n,className:Ot("chakra-text",t.className),...p,...d,__css:r})});nt.displayName="Text";var I6=tt((e,t)=>a.jsx(xE,{align:"center",...e,direction:"column",ref:t}));I6.displayName="VStack";function Ux(e){return wE(e,t=>t==="auto"?"auto":`span ${t}/span ${t}`)}var hf=tt(function(t,n){const{area:r,colSpan:o,colStart:s,colEnd:i,rowEnd:u,rowSpan:d,rowStart:p,...h}=t,g=vv({gridArea:r,gridColumn:Ux(o),gridRow:Ux(d),gridColumnStart:s,gridColumnEnd:i,gridRowStart:p,gridRowEnd:u});return a.jsx(He.div,{ref:n,__css:g,...h})});hf.displayName="GridItem";var Xa=tt(function(t,n){const r=Kl("Badge",t),{className:o,...s}=xr(t);return a.jsx(He.span,{ref:n,className:Ot("chakra-badge",t.className),...s,__css:{display:"inline-block",whiteSpace:"nowrap",verticalAlign:"middle",...r}})});Xa.displayName="Badge";var ni=tt(function(t,n){const{borderLeftWidth:r,borderBottomWidth:o,borderTopWidth:s,borderRightWidth:i,borderWidth:u,borderStyle:d,borderColor:p,...h}=Kl("Divider",t),{className:g,orientation:v="horizontal",__css:b,...S}=xr(t),w={vertical:{borderLeftWidth:r||i||u||"1px",height:"100%"},horizontal:{borderBottomWidth:o||s||u||"1px",width:"100%"}};return a.jsx(He.hr,{ref:n,"aria-orientation":v,...S,__css:{...h,border:"0",borderColor:p,borderStyle:d,...w[v],...b},className:Ot("chakra-divider",g)})});ni.displayName="Divider";function UR(e){const{key:t}=e;return t.length===1||t.length>1&&/[^a-zA-Z0-9]/.test(t)}function GR(e={}){const{timeout:t=300,preventDefault:n=()=>!0}=e,[r,o]=f.useState([]),s=f.useRef(),i=()=>{s.current&&(clearTimeout(s.current),s.current=null)},u=()=>{i(),s.current=setTimeout(()=>{o([]),s.current=null},t)};f.useEffect(()=>i,[]);function d(p){return h=>{if(h.key==="Backspace"){const g=[...r];g.pop(),o(g);return}if(UR(h)){const g=r.concat(h.key);n(h)&&(h.preventDefault(),h.stopPropagation()),o(g),p(g.join("")),u()}}}return d}function qR(e,t,n,r){if(t==null)return r;if(!r)return e.find(i=>n(i).toLowerCase().startsWith(t.toLowerCase()));const o=e.filter(s=>n(s).toLowerCase().startsWith(t.toLowerCase()));if(o.length>0){let s;return o.includes(r)?(s=o.indexOf(r)+1,s===o.length&&(s=0),o[s]):(s=e.indexOf(o[0]),e[s])}return r}function KR(){const e=f.useRef(new Map),t=e.current,n=f.useCallback((o,s,i,u)=>{e.current.set(i,{type:s,el:o,options:u}),o.addEventListener(s,i,u)},[]),r=f.useCallback((o,s,i,u)=>{o.removeEventListener(s,i,u),e.current.delete(i)},[]);return f.useEffect(()=>()=>{t.forEach((o,s)=>{r(o.el,o.type,s,o.options)})},[r,t]),{add:n,remove:r}}function tg(e){const t=e.target,{tagName:n,isContentEditable:r}=t;return n!=="INPUT"&&n!=="TEXTAREA"&&r!==!0}function E6(e={}){const{ref:t,isDisabled:n,isFocusable:r,clickOnEnter:o=!0,clickOnSpace:s=!0,onMouseDown:i,onMouseUp:u,onClick:d,onKeyDown:p,onKeyUp:h,tabIndex:g,onMouseOver:v,onMouseLeave:b,...S}=e,[w,C]=f.useState(!0),[_,k]=f.useState(!1),j=KR(),E=R=>{R&&R.tagName!=="BUTTON"&&C(!1)},I=w?g:g||0,O=n&&!r,M=f.useCallback(R=>{if(n){R.stopPropagation(),R.preventDefault();return}R.currentTarget.focus(),d==null||d(R)},[n,d]),T=f.useCallback(R=>{_&&tg(R)&&(R.preventDefault(),R.stopPropagation(),k(!1),j.remove(document,"keyup",T,!1))},[_,j]),A=f.useCallback(R=>{if(p==null||p(R),n||R.defaultPrevented||R.metaKey||!tg(R.nativeEvent)||w)return;const U=o&&R.key==="Enter";s&&R.key===" "&&(R.preventDefault(),k(!0)),U&&(R.preventDefault(),R.currentTarget.click()),j.add(document,"keyup",T,!1)},[n,w,p,o,s,j,T]),z=f.useCallback(R=>{if(h==null||h(R),n||R.defaultPrevented||R.metaKey||!tg(R.nativeEvent)||w)return;s&&R.key===" "&&(R.preventDefault(),k(!1),R.currentTarget.click())},[s,w,n,h]),$=f.useCallback(R=>{R.button===0&&(k(!1),j.remove(document,"mouseup",$,!1))},[j]),ee=f.useCallback(R=>{if(R.button!==0)return;if(n){R.stopPropagation(),R.preventDefault();return}w||k(!0),R.currentTarget.focus({preventScroll:!0}),j.add(document,"mouseup",$,!1),i==null||i(R)},[n,w,i,j,$]),B=f.useCallback(R=>{R.button===0&&(w||k(!1),u==null||u(R))},[u,w]),H=f.useCallback(R=>{if(n){R.preventDefault();return}v==null||v(R)},[n,v]),G=f.useCallback(R=>{_&&(R.preventDefault(),k(!1)),b==null||b(R)},[_,b]),K=Wn(t,E);return w?{...S,ref:K,type:"button","aria-disabled":O?void 0:n,disabled:O,onClick:M,onMouseDown:i,onMouseUp:u,onKeyUp:h,onKeyDown:p,onMouseOver:v,onMouseLeave:b}:{...S,ref:K,role:"button","data-active":sn(_),"aria-disabled":n?"true":void 0,tabIndex:O?void 0:I,onClick:M,onMouseDown:ee,onMouseUp:B,onKeyUp:z,onKeyDown:A,onMouseOver:H,onMouseLeave:G}}function YR(e){const t=e.current;if(!t)return!1;const n=SE(t);return!n||t.contains(n)?!1:!!RR(n)}function O6(e,t){const{shouldFocus:n,visible:r,focusRef:o}=t,s=n&&!r;Ni(()=>{if(!s||YR(e))return;const i=(o==null?void 0:o.current)||e.current;let u;if(i)return u=requestAnimationFrame(()=>{i.focus({preventScroll:!0})}),()=>{cancelAnimationFrame(u)}},[s,e,o])}var QR={preventScroll:!0,shouldFocus:!1};function XR(e,t=QR){const{focusRef:n,preventScroll:r,shouldFocus:o,visible:s}=t,i=JR(e)?e.current:e,u=o&&s,d=f.useRef(u),p=f.useRef(s);Wc(()=>{!p.current&&s&&(d.current=u),p.current=s},[s,u]);const h=f.useCallback(()=>{if(!(!s||!i||!d.current)&&(d.current=!1,!i.contains(document.activeElement)))if(n!=null&&n.current)requestAnimationFrame(()=>{var g;(g=n.current)==null||g.focus({preventScroll:r})});else{const g=C6(i);g.length>0&&requestAnimationFrame(()=>{g[0].focus({preventScroll:r})})}},[s,r,i,n]);Ni(()=>{h()},[h]),ev(i,"transitionend",h)}function JR(e){return"current"in e}function ZR(e){const{ref:t,handler:n,enabled:r=!0}=e,o=Ua(n),i=f.useRef({isPointerDown:!1,ignoreEmulatedMouseEvents:!1}).current;f.useEffect(()=>{if(!r)return;const u=g=>{ng(g,t)&&(i.isPointerDown=!0)},d=g=>{if(i.ignoreEmulatedMouseEvents){i.ignoreEmulatedMouseEvents=!1;return}i.isPointerDown&&n&&ng(g,t)&&(i.isPointerDown=!1,o(g))},p=g=>{i.ignoreEmulatedMouseEvents=!0,n&&i.isPointerDown&&ng(g,t)&&(i.isPointerDown=!1,o(g))},h=M6(t.current);return h.addEventListener("mousedown",u,!0),h.addEventListener("mouseup",d,!0),h.addEventListener("touchstart",u,!0),h.addEventListener("touchend",p,!0),()=>{h.removeEventListener("mousedown",u,!0),h.removeEventListener("mouseup",d,!0),h.removeEventListener("touchstart",u,!0),h.removeEventListener("touchend",p,!0)}},[n,t,o,i,r])}function ng(e,t){var n;const r=e.target;return r&&!M6(r).contains(r)?!1:!((n=t.current)!=null&&n.contains(r))}function M6(e){var t;return(t=e==null?void 0:e.ownerDocument)!=null?t:document}function R6(e){const{isOpen:t,ref:n}=e,[r,o]=f.useState(t),[s,i]=f.useState(!1);return f.useEffect(()=>{s||(o(t),i(!0))},[t,s,r]),ev(()=>n.current,"animationend",()=>{o(t)}),{present:!(t?!1:!r),onComplete(){var d;const p=CE(n.current),h=new p.CustomEvent("animationend",{bubbles:!0});(d=n.current)==null||d.dispatchEvent(h)}}}function Tv(e){const{wasSelected:t,enabled:n,isSelected:r,mode:o="unmount"}=e;return!!(!n||r||o==="keepMounted"&&t)}var[eD,tD,nD,rD]=yv(),[oD,Pu]=cr({strict:!1,name:"MenuContext"});function sD(e,...t){const n=f.useId(),r=e||n;return f.useMemo(()=>t.map(o=>`${o}-${r}`),[r,t])}function D6(e){var t;return(t=e==null?void 0:e.ownerDocument)!=null?t:document}function Gx(e){return D6(e).activeElement===e}function aD(e={}){const{id:t,closeOnSelect:n=!0,closeOnBlur:r=!0,initialFocusRef:o,autoSelect:s=!0,isLazy:i,isOpen:u,defaultIsOpen:d,onClose:p,onOpen:h,placement:g="bottom-start",lazyBehavior:v="unmount",direction:b,computePositionOnMount:S=!1,...w}=e,C=f.useRef(null),_=f.useRef(null),k=nD(),j=f.useCallback(()=>{requestAnimationFrame(()=>{var he;(he=C.current)==null||he.focus({preventScroll:!1})})},[]),E=f.useCallback(()=>{const he=setTimeout(()=>{var ae;if(o)(ae=o.current)==null||ae.focus();else{const Z=k.firstEnabled();Z&&B(Z.index)}});U.current.add(he)},[k,o]),I=f.useCallback(()=>{const he=setTimeout(()=>{const ae=k.lastEnabled();ae&&B(ae.index)});U.current.add(he)},[k]),O=f.useCallback(()=>{h==null||h(),s?E():j()},[s,E,j,h]),{isOpen:M,onOpen:T,onClose:A,onToggle:z}=h4({isOpen:u,defaultIsOpen:d,onClose:p,onOpen:O});ZR({enabled:M&&r,ref:C,handler:he=>{var ae;(ae=_.current)!=null&&ae.contains(he.target)||A()}});const $=m4({...w,enabled:M||S,placement:g,direction:b}),[ee,B]=f.useState(-1);Ni(()=>{M||B(-1)},[M]),O6(C,{focusRef:_,visible:M,shouldFocus:!0});const H=R6({isOpen:M,ref:C}),[G,K]=sD(t,"menu-button","menu-list"),R=f.useCallback(()=>{T(),j()},[T,j]),U=f.useRef(new Set([]));hD(()=>{U.current.forEach(he=>clearTimeout(he)),U.current.clear()});const V=f.useCallback(()=>{T(),E()},[E,T]),J=f.useCallback(()=>{T(),I()},[T,I]),ie=f.useCallback(()=>{var he,ae;const Z=D6(C.current),W=(he=C.current)==null?void 0:he.contains(Z.activeElement);if(!(M&&!W))return;const pe=(ae=k.item(ee))==null?void 0:ae.node;pe==null||pe.focus()},[M,ee,k]),xe=f.useRef(null);return{openAndFocusMenu:R,openAndFocusFirstItem:V,openAndFocusLastItem:J,onTransitionEnd:ie,unstable__animationState:H,descendants:k,popper:$,buttonId:G,menuId:K,forceUpdate:$.forceUpdate,orientation:"vertical",isOpen:M,onToggle:z,onOpen:T,onClose:A,menuRef:C,buttonRef:_,focusedIndex:ee,closeOnSelect:n,closeOnBlur:r,autoSelect:s,setFocusedIndex:B,isLazy:i,lazyBehavior:v,initialFocusRef:o,rafId:xe}}function iD(e={},t=null){const n=Pu(),{onToggle:r,popper:o,openAndFocusFirstItem:s,openAndFocusLastItem:i}=n,u=f.useCallback(d=>{const p=d.key,g={Enter:s,ArrowDown:s,ArrowUp:i}[p];g&&(d.preventDefault(),d.stopPropagation(),g(d))},[s,i]);return{...e,ref:Wn(n.buttonRef,t,o.referenceRef),id:n.buttonId,"data-active":sn(n.isOpen),"aria-expanded":n.isOpen,"aria-haspopup":"menu","aria-controls":n.menuId,onClick:mt(e.onClick,r),onKeyDown:mt(e.onKeyDown,u)}}function a0(e){var t;return fD(e)&&!!((t=e==null?void 0:e.getAttribute("role"))!=null&&t.startsWith("menuitem"))}function lD(e={},t=null){const n=Pu();if(!n)throw new Error("useMenuContext: context is undefined. Seems you forgot to wrap component within ");const{focusedIndex:r,setFocusedIndex:o,menuRef:s,isOpen:i,onClose:u,menuId:d,isLazy:p,lazyBehavior:h,unstable__animationState:g}=n,v=tD(),b=GR({preventDefault:_=>_.key!==" "&&a0(_.target)}),S=f.useCallback(_=>{if(!_.currentTarget.contains(_.target))return;const k=_.key,E={Tab:O=>O.preventDefault(),Escape:u,ArrowDown:()=>{const O=v.nextEnabled(r);O&&o(O.index)},ArrowUp:()=>{const O=v.prevEnabled(r);O&&o(O.index)}}[k];if(E){_.preventDefault(),E(_);return}const I=b(O=>{const M=qR(v.values(),O,T=>{var A,z;return(z=(A=T==null?void 0:T.node)==null?void 0:A.textContent)!=null?z:""},v.item(r));if(M){const T=v.indexOf(M.node);o(T)}});a0(_.target)&&I(_)},[v,r,b,u,o]),w=f.useRef(!1);i&&(w.current=!0);const C=Tv({wasSelected:w.current,enabled:p,mode:h,isSelected:g.present});return{...e,ref:Wn(s,t),children:C?e.children:null,tabIndex:-1,role:"menu",id:d,style:{...e.style,transformOrigin:"var(--popper-transform-origin)"},"aria-orientation":"vertical",onKeyDown:mt(e.onKeyDown,S)}}function cD(e={}){const{popper:t,isOpen:n}=Pu();return t.getPopperProps({...e,style:{visibility:n?"visible":"hidden",...e.style}})}function T6(e={},t=null){const{onMouseEnter:n,onMouseMove:r,onMouseLeave:o,onClick:s,onFocus:i,isDisabled:u,isFocusable:d,closeOnSelect:p,type:h,...g}=e,v=Pu(),{setFocusedIndex:b,focusedIndex:S,closeOnSelect:w,onClose:C,menuRef:_,isOpen:k,menuId:j,rafId:E}=v,I=f.useRef(null),O=`${j}-menuitem-${f.useId()}`,{index:M,register:T}=rD({disabled:u&&!d}),A=f.useCallback(R=>{n==null||n(R),!u&&b(M)},[b,M,u,n]),z=f.useCallback(R=>{r==null||r(R),I.current&&!Gx(I.current)&&A(R)},[A,r]),$=f.useCallback(R=>{o==null||o(R),!u&&b(-1)},[b,u,o]),ee=f.useCallback(R=>{s==null||s(R),a0(R.currentTarget)&&(p??w)&&C()},[C,s,w,p]),B=f.useCallback(R=>{i==null||i(R),b(M)},[b,i,M]),H=M===S,G=u&&!d;Ni(()=>{k&&(H&&!G&&I.current?(E.current&&cancelAnimationFrame(E.current),E.current=requestAnimationFrame(()=>{var R;(R=I.current)==null||R.focus(),E.current=null})):_.current&&!Gx(_.current)&&_.current.focus({preventScroll:!0}))},[H,G,_,k]);const K=E6({onClick:ee,onFocus:B,onMouseEnter:A,onMouseMove:z,onMouseLeave:$,ref:Wn(T,I,t),isDisabled:u,isFocusable:d});return{...g,...K,type:h??K.type,id:O,role:"menuitem",tabIndex:H?0:-1}}function uD(e={},t=null){const{type:n="radio",isChecked:r,...o}=e;return{...T6(o,t),role:`menuitem${n}`,"aria-checked":r}}function dD(e={}){const{children:t,type:n="radio",value:r,defaultValue:o,onChange:s,...i}=e,d=n==="radio"?"":[],[p,h]=mu({defaultValue:o??d,value:r,onChange:s}),g=f.useCallback(S=>{if(n==="radio"&&typeof p=="string"&&h(S),n==="checkbox"&&Array.isArray(p)){const w=p.includes(S)?p.filter(C=>C!==S):p.concat(S);h(w)}},[p,h,n]),b=Up(t).map(S=>{if(S.type.id!=="MenuItemOption")return S;const w=_=>{var k,j;g(S.props.value),(j=(k=S.props).onClick)==null||j.call(k,_)},C=n==="radio"?S.props.value===p:p.includes(S.props.value);return f.cloneElement(S,{type:n,onClick:w,isChecked:C})});return{...i,children:b}}function fD(e){var t;if(!pD(e))return!1;const n=(t=e.ownerDocument.defaultView)!=null?t:window;return e instanceof n.HTMLElement}function pD(e){return e!=null&&typeof e=="object"&&"nodeType"in e&&e.nodeType===Node.ELEMENT_NODE}function hD(e,t=[]){return f.useEffect(()=>()=>e(),t)}var[mD,ju]=cr({name:"MenuStylesContext",errorMessage:`useMenuStyles returned is 'undefined'. Seems you forgot to wrap the components in "" `}),Iu=e=>{const{children:t}=e,n=lo("Menu",e),r=xr(e),{direction:o}=Gp(),{descendants:s,...i}=aD({...r,direction:o}),u=f.useMemo(()=>i,[i]),{isOpen:d,onClose:p,forceUpdate:h}=u;return a.jsx(eD,{value:s,children:a.jsx(oD,{value:u,children:a.jsx(mD,{value:n,children:tv(t,{isOpen:d,onClose:p,forceUpdate:h})})})})};Iu.displayName="Menu";var A6=tt((e,t)=>{const n=ju();return a.jsx(He.span,{ref:t,...e,__css:n.command,className:"chakra-menu__command"})});A6.displayName="MenuCommand";var N6=tt((e,t)=>{const{type:n,...r}=e,o=ju(),s=r.as||n?n??void 0:"button",i=f.useMemo(()=>({textDecoration:"none",color:"inherit",userSelect:"none",display:"flex",width:"100%",alignItems:"center",textAlign:"start",flex:"0 0 auto",outline:0,...o.item}),[o.item]);return a.jsx(He.button,{ref:t,type:s,...r,__css:i})}),Av=e=>{const{className:t,children:n,...r}=e,o=f.Children.only(n),s=f.isValidElement(o)?f.cloneElement(o,{focusable:"false","aria-hidden":!0,className:Ot("chakra-menu__icon",o.props.className)}):null,i=Ot("chakra-menu__icon-wrapper",t);return a.jsx(He.span,{className:i,...r,__css:{display:"inline-flex",alignItems:"center",justifyContent:"center",flexShrink:0},children:s})};Av.displayName="MenuIcon";var Pr=tt((e,t)=>{const{icon:n,iconSpacing:r="0.75rem",command:o,commandSpacing:s="0.75rem",children:i,...u}=e,d=T6(u,t),h=n||o?a.jsx("span",{style:{pointerEvents:"none",flex:1},children:i}):i;return a.jsxs(N6,{...d,className:Ot("chakra-menu__menuitem",d.className),children:[n&&a.jsx(Av,{fontSize:"0.8em",marginEnd:r,children:n}),h,o&&a.jsx(A6,{marginStart:s,children:o})]})});Pr.displayName="MenuItem";var gD={enter:{visibility:"visible",opacity:1,scale:1,transition:{duration:.2,ease:[.4,0,.2,1]}},exit:{transitionEnd:{visibility:"hidden"},opacity:0,scale:.8,transition:{duration:.1,easings:"easeOut"}}},vD=He(io.div),tc=tt(function(t,n){var r,o;const{rootProps:s,motionProps:i,...u}=t,{isOpen:d,onTransitionEnd:p,unstable__animationState:h}=Pu(),g=lD(u,n),v=cD(s),b=ju();return a.jsx(He.div,{...v,__css:{zIndex:(o=t.zIndex)!=null?o:(r=b.list)==null?void 0:r.zIndex},children:a.jsx(vD,{variants:gD,initial:!1,animate:d?"enter":"exit",__css:{outline:0,...b.list},...i,className:Ot("chakra-menu__menu-list",g.className),...g,onUpdate:p,onAnimationComplete:Vp(h.onComplete,g.onAnimationComplete)})})});tc.displayName="MenuList";var $6=tt((e,t)=>{const{title:n,children:r,className:o,...s}=e,i=Ot("chakra-menu__group__title",o),u=ju();return a.jsxs("div",{ref:t,className:"chakra-menu__group",role:"group",children:[n&&a.jsx(He.p,{className:i,...s,__css:u.groupTitle,children:n}),r]})});$6.displayName="MenuGroup";var Nv=e=>{const{className:t,title:n,...r}=e,o=dD(r);return a.jsx($6,{title:n,className:Ot("chakra-menu__option-group",t),...o})};Nv.displayName="MenuOptionGroup";var yD=tt((e,t)=>{const n=ju();return a.jsx(He.button,{ref:t,...e,__css:{display:"inline-flex",appearance:"none",alignItems:"center",outline:0,...n.button}})}),Eu=tt((e,t)=>{const{children:n,as:r,...o}=e,s=iD(o,t),i=r||yD;return a.jsx(i,{...s,className:Ot("chakra-menu__menu-button",e.className),children:a.jsx(He.span,{__css:{pointerEvents:"none",flex:"1 1 auto",minW:0},children:e.children})})});Eu.displayName="MenuButton";var bD=e=>a.jsx("svg",{viewBox:"0 0 14 14",width:"1em",height:"1em",...e,children:a.jsx("polygon",{fill:"currentColor",points:"5.5 11.9993304 14 3.49933039 12.5 2 5.5 8.99933039 1.5 4.9968652 0 6.49933039"})}),ru=tt((e,t)=>{const{icon:n,iconSpacing:r="0.75rem",...o}=e,s=uD(o,t);return a.jsxs(N6,{...s,className:Ot("chakra-menu__menuitem-option",o.className),children:[n!==null&&a.jsx(Av,{fontSize:"0.8em",marginEnd:r,opacity:e.isChecked?1:0,children:n||a.jsx(bD,{})}),a.jsx("span",{style:{flex:1},children:s.children})]})});ru.id="MenuItemOption";ru.displayName="MenuItemOption";var xD={slideInBottom:{...Jg,custom:{offsetY:16,reverse:!0}},slideInRight:{...Jg,custom:{offsetX:16,reverse:!0}},scale:{...j3,custom:{initialScale:.95,reverse:!0}},none:{}},wD=He(io.section),SD=e=>xD[e||"none"],z6=f.forwardRef((e,t)=>{const{preset:n,motionProps:r=SD(n),...o}=e;return a.jsx(wD,{ref:t,...r,...o})});z6.displayName="ModalTransition";var CD=Object.defineProperty,_D=(e,t,n)=>t in e?CD(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,kD=(e,t,n)=>(_D(e,typeof t!="symbol"?t+"":t,n),n),PD=class{constructor(){kD(this,"modals"),this.modals=new Map}add(e){return this.modals.set(e,this.modals.size+1),this.modals.size}remove(e){this.modals.delete(e)}isTopModal(e){return e?this.modals.get(e)===this.modals.size:!1}},i0=new PD;function L6(e,t){const[n,r]=f.useState(0);return f.useEffect(()=>{const o=e.current;if(o){if(t){const s=i0.add(o);r(s)}return()=>{i0.remove(o),r(0)}}},[t,e]),n}var jD=function(e){if(typeof document>"u")return null;var t=Array.isArray(e)?e[0]:e;return t.ownerDocument.body},al=new WeakMap,Id=new WeakMap,Ed={},rg=0,B6=function(e){return e&&(e.host||B6(e.parentNode))},ID=function(e,t){return t.map(function(n){if(e.contains(n))return n;var r=B6(n);return r&&e.contains(r)?r:(console.error("aria-hidden",n,"in not contained inside",e,". Doing nothing"),null)}).filter(function(n){return!!n})},ED=function(e,t,n,r){var o=ID(t,Array.isArray(e)?e:[e]);Ed[n]||(Ed[n]=new WeakMap);var s=Ed[n],i=[],u=new Set,d=new Set(o),p=function(g){!g||u.has(g)||(u.add(g),p(g.parentNode))};o.forEach(p);var h=function(g){!g||d.has(g)||Array.prototype.forEach.call(g.children,function(v){if(u.has(v))h(v);else{var b=v.getAttribute(r),S=b!==null&&b!=="false",w=(al.get(v)||0)+1,C=(s.get(v)||0)+1;al.set(v,w),s.set(v,C),i.push(v),w===1&&S&&Id.set(v,!0),C===1&&v.setAttribute(n,"true"),S||v.setAttribute(r,"true")}})};return h(t),u.clear(),rg++,function(){i.forEach(function(g){var v=al.get(g)-1,b=s.get(g)-1;al.set(g,v),s.set(g,b),v||(Id.has(g)||g.removeAttribute(r),Id.delete(g)),b||g.removeAttribute(n)}),rg--,rg||(al=new WeakMap,al=new WeakMap,Id=new WeakMap,Ed={})}},OD=function(e,t,n){n===void 0&&(n="data-aria-hidden");var r=Array.from(Array.isArray(e)?e:[e]),o=t||jD(e);return o?(r.push.apply(r,Array.from(o.querySelectorAll("[aria-live]"))),ED(r,o,n,"aria-hidden")):function(){return null}};function MD(e){const{isOpen:t,onClose:n,id:r,closeOnOverlayClick:o=!0,closeOnEsc:s=!0,useInert:i=!0,onOverlayClick:u,onEsc:d}=e,p=f.useRef(null),h=f.useRef(null),[g,v,b]=DD(r,"chakra-modal","chakra-modal--header","chakra-modal--body");RD(p,t&&i);const S=L6(p,t),w=f.useRef(null),C=f.useCallback(A=>{w.current=A.target},[]),_=f.useCallback(A=>{A.key==="Escape"&&(A.stopPropagation(),s&&(n==null||n()),d==null||d())},[s,n,d]),[k,j]=f.useState(!1),[E,I]=f.useState(!1),O=f.useCallback((A={},z=null)=>({role:"dialog",...A,ref:Wn(z,p),id:g,tabIndex:-1,"aria-modal":!0,"aria-labelledby":k?v:void 0,"aria-describedby":E?b:void 0,onClick:mt(A.onClick,$=>$.stopPropagation())}),[b,E,g,v,k]),M=f.useCallback(A=>{A.stopPropagation(),w.current===A.target&&i0.isTopModal(p.current)&&(o&&(n==null||n()),u==null||u())},[n,o,u]),T=f.useCallback((A={},z=null)=>({...A,ref:Wn(z,h),onClick:mt(A.onClick,M),onKeyDown:mt(A.onKeyDown,_),onMouseDown:mt(A.onMouseDown,C)}),[_,C,M]);return{isOpen:t,onClose:n,headerId:v,bodyId:b,setBodyMounted:I,setHeaderMounted:j,dialogRef:p,overlayRef:h,getDialogProps:O,getDialogContainerProps:T,index:S}}function RD(e,t){const n=e.current;f.useEffect(()=>{if(!(!e.current||!t))return OD(e.current)},[t,e,n])}function DD(e,...t){const n=f.useId(),r=e||n;return f.useMemo(()=>t.map(o=>`${o}-${r}`),[r,t])}var[TD,nc]=cr({name:"ModalStylesContext",errorMessage:`useModalStyles returned is 'undefined'. Seems you forgot to wrap the components in "" `}),[AD,Oi]=cr({strict:!0,name:"ModalContext",errorMessage:"useModalContext: `context` is undefined. Seems you forgot to wrap modal components in ``"}),ou=e=>{const t={scrollBehavior:"outside",autoFocus:!0,trapFocus:!0,returnFocusOnClose:!0,blockScrollOnMount:!0,allowPinchZoom:!1,motionPreset:"scale",lockFocusAcrossFrames:!0,...e},{portalProps:n,children:r,autoFocus:o,trapFocus:s,initialFocusRef:i,finalFocusRef:u,returnFocusOnClose:d,blockScrollOnMount:p,allowPinchZoom:h,preserveScrollBarGap:g,motionPreset:v,lockFocusAcrossFrames:b,onCloseComplete:S}=t,w=lo("Modal",t),_={...MD(t),autoFocus:o,trapFocus:s,initialFocusRef:i,finalFocusRef:u,returnFocusOnClose:d,blockScrollOnMount:p,allowPinchZoom:h,preserveScrollBarGap:g,motionPreset:v,lockFocusAcrossFrames:b};return a.jsx(AD,{value:_,children:a.jsx(TD,{value:w,children:a.jsx(ws,{onExitComplete:S,children:_.isOpen&&a.jsx(xf,{...n,children:r})})})})};ou.displayName="Modal";var mf="right-scroll-bar-position",gf="width-before-scroll-bar",ND="with-scroll-bars-hidden",$D="--removed-body-scroll-bar-size",F6=Q3(),og=function(){},nh=f.forwardRef(function(e,t){var n=f.useRef(null),r=f.useState({onScrollCapture:og,onWheelCapture:og,onTouchMoveCapture:og}),o=r[0],s=r[1],i=e.forwardProps,u=e.children,d=e.className,p=e.removeScrollBar,h=e.enabled,g=e.shards,v=e.sideCar,b=e.noIsolation,S=e.inert,w=e.allowPinchZoom,C=e.as,_=C===void 0?"div":C,k=e.gapMode,j=q3(e,["forwardProps","children","className","removeScrollBar","enabled","shards","sideCar","noIsolation","inert","allowPinchZoom","as","gapMode"]),E=v,I=G3([n,t]),O=Ls(Ls({},j),o);return f.createElement(f.Fragment,null,h&&f.createElement(E,{sideCar:F6,removeScrollBar:p,shards:g,noIsolation:b,inert:S,setCallbacks:s,allowPinchZoom:!!w,lockRef:n,gapMode:k}),i?f.cloneElement(f.Children.only(u),Ls(Ls({},O),{ref:I})):f.createElement(_,Ls({},O,{className:d,ref:I}),u))});nh.defaultProps={enabled:!0,removeScrollBar:!0,inert:!1};nh.classNames={fullWidth:gf,zeroRight:mf};var qx,zD=function(){if(qx)return qx;if(typeof __webpack_nonce__<"u")return __webpack_nonce__};function LD(){if(!document)return null;var e=document.createElement("style");e.type="text/css";var t=zD();return t&&e.setAttribute("nonce",t),e}function BD(e,t){e.styleSheet?e.styleSheet.cssText=t:e.appendChild(document.createTextNode(t))}function FD(e){var t=document.head||document.getElementsByTagName("head")[0];t.appendChild(e)}var HD=function(){var e=0,t=null;return{add:function(n){e==0&&(t=LD())&&(BD(t,n),FD(t)),e++},remove:function(){e--,!e&&t&&(t.parentNode&&t.parentNode.removeChild(t),t=null)}}},WD=function(){var e=HD();return function(t,n){f.useEffect(function(){return e.add(t),function(){e.remove()}},[t&&n])}},H6=function(){var e=WD(),t=function(n){var r=n.styles,o=n.dynamic;return e(r,o),null};return t},VD={left:0,top:0,right:0,gap:0},sg=function(e){return parseInt(e||"",10)||0},UD=function(e){var t=window.getComputedStyle(document.body),n=t[e==="padding"?"paddingLeft":"marginLeft"],r=t[e==="padding"?"paddingTop":"marginTop"],o=t[e==="padding"?"paddingRight":"marginRight"];return[sg(n),sg(r),sg(o)]},GD=function(e){if(e===void 0&&(e="margin"),typeof window>"u")return VD;var t=UD(e),n=document.documentElement.clientWidth,r=window.innerWidth;return{left:t[0],top:t[1],right:t[2],gap:Math.max(0,r-n+t[2]-t[0])}},qD=H6(),KD=function(e,t,n,r){var o=e.left,s=e.top,i=e.right,u=e.gap;return n===void 0&&(n="margin"),` + .`.concat(ND,` { + overflow: hidden `).concat(r,`; + padding-right: `).concat(u,"px ").concat(r,`; + } + body { + overflow: hidden `).concat(r,`; + overscroll-behavior: contain; + `).concat([t&&"position: relative ".concat(r,";"),n==="margin"&&` + padding-left: `.concat(o,`px; + padding-top: `).concat(s,`px; + padding-right: `).concat(i,`px; + margin-left:0; + margin-top:0; + margin-right: `).concat(u,"px ").concat(r,`; + `),n==="padding"&&"padding-right: ".concat(u,"px ").concat(r,";")].filter(Boolean).join(""),` + } + + .`).concat(mf,` { + right: `).concat(u,"px ").concat(r,`; + } + + .`).concat(gf,` { + margin-right: `).concat(u,"px ").concat(r,`; + } + + .`).concat(mf," .").concat(mf,` { + right: 0 `).concat(r,`; + } + + .`).concat(gf," .").concat(gf,` { + margin-right: 0 `).concat(r,`; + } + + body { + `).concat($D,": ").concat(u,`px; + } +`)},YD=function(e){var t=e.noRelative,n=e.noImportant,r=e.gapMode,o=r===void 0?"margin":r,s=f.useMemo(function(){return GD(o)},[o]);return f.createElement(qD,{styles:KD(s,!t,o,n?"":"!important")})},l0=!1;if(typeof window<"u")try{var Od=Object.defineProperty({},"passive",{get:function(){return l0=!0,!0}});window.addEventListener("test",Od,Od),window.removeEventListener("test",Od,Od)}catch{l0=!1}var il=l0?{passive:!1}:!1,QD=function(e){return e.tagName==="TEXTAREA"},W6=function(e,t){var n=window.getComputedStyle(e);return n[t]!=="hidden"&&!(n.overflowY===n.overflowX&&!QD(e)&&n[t]==="visible")},XD=function(e){return W6(e,"overflowY")},JD=function(e){return W6(e,"overflowX")},Kx=function(e,t){var n=t.ownerDocument,r=t;do{typeof ShadowRoot<"u"&&r instanceof ShadowRoot&&(r=r.host);var o=V6(e,r);if(o){var s=U6(e,r),i=s[1],u=s[2];if(i>u)return!0}r=r.parentNode}while(r&&r!==n.body);return!1},ZD=function(e){var t=e.scrollTop,n=e.scrollHeight,r=e.clientHeight;return[t,n,r]},eT=function(e){var t=e.scrollLeft,n=e.scrollWidth,r=e.clientWidth;return[t,n,r]},V6=function(e,t){return e==="v"?XD(t):JD(t)},U6=function(e,t){return e==="v"?ZD(t):eT(t)},tT=function(e,t){return e==="h"&&t==="rtl"?-1:1},nT=function(e,t,n,r,o){var s=tT(e,window.getComputedStyle(t).direction),i=s*r,u=n.target,d=t.contains(u),p=!1,h=i>0,g=0,v=0;do{var b=U6(e,u),S=b[0],w=b[1],C=b[2],_=w-C-s*S;(S||_)&&V6(e,u)&&(g+=_,v+=S),u=u.parentNode}while(!d&&u!==document.body||d&&(t.contains(u)||t===u));return(h&&(o&&g===0||!o&&i>g)||!h&&(o&&v===0||!o&&-i>v))&&(p=!0),p},Md=function(e){return"changedTouches"in e?[e.changedTouches[0].clientX,e.changedTouches[0].clientY]:[0,0]},Yx=function(e){return[e.deltaX,e.deltaY]},Qx=function(e){return e&&"current"in e?e.current:e},rT=function(e,t){return e[0]===t[0]&&e[1]===t[1]},oT=function(e){return` + .block-interactivity-`.concat(e,` {pointer-events: none;} + .allow-interactivity-`).concat(e,` {pointer-events: all;} +`)},sT=0,ll=[];function aT(e){var t=f.useRef([]),n=f.useRef([0,0]),r=f.useRef(),o=f.useState(sT++)[0],s=f.useState(H6)[0],i=f.useRef(e);f.useEffect(function(){i.current=e},[e]),f.useEffect(function(){if(e.inert){document.body.classList.add("block-interactivity-".concat(o));var w=n0([e.lockRef.current],(e.shards||[]).map(Qx),!0).filter(Boolean);return w.forEach(function(C){return C.classList.add("allow-interactivity-".concat(o))}),function(){document.body.classList.remove("block-interactivity-".concat(o)),w.forEach(function(C){return C.classList.remove("allow-interactivity-".concat(o))})}}},[e.inert,e.lockRef.current,e.shards]);var u=f.useCallback(function(w,C){if("touches"in w&&w.touches.length===2)return!i.current.allowPinchZoom;var _=Md(w),k=n.current,j="deltaX"in w?w.deltaX:k[0]-_[0],E="deltaY"in w?w.deltaY:k[1]-_[1],I,O=w.target,M=Math.abs(j)>Math.abs(E)?"h":"v";if("touches"in w&&M==="h"&&O.type==="range")return!1;var T=Kx(M,O);if(!T)return!0;if(T?I=M:(I=M==="v"?"h":"v",T=Kx(M,O)),!T)return!1;if(!r.current&&"changedTouches"in w&&(j||E)&&(r.current=I),!I)return!0;var A=r.current||I;return nT(A,C,w,A==="h"?j:E,!0)},[]),d=f.useCallback(function(w){var C=w;if(!(!ll.length||ll[ll.length-1]!==s)){var _="deltaY"in C?Yx(C):Md(C),k=t.current.filter(function(I){return I.name===C.type&&I.target===C.target&&rT(I.delta,_)})[0];if(k&&k.should){C.cancelable&&C.preventDefault();return}if(!k){var j=(i.current.shards||[]).map(Qx).filter(Boolean).filter(function(I){return I.contains(C.target)}),E=j.length>0?u(C,j[0]):!i.current.noIsolation;E&&C.cancelable&&C.preventDefault()}}},[]),p=f.useCallback(function(w,C,_,k){var j={name:w,delta:C,target:_,should:k};t.current.push(j),setTimeout(function(){t.current=t.current.filter(function(E){return E!==j})},1)},[]),h=f.useCallback(function(w){n.current=Md(w),r.current=void 0},[]),g=f.useCallback(function(w){p(w.type,Yx(w),w.target,u(w,e.lockRef.current))},[]),v=f.useCallback(function(w){p(w.type,Md(w),w.target,u(w,e.lockRef.current))},[]);f.useEffect(function(){return ll.push(s),e.setCallbacks({onScrollCapture:g,onWheelCapture:g,onTouchMoveCapture:v}),document.addEventListener("wheel",d,il),document.addEventListener("touchmove",d,il),document.addEventListener("touchstart",h,il),function(){ll=ll.filter(function(w){return w!==s}),document.removeEventListener("wheel",d,il),document.removeEventListener("touchmove",d,il),document.removeEventListener("touchstart",h,il)}},[]);var b=e.removeScrollBar,S=e.inert;return f.createElement(f.Fragment,null,S?f.createElement(s,{styles:oT(o)}):null,b?f.createElement(YD,{gapMode:e.gapMode}):null)}const iT=RM(F6,aT);var G6=f.forwardRef(function(e,t){return f.createElement(nh,Ls({},e,{ref:t,sideCar:iT}))});G6.classNames=nh.classNames;const lT=G6;function cT(e){const{autoFocus:t,trapFocus:n,dialogRef:r,initialFocusRef:o,blockScrollOnMount:s,allowPinchZoom:i,finalFocusRef:u,returnFocusOnClose:d,preserveScrollBarGap:p,lockFocusAcrossFrames:h,isOpen:g}=Oi(),[v,b]=_E();f.useEffect(()=>{!v&&b&&setTimeout(b)},[v,b]);const S=L6(r,g);return a.jsx(_6,{autoFocus:t,isDisabled:!n,initialFocusRef:o,finalFocusRef:u,restoreFocus:d,contentRef:r,lockFocusAcrossFrames:h,children:a.jsx(lT,{removeScrollBar:!p,allowPinchZoom:i,enabled:S===1&&s,forwardProps:!0,children:e.children})})}var su=tt((e,t)=>{const{className:n,children:r,containerProps:o,motionProps:s,...i}=e,{getDialogProps:u,getDialogContainerProps:d}=Oi(),p=u(i,t),h=d(o),g=Ot("chakra-modal__content",n),v=nc(),b={display:"flex",flexDirection:"column",position:"relative",width:"100%",outline:0,...v.dialog},S={display:"flex",width:"100vw",height:"$100vh",position:"fixed",left:0,top:0,...v.dialogContainer},{motionPreset:w}=Oi();return a.jsx(cT,{children:a.jsx(He.div,{...h,className:"chakra-modal__content-container",tabIndex:-1,__css:S,children:a.jsx(z6,{preset:w,motionProps:s,className:g,...p,__css:b,children:r})})})});su.displayName="ModalContent";function Ou(e){const{leastDestructiveRef:t,...n}=e;return a.jsx(ou,{...n,initialFocusRef:t})}var Mu=tt((e,t)=>a.jsx(su,{ref:t,role:"alertdialog",...e})),ma=tt((e,t)=>{const{className:n,...r}=e,o=Ot("chakra-modal__footer",n),i={display:"flex",alignItems:"center",justifyContent:"flex-end",...nc().footer};return a.jsx(He.footer,{ref:t,...r,__css:i,className:o})});ma.displayName="ModalFooter";var ga=tt((e,t)=>{const{className:n,...r}=e,{headerId:o,setHeaderMounted:s}=Oi();f.useEffect(()=>(s(!0),()=>s(!1)),[s]);const i=Ot("chakra-modal__header",n),d={flex:0,...nc().header};return a.jsx(He.header,{ref:t,className:i,id:o,...r,__css:d})});ga.displayName="ModalHeader";var uT=He(io.div),va=tt((e,t)=>{const{className:n,transition:r,motionProps:o,...s}=e,i=Ot("chakra-modal__overlay",n),d={pos:"fixed",left:"0",top:"0",w:"100vw",h:"100vh",...nc().overlay},{motionPreset:p}=Oi(),g=o||(p==="none"?{}:P3);return a.jsx(uT,{...g,__css:d,ref:t,className:i,...s})});va.displayName="ModalOverlay";var ya=tt((e,t)=>{const{className:n,...r}=e,{bodyId:o,setBodyMounted:s}=Oi();f.useEffect(()=>(s(!0),()=>s(!1)),[s]);const i=Ot("chakra-modal__body",n),u=nc();return a.jsx(He.div,{ref:t,className:i,id:o,...r,__css:u.body})});ya.displayName="ModalBody";var $v=tt((e,t)=>{const{onClick:n,className:r,...o}=e,{onClose:s}=Oi(),i=Ot("chakra-modal__close-btn",r),u=nc();return a.jsx(kE,{ref:t,__css:u.closeButton,className:i,onClick:mt(n,d=>{d.stopPropagation(),s()}),...o})});$v.displayName="ModalCloseButton";var[dT,Ru]=cr({name:"PopoverContext",errorMessage:"usePopoverContext: `context` is undefined. Seems you forgot to wrap all popover components within ``"}),[fT,zv]=cr({name:"PopoverStylesContext",errorMessage:`usePopoverStyles returned is 'undefined'. Seems you forgot to wrap the components in "" `});function Lv(e){const t=f.Children.only(e.children),{getTriggerProps:n}=Ru();return f.cloneElement(t,n(t.props,t.ref))}Lv.displayName="PopoverTrigger";var cl={click:"click",hover:"hover"};function pT(e={}){const{closeOnBlur:t=!0,closeOnEsc:n=!0,initialFocusRef:r,id:o,returnFocusOnClose:s=!0,autoFocus:i=!0,arrowSize:u,arrowShadowColor:d,trigger:p=cl.click,openDelay:h=200,closeDelay:g=200,isLazy:v,lazyBehavior:b="unmount",computePositionOnMount:S,...w}=e,{isOpen:C,onClose:_,onOpen:k,onToggle:j}=h4(e),E=f.useRef(null),I=f.useRef(null),O=f.useRef(null),M=f.useRef(!1),T=f.useRef(!1);C&&(T.current=!0);const[A,z]=f.useState(!1),[$,ee]=f.useState(!1),B=f.useId(),H=o??B,[G,K,R,U]=["popover-trigger","popover-content","popover-header","popover-body"].map(_e=>`${_e}-${H}`),{referenceRef:V,getArrowProps:J,getPopperProps:ie,getArrowInnerProps:xe,forceUpdate:he}=m4({...w,enabled:C||!!S}),ae=R6({isOpen:C,ref:O});B3({enabled:C,ref:I}),O6(O,{focusRef:I,visible:C,shouldFocus:s&&p===cl.click}),XR(O,{focusRef:r,visible:C,shouldFocus:i&&p===cl.click});const Z=Tv({wasSelected:T.current,enabled:v,mode:b,isSelected:ae.present}),W=f.useCallback((_e={},We=null)=>{const Le={..._e,style:{..._e.style,transformOrigin:Hm.transformOrigin.varRef,[Hm.arrowSize.var]:u?`${u}px`:void 0,[Hm.arrowShadowColor.var]:d},ref:Wn(O,We),children:Z?_e.children:null,id:K,tabIndex:-1,role:"dialog",onKeyDown:mt(_e.onKeyDown,Ue=>{n&&Ue.key==="Escape"&&_()}),onBlur:mt(_e.onBlur,Ue=>{const kt=Xx(Ue),gt=ag(O.current,kt),Pn=ag(I.current,kt);C&&t&&(!gt&&!Pn)&&_()}),"aria-labelledby":A?R:void 0,"aria-describedby":$?U:void 0};return p===cl.hover&&(Le.role="tooltip",Le.onMouseEnter=mt(_e.onMouseEnter,()=>{M.current=!0}),Le.onMouseLeave=mt(_e.onMouseLeave,Ue=>{Ue.nativeEvent.relatedTarget!==null&&(M.current=!1,setTimeout(()=>_(),g))})),Le},[Z,K,A,R,$,U,p,n,_,C,t,g,d,u]),re=f.useCallback((_e={},We=null)=>ie({..._e,style:{visibility:C?"visible":"hidden",..._e.style}},We),[C,ie]),pe=f.useCallback((_e,We=null)=>({..._e,ref:Wn(We,E,V)}),[E,V]),ne=f.useRef(),ge=f.useRef(),ue=f.useCallback(_e=>{E.current==null&&V(_e)},[V]),Ce=f.useCallback((_e={},We=null)=>{const Le={..._e,ref:Wn(I,We,ue),id:G,"aria-haspopup":"dialog","aria-expanded":C,"aria-controls":K};return p===cl.click&&(Le.onClick=mt(_e.onClick,j)),p===cl.hover&&(Le.onFocus=mt(_e.onFocus,()=>{ne.current===void 0&&k()}),Le.onBlur=mt(_e.onBlur,Ue=>{const kt=Xx(Ue),gt=!ag(O.current,kt);C&&t&>&&_()}),Le.onKeyDown=mt(_e.onKeyDown,Ue=>{Ue.key==="Escape"&&_()}),Le.onMouseEnter=mt(_e.onMouseEnter,()=>{M.current=!0,ne.current=window.setTimeout(()=>k(),h)}),Le.onMouseLeave=mt(_e.onMouseLeave,()=>{M.current=!1,ne.current&&(clearTimeout(ne.current),ne.current=void 0),ge.current=window.setTimeout(()=>{M.current===!1&&_()},g)})),Le},[G,C,K,p,ue,j,k,t,_,h,g]);f.useEffect(()=>()=>{ne.current&&clearTimeout(ne.current),ge.current&&clearTimeout(ge.current)},[]);const Re=f.useCallback((_e={},We=null)=>({..._e,id:R,ref:Wn(We,Le=>{z(!!Le)})}),[R]),me=f.useCallback((_e={},We=null)=>({..._e,id:U,ref:Wn(We,Le=>{ee(!!Le)})}),[U]);return{forceUpdate:he,isOpen:C,onAnimationComplete:ae.onComplete,onClose:_,getAnchorProps:pe,getArrowProps:J,getArrowInnerProps:xe,getPopoverPositionerProps:re,getPopoverProps:W,getTriggerProps:Ce,getHeaderProps:Re,getBodyProps:me}}function ag(e,t){return e===t||(e==null?void 0:e.contains(t))}function Xx(e){var t;const n=e.currentTarget.ownerDocument.activeElement;return(t=e.relatedTarget)!=null?t:n}function Bv(e){const t=lo("Popover",e),{children:n,...r}=xr(e),o=Gp(),s=pT({...r,direction:o.direction});return a.jsx(dT,{value:s,children:a.jsx(fT,{value:t,children:tv(n,{isOpen:s.isOpen,onClose:s.onClose,forceUpdate:s.forceUpdate})})})}Bv.displayName="Popover";var ig=(e,t)=>t?`${e}.${t}, ${t}`:void 0;function q6(e){var t;const{bg:n,bgColor:r,backgroundColor:o,shadow:s,boxShadow:i,shadowColor:u}=e,{getArrowProps:d,getArrowInnerProps:p}=Ru(),h=zv(),g=(t=n??r)!=null?t:o,v=s??i;return a.jsx(He.div,{...d(),className:"chakra-popover__arrow-positioner",children:a.jsx(He.div,{className:Ot("chakra-popover__arrow",e.className),...p(e),__css:{"--popper-arrow-shadow-color":ig("colors",u),"--popper-arrow-bg":ig("colors",g),"--popper-arrow-shadow":ig("shadows",v),...h.arrow}})})}q6.displayName="PopoverArrow";var K6=tt(function(t,n){const{getBodyProps:r}=Ru(),o=zv();return a.jsx(He.div,{...r(t,n),className:Ot("chakra-popover__body",t.className),__css:o.body})});K6.displayName="PopoverBody";function hT(e){if(e)return{enter:{...e.enter,visibility:"visible"},exit:{...e.exit,transitionEnd:{visibility:"hidden"}}}}var mT={exit:{opacity:0,scale:.95,transition:{duration:.1,ease:[.4,0,1,1]}},enter:{scale:1,opacity:1,transition:{duration:.15,ease:[0,0,.2,1]}}},gT=He(io.section),Y6=tt(function(t,n){const{variants:r=mT,...o}=t,{isOpen:s}=Ru();return a.jsx(gT,{ref:n,variants:hT(r),initial:!1,animate:s?"enter":"exit",...o})});Y6.displayName="PopoverTransition";var Fv=tt(function(t,n){const{rootProps:r,motionProps:o,...s}=t,{getPopoverProps:i,getPopoverPositionerProps:u,onAnimationComplete:d}=Ru(),p=zv(),h={position:"relative",display:"flex",flexDirection:"column",...p.content};return a.jsx(He.div,{...u(r),__css:p.popper,className:"chakra-popover__popper",children:a.jsx(Y6,{...o,...i(s,n),onAnimationComplete:Vp(d,s.onAnimationComplete),className:Ot("chakra-popover__content",t.className),__css:h})})});Fv.displayName="PopoverContent";function vT(e,t,n){return(e-t)*100/(n-t)}Sa({"0%":{strokeDasharray:"1, 400",strokeDashoffset:"0"},"50%":{strokeDasharray:"400, 400",strokeDashoffset:"-100"},"100%":{strokeDasharray:"400, 400",strokeDashoffset:"-260"}});Sa({"0%":{transform:"rotate(0deg)"},"100%":{transform:"rotate(360deg)"}});var yT=Sa({"0%":{left:"-40%"},"100%":{left:"100%"}}),bT=Sa({from:{backgroundPosition:"1rem 0"},to:{backgroundPosition:"0 0"}});function xT(e){const{value:t=0,min:n,max:r,valueText:o,getValueText:s,isIndeterminate:i,role:u="progressbar"}=e,d=vT(t,n,r);return{bind:{"data-indeterminate":i?"":void 0,"aria-valuemax":r,"aria-valuemin":n,"aria-valuenow":i?void 0:t,"aria-valuetext":(()=>{if(t!=null)return typeof s=="function"?s(t,d):o})(),role:u},percent:d,value:t}}var[wT,ST]=cr({name:"ProgressStylesContext",errorMessage:`useProgressStyles returned is 'undefined'. Seems you forgot to wrap the components in "" `}),CT=tt((e,t)=>{const{min:n,max:r,value:o,isIndeterminate:s,role:i,...u}=e,d=xT({value:o,min:n,max:r,isIndeterminate:s,role:i}),h={height:"100%",...ST().filledTrack};return a.jsx(He.div,{ref:t,style:{width:`${d.percent}%`,...u.style},...d.bind,...u,__css:h})}),Q6=tt((e,t)=>{var n;const{value:r,min:o=0,max:s=100,hasStripe:i,isAnimated:u,children:d,borderRadius:p,isIndeterminate:h,"aria-label":g,"aria-labelledby":v,"aria-valuetext":b,title:S,role:w,...C}=xr(e),_=lo("Progress",e),k=p??((n=_.track)==null?void 0:n.borderRadius),j={animation:`${bT} 1s linear infinite`},O={...!h&&i&&u&&j,...h&&{position:"absolute",willChange:"left",minWidth:"50%",animation:`${yT} 1s ease infinite normal none running`}},M={overflow:"hidden",position:"relative",..._.track};return a.jsx(He.div,{ref:t,borderRadius:k,__css:M,...C,children:a.jsxs(wT,{value:_,children:[a.jsx(CT,{"aria-label":g,"aria-labelledby":v,"aria-valuetext":b,min:o,max:s,value:r,isIndeterminate:h,css:O,borderRadius:k,title:S,role:w}),d]})})});Q6.displayName="Progress";function _T(e){return e&&Lb(e)&&Lb(e.target)}function kT(e={}){const{onChange:t,value:n,defaultValue:r,name:o,isDisabled:s,isFocusable:i,isNative:u,...d}=e,[p,h]=f.useState(r||""),g=typeof n<"u",v=g?n:p,b=f.useRef(null),S=f.useCallback(()=>{const I=b.current;if(!I)return;let O="input:not(:disabled):checked";const M=I.querySelector(O);if(M){M.focus();return}O="input:not(:disabled)";const T=I.querySelector(O);T==null||T.focus()},[]),C=`radio-${f.useId()}`,_=o||C,k=f.useCallback(I=>{const O=_T(I)?I.target.value:I;g||h(O),t==null||t(String(O))},[t,g]),j=f.useCallback((I={},O=null)=>({...I,ref:Wn(O,b),role:"radiogroup"}),[]),E=f.useCallback((I={},O=null)=>({...I,ref:O,name:_,[u?"checked":"isChecked"]:v!=null?I.value===v:void 0,onChange(T){k(T)},"data-radiogroup":!0}),[u,_,k,v]);return{getRootProps:j,getRadioProps:E,name:_,ref:b,focus:S,setValue:h,value:v,onChange:k,isDisabled:s,isFocusable:i,htmlProps:d}}var[PT,X6]=cr({name:"RadioGroupContext",strict:!1}),zf=tt((e,t)=>{const{colorScheme:n,size:r,variant:o,children:s,className:i,isDisabled:u,isFocusable:d,...p}=e,{value:h,onChange:g,getRootProps:v,name:b,htmlProps:S}=kT(p),w=f.useMemo(()=>({name:b,size:r,onChange:g,colorScheme:n,value:h,variant:o,isDisabled:u,isFocusable:d}),[b,r,g,n,h,o,u,d]);return a.jsx(PT,{value:w,children:a.jsx(He.div,{...v(S,t),className:Ot("chakra-radio-group",i),children:s})})});zf.displayName="RadioGroup";var jT={border:"0",clip:"rect(0, 0, 0, 0)",height:"1px",width:"1px",margin:"-1px",padding:"0",overflow:"hidden",whiteSpace:"nowrap",position:"absolute"};function IT(e={}){const{defaultChecked:t,isChecked:n,isFocusable:r,isDisabled:o,isReadOnly:s,isRequired:i,onChange:u,isInvalid:d,name:p,value:h,id:g,"data-radiogroup":v,"aria-describedby":b,...S}=e,w=`radio-${f.useId()}`,C=PE(),k=!!X6()||!!v;let E=!!C&&!k?C.id:w;E=g??E;const I=o??(C==null?void 0:C.isDisabled),O=s??(C==null?void 0:C.isReadOnly),M=i??(C==null?void 0:C.isRequired),T=d??(C==null?void 0:C.isInvalid),[A,z]=f.useState(!1),[$,ee]=f.useState(!1),[B,H]=f.useState(!1),[G,K]=f.useState(!1),[R,U]=f.useState(!!t),V=typeof n<"u",J=V?n:R;f.useEffect(()=>M3(z),[]);const ie=f.useCallback(ue=>{if(O||I){ue.preventDefault();return}V||U(ue.target.checked),u==null||u(ue)},[V,I,O,u]),xe=f.useCallback(ue=>{ue.key===" "&&K(!0)},[K]),he=f.useCallback(ue=>{ue.key===" "&&K(!1)},[K]),ae=f.useCallback((ue={},Ce=null)=>({...ue,ref:Ce,"data-active":sn(G),"data-hover":sn(B),"data-disabled":sn(I),"data-invalid":sn(T),"data-checked":sn(J),"data-focus":sn($),"data-focus-visible":sn($&&A),"data-readonly":sn(O),"aria-hidden":!0,onMouseDown:mt(ue.onMouseDown,()=>K(!0)),onMouseUp:mt(ue.onMouseUp,()=>K(!1)),onMouseEnter:mt(ue.onMouseEnter,()=>H(!0)),onMouseLeave:mt(ue.onMouseLeave,()=>H(!1))}),[G,B,I,T,J,$,O,A]),{onFocus:Z,onBlur:W}=C??{},re=f.useCallback((ue={},Ce=null)=>{const Re=I&&!r;return{...ue,id:E,ref:Ce,type:"radio",name:p,value:h,onChange:mt(ue.onChange,ie),onBlur:mt(W,ue.onBlur,()=>ee(!1)),onFocus:mt(Z,ue.onFocus,()=>ee(!0)),onKeyDown:mt(ue.onKeyDown,xe),onKeyUp:mt(ue.onKeyUp,he),checked:J,disabled:Re,readOnly:O,required:M,"aria-invalid":Sl(T),"aria-disabled":Sl(Re),"aria-required":Sl(M),"data-readonly":sn(O),"aria-describedby":b,style:jT}},[I,r,E,p,h,ie,W,Z,xe,he,J,O,M,T,b]);return{state:{isInvalid:T,isFocused:$,isChecked:J,isActive:G,isHovered:B,isDisabled:I,isReadOnly:O,isRequired:M},getCheckboxProps:ae,getRadioProps:ae,getInputProps:re,getLabelProps:(ue={},Ce=null)=>({...ue,ref:Ce,onMouseDown:mt(ue.onMouseDown,ET),"data-disabled":sn(I),"data-checked":sn(J),"data-invalid":sn(T)}),getRootProps:(ue,Ce=null)=>({...ue,ref:Ce,"data-disabled":sn(I),"data-checked":sn(J),"data-invalid":sn(T)}),htmlProps:S}}function ET(e){e.preventDefault(),e.stopPropagation()}function OT(e,t){const n={},r={};for(const[o,s]of Object.entries(e))t.includes(o)?n[o]=s:r[o]=s;return[n,r]}var sa=tt((e,t)=>{var n;const r=X6(),{onChange:o,value:s}=e,i=lo("Radio",{...r,...e}),u=xr(e),{spacing:d="0.5rem",children:p,isDisabled:h=r==null?void 0:r.isDisabled,isFocusable:g=r==null?void 0:r.isFocusable,inputProps:v,...b}=u;let S=e.isChecked;(r==null?void 0:r.value)!=null&&s!=null&&(S=r.value===s);let w=o;r!=null&&r.onChange&&s!=null&&(w=Vp(r.onChange,o));const C=(n=e==null?void 0:e.name)!=null?n:r==null?void 0:r.name,{getInputProps:_,getCheckboxProps:k,getLabelProps:j,getRootProps:E,htmlProps:I}=IT({...b,isChecked:S,isFocusable:g,isDisabled:h,onChange:w,name:C}),[O,M]=OT(I,g4),T=k(M),A=_(v,t),z=j(),$=Object.assign({},O,E()),ee={display:"inline-flex",alignItems:"center",verticalAlign:"top",cursor:"pointer",position:"relative",...i.container},B={display:"inline-flex",alignItems:"center",justifyContent:"center",flexShrink:0,...i.control},H={userSelect:"none",marginStart:d,...i.label};return a.jsxs(He.label,{className:"chakra-radio",...$,__css:ee,children:[a.jsx("input",{className:"chakra-radio__input",...A}),a.jsx(He.span,{className:"chakra-radio__control",...T,__css:B}),p&&a.jsx(He.span,{className:"chakra-radio__label",...z,__css:H,children:p})]})});sa.displayName="Radio";var J6=tt(function(t,n){const{children:r,placeholder:o,className:s,...i}=t;return a.jsxs(He.select,{...i,ref:n,className:Ot("chakra-select",s),children:[o&&a.jsx("option",{value:"",children:o}),r]})});J6.displayName="SelectField";function MT(e,t){const n={},r={};for(const[o,s]of Object.entries(e))t.includes(o)?n[o]=s:r[o]=s;return[n,r]}var Z6=tt((e,t)=>{var n;const r=lo("Select",e),{rootProps:o,placeholder:s,icon:i,color:u,height:d,h:p,minH:h,minHeight:g,iconColor:v,iconSize:b,...S}=xr(e),[w,C]=MT(S,g4),_=nv(C),k={width:"100%",height:"fit-content",position:"relative",color:u},j={paddingEnd:"2rem",...r.field,_focus:{zIndex:"unset",...(n=r.field)==null?void 0:n._focus}};return a.jsxs(He.div,{className:"chakra-select__wrapper",__css:k,...w,...o,children:[a.jsx(J6,{ref:t,height:p??d,minH:h??g,placeholder:s,..._,__css:j,children:e.children}),a.jsx(e5,{"data-disabled":sn(_.disabled),...(v||u)&&{color:v||u},__css:r.icon,...b&&{fontSize:b},children:i})]})});Z6.displayName="Select";var RT=e=>a.jsx("svg",{viewBox:"0 0 24 24",...e,children:a.jsx("path",{fill:"currentColor",d:"M16.59 8.59L12 13.17 7.41 8.59 6 10l6 6 6-6z"})}),DT=He("div",{baseStyle:{position:"absolute",display:"inline-flex",alignItems:"center",justifyContent:"center",pointerEvents:"none",top:"50%",transform:"translateY(-50%)"}}),e5=e=>{const{children:t=a.jsx(RT,{}),...n}=e,r=f.cloneElement(t,{role:"presentation",className:"chakra-select__icon",focusable:!1,"aria-hidden":!0,style:{width:"1em",height:"1em",color:"currentColor"}});return a.jsx(DT,{...n,className:"chakra-select__icon-wrapper",children:f.isValidElement(t)?r:null})};e5.displayName="SelectIcon";function TT(){const e=f.useRef(!0);return f.useEffect(()=>{e.current=!1},[]),e.current}function AT(e){const t=f.useRef();return f.useEffect(()=>{t.current=e},[e]),t.current}var NT=He("div",{baseStyle:{boxShadow:"none",backgroundClip:"padding-box",cursor:"default",color:"transparent",pointerEvents:"none",userSelect:"none","&::before, &::after, *":{visibility:"hidden"}}}),c0=v4("skeleton-start-color"),u0=v4("skeleton-end-color"),$T=Sa({from:{opacity:0},to:{opacity:1}}),zT=Sa({from:{borderColor:c0.reference,background:c0.reference},to:{borderColor:u0.reference,background:u0.reference}}),t5=tt((e,t)=>{const n={...e,fadeDuration:typeof e.fadeDuration=="number"?e.fadeDuration:.4,speed:typeof e.speed=="number"?e.speed:.8},r=Kl("Skeleton",n),o=TT(),{startColor:s="",endColor:i="",isLoaded:u,fadeDuration:d,speed:p,className:h,fitContent:g,...v}=xr(n),[b,S]=Yl("colors",[s,i]),w=AT(u),C=Ot("chakra-skeleton",h),_={...b&&{[c0.variable]:b},...S&&{[u0.variable]:S}};if(u){const k=o||w?"none":`${$T} ${d}s`;return a.jsx(He.div,{ref:t,className:C,__css:{animation:k},...v})}return a.jsx(NT,{ref:t,className:C,...v,__css:{width:g?"fit-content":void 0,...r,..._,_dark:{...r._dark,..._},animation:`${p}s linear infinite alternate ${zT}`}})});t5.displayName="Skeleton";function LT(e){const{min:t=0,max:n=100,onChange:r,value:o,defaultValue:s,isReversed:i,direction:u="ltr",orientation:d="horizontal",id:p,isDisabled:h,isReadOnly:g,onChangeStart:v,onChangeEnd:b,step:S=1,getAriaValueText:w,"aria-valuetext":C,"aria-label":_,"aria-labelledby":k,name:j,focusThumbOnChange:E=!0,minStepsBetweenThumbs:I=0,...O}=e,M=Ua(v),T=Ua(b),A=Ua(w),z=DE({isReversed:i,direction:u,orientation:d}),[$,ee]=mu({value:o,defaultValue:s??[25,75],onChange:r});if(!Array.isArray($))throw new TypeError(`[range-slider] You passed an invalid value for \`value\` or \`defaultValue\`, expected \`Array\` but got \`${typeof $}\``);const[B,H]=f.useState(!1),[G,K]=f.useState(!1),[R,U]=f.useState(-1),V=!(h||g),J=f.useRef($),ie=$.map(Ee=>Bb(Ee,t,n)),xe=I*S,he=BT(ie,t,n,xe),ae=f.useRef({eventSource:null,value:[],valueBounds:[]});ae.current.value=ie,ae.current.valueBounds=he;const Z=ie.map(Ee=>n-Ee+t),re=(z?Z:ie).map(Ee=>Fb(Ee,t,n)),pe=d==="vertical",ne=f.useRef(null),ge=f.useRef(null),ue=jE({getNodes(){const Ee=ge.current,at=Ee==null?void 0:Ee.querySelectorAll("[role=slider]");return at?Array.from(at):[]}}),Ce=f.useId(),me=TE(p??Ce),_e=f.useCallback(Ee=>{var at,Ye;if(!ne.current)return;ae.current.eventSource="pointer";const rt=ne.current.getBoundingClientRect(),{clientX:Nt,clientY:dr}=(Ye=(at=Ee.touches)==null?void 0:at[0])!=null?Ye:Ee,yn=pe?rt.bottom-dr:Nt-rt.left,bn=pe?rt.height:rt.width;let zr=yn/bn;return z&&(zr=1-zr),IE(zr,t,n)},[pe,z,n,t]),We=(n-t)/10,Le=S||(n-t)/100,Ue=f.useMemo(()=>({setValueAtIndex(Ee,at){if(!V)return;const Ye=ae.current.valueBounds[Ee];at=parseFloat(EE(at,Ye.min,Le)),at=Bb(at,Ye.min,Ye.max);const rt=[...ae.current.value];rt[Ee]=at,ee(rt)},setActiveIndex:U,stepUp(Ee,at=Le){const Ye=ae.current.value[Ee],rt=z?Ye-at:Ye+at;Ue.setValueAtIndex(Ee,rt)},stepDown(Ee,at=Le){const Ye=ae.current.value[Ee],rt=z?Ye+at:Ye-at;Ue.setValueAtIndex(Ee,rt)},reset(){ee(J.current)}}),[Le,z,ee,V]),kt=f.useCallback(Ee=>{const at=Ee.key,rt={ArrowRight:()=>Ue.stepUp(R),ArrowUp:()=>Ue.stepUp(R),ArrowLeft:()=>Ue.stepDown(R),ArrowDown:()=>Ue.stepDown(R),PageUp:()=>Ue.stepUp(R,We),PageDown:()=>Ue.stepDown(R,We),Home:()=>{const{min:Nt}=he[R];Ue.setValueAtIndex(R,Nt)},End:()=>{const{max:Nt}=he[R];Ue.setValueAtIndex(R,Nt)}}[at];rt&&(Ee.preventDefault(),Ee.stopPropagation(),rt(Ee),ae.current.eventSource="keyboard")},[Ue,R,We,he]),{getThumbStyle:gt,rootStyle:Pn,trackStyle:Pt,innerTrackStyle:yt}=f.useMemo(()=>OE({isReversed:z,orientation:d,thumbRects:ue,thumbPercents:re}),[z,d,re,ue]),be=f.useCallback(Ee=>{var at;const Ye=Ee??R;if(Ye!==-1&&E){const rt=me.getThumb(Ye),Nt=(at=ge.current)==null?void 0:at.ownerDocument.getElementById(rt);Nt&&setTimeout(()=>Nt.focus())}},[E,R,me]);Ni(()=>{ae.current.eventSource==="keyboard"&&(T==null||T(ae.current.value))},[ie,T]);const Te=Ee=>{const at=_e(Ee)||0,Ye=ae.current.value.map(bn=>Math.abs(bn-at)),rt=Math.min(...Ye);let Nt=Ye.indexOf(rt);const dr=Ye.filter(bn=>bn===rt);dr.length>1&&at>ae.current.value[Nt]&&(Nt=Nt+dr.length-1),U(Nt),Ue.setValueAtIndex(Nt,at),be(Nt)},It=Ee=>{if(R==-1)return;const at=_e(Ee)||0;U(R),Ue.setValueAtIndex(R,at),be(R)};ME(ge,{onPanSessionStart(Ee){V&&(H(!0),Te(Ee),M==null||M(ae.current.value))},onPanSessionEnd(){V&&(H(!1),T==null||T(ae.current.value))},onPan(Ee){V&&It(Ee)}});const Ft=f.useCallback((Ee={},at=null)=>({...Ee,...O,id:me.root,ref:Wn(at,ge),tabIndex:-1,"aria-disabled":Wm(h),"data-focused":nl(G),style:{...Ee.style,...Pn}}),[O,h,G,Pn,me]),Wt=f.useCallback((Ee={},at=null)=>({...Ee,ref:Wn(at,ne),id:me.track,"data-disabled":nl(h),style:{...Ee.style,...Pt}}),[h,Pt,me]),Cn=f.useCallback((Ee={},at=null)=>({...Ee,ref:at,id:me.innerTrack,style:{...Ee.style,...yt}}),[yt,me]),En=f.useCallback((Ee,at=null)=>{var Ye;const{index:rt,...Nt}=Ee,dr=ie[rt];if(dr==null)throw new TypeError(`[range-slider > thumb] Cannot find value at index \`${rt}\`. The \`value\` or \`defaultValue\` length is : ${ie.length}`);const yn=he[rt];return{...Nt,ref:at,role:"slider",tabIndex:V?0:void 0,id:me.getThumb(rt),"data-active":nl(B&&R===rt),"aria-valuetext":(Ye=A==null?void 0:A(dr))!=null?Ye:C==null?void 0:C[rt],"aria-valuemin":yn.min,"aria-valuemax":yn.max,"aria-valuenow":dr,"aria-orientation":d,"aria-disabled":Wm(h),"aria-readonly":Wm(g),"aria-label":_==null?void 0:_[rt],"aria-labelledby":_!=null&&_[rt]||k==null?void 0:k[rt],style:{...Ee.style,...gt(rt)},onKeyDown:Vm(Ee.onKeyDown,kt),onFocus:Vm(Ee.onFocus,()=>{K(!0),U(rt)}),onBlur:Vm(Ee.onBlur,()=>{K(!1),U(-1)})}},[me,ie,he,V,B,R,A,C,d,h,g,_,k,gt,kt,K]),ln=f.useCallback((Ee={},at=null)=>({...Ee,ref:at,id:me.output,htmlFor:ie.map((Ye,rt)=>me.getThumb(rt)).join(" "),"aria-live":"off"}),[me,ie]),wr=f.useCallback((Ee,at=null)=>{const{value:Ye,...rt}=Ee,Nt=!(Yen),dr=Ye>=ie[0]&&Ye<=ie[ie.length-1];let yn=Fb(Ye,t,n);yn=z?100-yn:yn;const bn={position:"absolute",pointerEvents:"none",...RE({orientation:d,vertical:{bottom:`${yn}%`},horizontal:{left:`${yn}%`}})};return{...rt,ref:at,id:me.getMarker(Ee.value),role:"presentation","aria-hidden":!0,"data-disabled":nl(h),"data-invalid":nl(!Nt),"data-highlighted":nl(dr),style:{...Ee.style,...bn}}},[h,z,n,t,d,ie,me]),vn=f.useCallback((Ee,at=null)=>{const{index:Ye,...rt}=Ee;return{...rt,ref:at,id:me.getInput(Ye),type:"hidden",value:ie[Ye],name:Array.isArray(j)?j[Ye]:`${j}-${Ye}`}},[j,ie,me]);return{state:{value:ie,isFocused:G,isDragging:B,getThumbPercent:Ee=>re[Ee],getThumbMinValue:Ee=>he[Ee].min,getThumbMaxValue:Ee=>he[Ee].max},actions:Ue,getRootProps:Ft,getTrackProps:Wt,getInnerTrackProps:Cn,getThumbProps:En,getMarkerProps:wr,getInputProps:vn,getOutputProps:ln}}function BT(e,t,n,r){return e.map((o,s)=>{const i=s===0?t:e[s-1]+r,u=s===e.length-1?n:e[s+1]-r;return{min:i,max:u}})}var[FT,rh]=cr({name:"SliderContext",errorMessage:"useSliderContext: `context` is undefined. Seems you forgot to wrap all slider components within "}),[HT,oh]=cr({name:"RangeSliderStylesContext",errorMessage:`useRangeSliderStyles returned is 'undefined'. Seems you forgot to wrap the components in "" `}),n5=tt(function(t,n){const r={orientation:"horizontal",...t},o=lo("Slider",r),s=xr(r),{direction:i}=Gp();s.direction=i;const{getRootProps:u,...d}=LT(s),p=f.useMemo(()=>({...d,name:r.name}),[d,r.name]);return a.jsx(FT,{value:p,children:a.jsx(HT,{value:o,children:a.jsx(He.div,{...u({},n),className:"chakra-slider",__css:o.container,children:r.children})})})});n5.displayName="RangeSlider";var d0=tt(function(t,n){const{getThumbProps:r,getInputProps:o,name:s}=rh(),i=oh(),u=r(t,n);return a.jsxs(He.div,{...u,className:rv("chakra-slider__thumb",t.className),__css:i.thumb,children:[u.children,s&&a.jsx("input",{...o({index:t.index})})]})});d0.displayName="RangeSliderThumb";var r5=tt(function(t,n){const{getTrackProps:r}=rh(),o=oh(),s=r(t,n);return a.jsx(He.div,{...s,className:rv("chakra-slider__track",t.className),__css:o.track,"data-testid":"chakra-range-slider-track"})});r5.displayName="RangeSliderTrack";var o5=tt(function(t,n){const{getInnerTrackProps:r}=rh(),o=oh(),s=r(t,n);return a.jsx(He.div,{...s,className:"chakra-slider__filled-track",__css:o.filledTrack})});o5.displayName="RangeSliderFilledTrack";var vf=tt(function(t,n){const{getMarkerProps:r}=rh(),o=oh(),s=r(t,n);return a.jsx(He.div,{...s,className:rv("chakra-slider__marker",t.className),__css:o.mark})});vf.displayName="RangeSliderMark";var Hv=tt(function(t,n){const r=lo("Switch",t),{spacing:o="0.5rem",children:s,...i}=xr(t),{state:u,getInputProps:d,getCheckboxProps:p,getRootProps:h,getLabelProps:g}=R3(i),v=f.useMemo(()=>({display:"inline-block",position:"relative",verticalAlign:"middle",lineHeight:0,...r.container}),[r.container]),b=f.useMemo(()=>({display:"inline-flex",flexShrink:0,justifyContent:"flex-start",boxSizing:"content-box",cursor:"pointer",...r.track}),[r.track]),S=f.useMemo(()=>({userSelect:"none",marginStart:o,...r.label}),[o,r.label]);return a.jsxs(He.label,{...h(),className:Ot("chakra-switch",t.className),__css:v,children:[a.jsx("input",{className:"chakra-switch__input",...d({},n)}),a.jsx(He.span,{...p(),className:"chakra-switch__track",__css:b,children:a.jsx(He.span,{__css:r.thumb,className:"chakra-switch__thumb","data-checked":sn(u.isChecked),"data-hover":sn(u.isHovered)})}),s&&a.jsx(He.span,{className:"chakra-switch__label",...g(),__css:S,children:s})]})});Hv.displayName="Switch";var[WT,VT,UT,GT]=yv();function qT(e){var t;const{defaultIndex:n,onChange:r,index:o,isManual:s,isLazy:i,lazyBehavior:u="unmount",orientation:d="horizontal",direction:p="ltr",...h}=e,[g,v]=f.useState(n??0),[b,S]=mu({defaultValue:n??0,value:o,onChange:r});f.useEffect(()=>{o!=null&&v(o)},[o]);const w=UT(),C=f.useId();return{id:`tabs-${(t=e.id)!=null?t:C}`,selectedIndex:b,focusedIndex:g,setSelectedIndex:S,setFocusedIndex:v,isManual:s,isLazy:i,lazyBehavior:u,orientation:d,descendants:w,direction:p,htmlProps:h}}var[KT,sh]=cr({name:"TabsContext",errorMessage:"useTabsContext: `context` is undefined. Seems you forgot to wrap all tabs components within "});function YT(e){const{focusedIndex:t,orientation:n,direction:r}=sh(),o=VT(),s=f.useCallback(i=>{const u=()=>{var k;const j=o.nextEnabled(t);j&&((k=j.node)==null||k.focus())},d=()=>{var k;const j=o.prevEnabled(t);j&&((k=j.node)==null||k.focus())},p=()=>{var k;const j=o.firstEnabled();j&&((k=j.node)==null||k.focus())},h=()=>{var k;const j=o.lastEnabled();j&&((k=j.node)==null||k.focus())},g=n==="horizontal",v=n==="vertical",b=i.key,S=r==="ltr"?"ArrowLeft":"ArrowRight",w=r==="ltr"?"ArrowRight":"ArrowLeft",_={[S]:()=>g&&d(),[w]:()=>g&&u(),ArrowDown:()=>v&&u(),ArrowUp:()=>v&&d(),Home:p,End:h}[b];_&&(i.preventDefault(),_(i))},[o,t,n,r]);return{...e,role:"tablist","aria-orientation":n,onKeyDown:mt(e.onKeyDown,s)}}function QT(e){const{isDisabled:t,isFocusable:n,...r}=e,{setSelectedIndex:o,isManual:s,id:i,setFocusedIndex:u,selectedIndex:d}=sh(),{index:p,register:h}=GT({disabled:t&&!n}),g=p===d,v=()=>{o(p)},b=()=>{u(p),!s&&!(t&&n)&&o(p)},S=E6({...r,ref:Wn(h,e.ref),isDisabled:t,isFocusable:n,onClick:mt(e.onClick,v)}),w="button";return{...S,id:s5(i,p),role:"tab",tabIndex:g?0:-1,type:w,"aria-selected":g,"aria-controls":a5(i,p),onFocus:t?void 0:mt(e.onFocus,b)}}var[XT,JT]=cr({});function ZT(e){const t=sh(),{id:n,selectedIndex:r}=t,s=Up(e.children).map((i,u)=>f.createElement(XT,{key:u,value:{isSelected:u===r,id:a5(n,u),tabId:s5(n,u),selectedIndex:r}},i));return{...e,children:s}}function eA(e){const{children:t,...n}=e,{isLazy:r,lazyBehavior:o}=sh(),{isSelected:s,id:i,tabId:u}=JT(),d=f.useRef(!1);s&&(d.current=!0);const p=Tv({wasSelected:d.current,isSelected:s,enabled:r,mode:o});return{tabIndex:0,...n,children:p?t:null,role:"tabpanel","aria-labelledby":u,hidden:!s,id:i}}function s5(e,t){return`${e}--tab-${t}`}function a5(e,t){return`${e}--tabpanel-${t}`}var[tA,ah]=cr({name:"TabsStylesContext",errorMessage:`useTabsStyles returned is 'undefined'. Seems you forgot to wrap the components in "" `}),ih=tt(function(t,n){const r=lo("Tabs",t),{children:o,className:s,...i}=xr(t),{htmlProps:u,descendants:d,...p}=qT(i),h=f.useMemo(()=>p,[p]),{isFitted:g,...v}=u;return a.jsx(WT,{value:d,children:a.jsx(KT,{value:h,children:a.jsx(tA,{value:r,children:a.jsx(He.div,{className:Ot("chakra-tabs",s),ref:n,...v,__css:r.root,children:o})})})})});ih.displayName="Tabs";var lh=tt(function(t,n){const r=YT({...t,ref:n}),s={display:"flex",...ah().tablist};return a.jsx(He.div,{...r,className:Ot("chakra-tabs__tablist",t.className),__css:s})});lh.displayName="TabList";var ch=tt(function(t,n){const r=eA({...t,ref:n}),o=ah();return a.jsx(He.div,{outline:"0",...r,className:Ot("chakra-tabs__tab-panel",t.className),__css:o.tabpanel})});ch.displayName="TabPanel";var uh=tt(function(t,n){const r=ZT(t),o=ah();return a.jsx(He.div,{...r,width:"100%",ref:n,className:Ot("chakra-tabs__tab-panels",t.className),__css:o.tabpanels})});uh.displayName="TabPanels";var dh=tt(function(t,n){const r=ah(),o=QT({...t,ref:n}),s={outline:"0",display:"flex",alignItems:"center",justifyContent:"center",...r.tab};return a.jsx(He.button,{...o,className:Ot("chakra-tabs__tab",t.className),__css:s})});dh.displayName="Tab";function nA(e,t=[]){const n=Object.assign({},e);for(const r of t)r in n&&delete n[r];return n}var rA=["h","minH","height","minHeight"],i5=tt((e,t)=>{const n=Kl("Textarea",e),{className:r,rows:o,...s}=xr(e),i=nv(s),u=o?nA(n,rA):n;return a.jsx(He.textarea,{ref:t,rows:o,...i,className:Ot("chakra-textarea",r),__css:u})});i5.displayName="Textarea";const l5=({id:e,x:t,y:n,width:r,height:o,style:s,color:i,strokeColor:u,strokeWidth:d,className:p,borderRadius:h,shapeRendering:g,onClick:v})=>{const{background:b,backgroundColor:S}=s||{},w=i||b||S;return a.jsx("rect",{className:qp(["react-flow__minimap-node",p]),x:t,y:n,rx:h,ry:h,width:r,height:o,fill:w,stroke:u,strokeWidth:d,shapeRendering:g,onClick:v?C=>v(C,e):void 0})};l5.displayName="MiniMapNode";var oA=f.memo(l5);const sA=e=>e.nodeOrigin,aA=e=>e.getNodes().filter(t=>!t.hidden&&t.width&&t.height),lg=e=>e instanceof Function?e:()=>e;function iA({nodeStrokeColor:e="transparent",nodeColor:t="#e2e2e2",nodeClassName:n="",nodeBorderRadius:r=5,nodeStrokeWidth:o=2,nodeComponent:s=oA,onClick:i}){const u=wf(aA,ov),d=wf(sA),p=lg(t),h=lg(e),g=lg(n),v=typeof window>"u"||window.chrome?"crispEdges":"geometricPrecision";return a.jsx(a.Fragment,{children:u.map(b=>{const{x:S,y:w}=AE(b,d).positionAbsolute;return a.jsx(s,{x:S,y:w,width:b.width,height:b.height,style:b.style,className:g(b),color:p(b),borderRadius:r,strokeColor:h(b),strokeWidth:o,shapeRendering:v,onClick:i,id:b.id},b.id)})})}var lA=f.memo(iA);const cA=200,uA=150,dA=e=>{const t=e.getNodes(),n={x:-e.transform[0]/e.transform[2],y:-e.transform[1]/e.transform[2],width:e.width/e.transform[2],height:e.height/e.transform[2]};return{viewBB:n,boundingRect:t.length>0?LE(BE(t,e.nodeOrigin),n):n,rfId:e.rfId}},fA="react-flow__minimap-desc";function c5({style:e,className:t,nodeStrokeColor:n="transparent",nodeColor:r="#e2e2e2",nodeClassName:o="",nodeBorderRadius:s=5,nodeStrokeWidth:i=2,nodeComponent:u,maskColor:d="rgb(240, 240, 240, 0.6)",maskStrokeColor:p="none",maskStrokeWidth:h=1,position:g="bottom-right",onClick:v,onNodeClick:b,pannable:S=!1,zoomable:w=!1,ariaLabel:C="React Flow mini map",inversePan:_=!1,zoomStep:k=10}){const j=y4(),E=f.useRef(null),{boundingRect:I,viewBB:O,rfId:M}=wf(dA,ov),T=(e==null?void 0:e.width)??cA,A=(e==null?void 0:e.height)??uA,z=I.width/T,$=I.height/A,ee=Math.max(z,$),B=ee*T,H=ee*A,G=5*ee,K=I.x-(B-I.width)/2-G,R=I.y-(H-I.height)/2-G,U=B+G*2,V=H+G*2,J=`${fA}-${M}`,ie=f.useRef(0);ie.current=ee,f.useEffect(()=>{if(E.current){const ae=b4(E.current),Z=pe=>{const{transform:ne,d3Selection:ge,d3Zoom:ue}=j.getState();if(pe.sourceEvent.type!=="wheel"||!ge||!ue)return;const Ce=-pe.sourceEvent.deltaY*(pe.sourceEvent.deltaMode===1?.05:pe.sourceEvent.deltaMode?1:.002)*k,Re=ne[2]*Math.pow(2,Ce);ue.scaleTo(ge,Re)},W=pe=>{const{transform:ne,d3Selection:ge,d3Zoom:ue,translateExtent:Ce,width:Re,height:me}=j.getState();if(pe.sourceEvent.type!=="mousemove"||!ge||!ue)return;const _e=ie.current*Math.max(1,ne[2])*(_?-1:1),We={x:ne[0]-pe.sourceEvent.movementX*_e,y:ne[1]-pe.sourceEvent.movementY*_e},Le=[[0,0],[Re,me]],Ue=$E.translate(We.x,We.y).scale(ne[2]),kt=ue.constrain()(Ue,Le,Ce);ue.transform(ge,kt)},re=NE().on("zoom",S?W:null).on("zoom.wheel",w?Z:null);return ae.call(re),()=>{ae.on("zoom",null)}}},[S,w,_,k]);const xe=v?ae=>{const Z=zE(ae);v(ae,{x:Z[0],y:Z[1]})}:void 0,he=b?(ae,Z)=>{const W=j.getState().nodeInternals.get(Z);b(ae,W)}:void 0;return a.jsx(yu,{position:g,style:e,className:qp(["react-flow__minimap",t]),"data-testid":"rf__minimap",children:a.jsxs("svg",{width:T,height:A,viewBox:`${K} ${R} ${U} ${V}`,role:"img","aria-labelledby":J,ref:E,onClick:xe,children:[C&&a.jsx("title",{id:J,children:C}),a.jsx(lA,{onClick:he,nodeColor:r,nodeStrokeColor:n,nodeBorderRadius:s,nodeClassName:o,nodeStrokeWidth:i,nodeComponent:u}),a.jsx("path",{className:"react-flow__minimap-mask",d:`M${K-G},${R-G}h${U+G*2}v${V+G*2}h${-U-G*2}z + M${O.x},${O.y}h${O.width}v${O.height}h${-O.width}z`,fill:d,fillRule:"evenodd",stroke:p,strokeWidth:h,pointerEvents:"none"})]})})}c5.displayName="MiniMap";var pA=f.memo(c5),ds;(function(e){e.Lines="lines",e.Dots="dots",e.Cross="cross"})(ds||(ds={}));function hA({color:e,dimensions:t,lineWidth:n}){return a.jsx("path",{stroke:e,strokeWidth:n,d:`M${t[0]/2} 0 V${t[1]} M0 ${t[1]/2} H${t[0]}`})}function mA({color:e,radius:t}){return a.jsx("circle",{cx:t,cy:t,r:t,fill:e})}const gA={[ds.Dots]:"#91919a",[ds.Lines]:"#eee",[ds.Cross]:"#e2e2e2"},vA={[ds.Dots]:1,[ds.Lines]:1,[ds.Cross]:6},yA=e=>({transform:e.transform,patternId:`pattern-${e.rfId}`});function u5({id:e,variant:t=ds.Dots,gap:n=20,size:r,lineWidth:o=1,offset:s=2,color:i,style:u,className:d}){const p=f.useRef(null),{transform:h,patternId:g}=wf(yA,ov),v=i||gA[t],b=r||vA[t],S=t===ds.Dots,w=t===ds.Cross,C=Array.isArray(n)?n:[n,n],_=[C[0]*h[2]||1,C[1]*h[2]||1],k=b*h[2],j=w?[k,k]:_,E=S?[k/s,k/s]:[j[0]/s,j[1]/s];return a.jsxs("svg",{className:qp(["react-flow__background",d]),style:{...u,position:"absolute",width:"100%",height:"100%",top:0,left:0},ref:p,"data-testid":"rf__background",children:[a.jsx("pattern",{id:g+e,x:h[0]%_[0],y:h[1]%_[1],width:_[0],height:_[1],patternUnits:"userSpaceOnUse",patternTransform:`translate(-${E[0]},-${E[1]})`,children:S?a.jsx(mA,{color:v,radius:k/s}):a.jsx(hA,{dimensions:j,color:v,lineWidth:o})}),a.jsx("rect",{x:"0",y:"0",width:"100%",height:"100%",fill:`url(#${g+e})`})]})}u5.displayName="Background";var bA=f.memo(u5),Gc;(function(e){e.Line="line",e.Handle="handle"})(Gc||(Gc={}));function xA({width:e,prevWidth:t,height:n,prevHeight:r,invertX:o,invertY:s}){const i=e-t,u=n-r,d=[i>0?1:i<0?-1:0,u>0?1:u<0?-1:0];return i&&o&&(d[0]=d[0]*-1),u&&s&&(d[1]=d[1]*-1),d}const d5={width:0,height:0,x:0,y:0},wA={...d5,pointerX:0,pointerY:0,aspectRatio:1};function SA({nodeId:e,position:t,variant:n=Gc.Handle,className:r,style:o={},children:s,color:i,minWidth:u=10,minHeight:d=10,maxWidth:p=Number.MAX_VALUE,maxHeight:h=Number.MAX_VALUE,keepAspectRatio:g=!1,shouldResize:v,onResizeStart:b,onResize:S,onResizeEnd:w}){const C=FE(),_=typeof e=="string"?e:C,k=y4(),j=f.useRef(null),E=f.useRef(wA),I=f.useRef(d5),O=HE(),M=n===Gc.Line?"right":"bottom-right",T=t??M;f.useEffect(()=>{if(!j.current||!_)return;const ee=b4(j.current),B=T.includes("right")||T.includes("left"),H=T.includes("bottom")||T.includes("top"),G=T.includes("left"),K=T.includes("top"),R=WE().on("start",U=>{const V=k.getState().nodeInternals.get(_),{xSnapped:J,ySnapped:ie}=O(U);I.current={width:(V==null?void 0:V.width)??0,height:(V==null?void 0:V.height)??0,x:(V==null?void 0:V.position.x)??0,y:(V==null?void 0:V.position.y)??0},E.current={...I.current,pointerX:J,pointerY:ie,aspectRatio:I.current.width/I.current.height},b==null||b(U,{...I.current})}).on("drag",U=>{const{nodeInternals:V,triggerNodeChanges:J}=k.getState(),{xSnapped:ie,ySnapped:xe}=O(U),he=V.get(_);if(he){const ae=[],{pointerX:Z,pointerY:W,width:re,height:pe,x:ne,y:ge,aspectRatio:ue}=E.current,{x:Ce,y:Re,width:me,height:_e}=I.current,We=Math.floor(B?ie-Z:0),Le=Math.floor(H?xe-W:0);let Ue=Hb(re+(G?-We:We),u,p),kt=Hb(pe+(K?-Le:Le),d,h);if(g){const Te=Ue/kt,It=B&&H,Ft=B&&!H,Wt=H&&!B;Ue=Te<=ue&&It||Wt?kt*ue:Ue,kt=Te>ue&&It||Ft?Ue/ue:kt,Ue>=p?(Ue=p,kt=p/ue):Ue<=u&&(Ue=u,kt=u/ue),kt>=h?(kt=h,Ue=h*ue):kt<=d&&(kt=d,Ue=d*ue)}const gt=Ue!==me,Pn=kt!==_e;if(G||K){const Te=G?ne-(Ue-re):ne,It=K?ge-(kt-pe):ge,Ft=Te!==Ce&>,Wt=It!==Re&&Pn;if(Ft||Wt){const Cn={id:he.id,type:"position",position:{x:Ft?Te:Ce,y:Wt?It:Re}};ae.push(Cn),I.current.x=Cn.position.x,I.current.y=Cn.position.y}}if(gt||Pn){const Te={id:_,type:"dimensions",updateStyle:!0,resizing:!0,dimensions:{width:Ue,height:kt}};ae.push(Te),I.current.width=Ue,I.current.height=kt}if(ae.length===0)return;const Pt=xA({width:I.current.width,prevWidth:me,height:I.current.height,prevHeight:_e,invertX:G,invertY:K}),yt={...I.current,direction:Pt};if((v==null?void 0:v(U,yt))===!1)return;S==null||S(U,yt),J(ae)}}).on("end",U=>{const V={id:_,type:"dimensions",resizing:!1};w==null||w(U,{...I.current}),k.getState().triggerNodeChanges([V])});return ee.call(R),()=>{ee.on(".drag",null)}},[_,T,u,d,p,h,g,O,b,S,w]);const A=T.split("-"),z=n===Gc.Line?"borderColor":"backgroundColor",$=i?{...o,[z]:i}:o;return a.jsx("div",{className:qp(["react-flow__resize-control","nodrag",...A,n,r]),ref:j,style:$,children:s})}var CA=f.memo(SA);let Jx=()=>{};const fh=()=>({setOpenUploaderFunction:f.useCallback(t=>{t&&(Jx=t)},[]),openUploader:Jx});var _A=new Map([["aac","audio/aac"],["abw","application/x-abiword"],["arc","application/x-freearc"],["avif","image/avif"],["avi","video/x-msvideo"],["azw","application/vnd.amazon.ebook"],["bin","application/octet-stream"],["bmp","image/bmp"],["bz","application/x-bzip"],["bz2","application/x-bzip2"],["cda","application/x-cdf"],["csh","application/x-csh"],["css","text/css"],["csv","text/csv"],["doc","application/msword"],["docx","application/vnd.openxmlformats-officedocument.wordprocessingml.document"],["eot","application/vnd.ms-fontobject"],["epub","application/epub+zip"],["gz","application/gzip"],["gif","image/gif"],["heic","image/heic"],["heif","image/heif"],["htm","text/html"],["html","text/html"],["ico","image/vnd.microsoft.icon"],["ics","text/calendar"],["jar","application/java-archive"],["jpeg","image/jpeg"],["jpg","image/jpeg"],["js","text/javascript"],["json","application/json"],["jsonld","application/ld+json"],["mid","audio/midi"],["midi","audio/midi"],["mjs","text/javascript"],["mp3","audio/mpeg"],["mp4","video/mp4"],["mpeg","video/mpeg"],["mpkg","application/vnd.apple.installer+xml"],["odp","application/vnd.oasis.opendocument.presentation"],["ods","application/vnd.oasis.opendocument.spreadsheet"],["odt","application/vnd.oasis.opendocument.text"],["oga","audio/ogg"],["ogv","video/ogg"],["ogx","application/ogg"],["opus","audio/opus"],["otf","font/otf"],["png","image/png"],["pdf","application/pdf"],["php","application/x-httpd-php"],["ppt","application/vnd.ms-powerpoint"],["pptx","application/vnd.openxmlformats-officedocument.presentationml.presentation"],["rar","application/vnd.rar"],["rtf","application/rtf"],["sh","application/x-sh"],["svg","image/svg+xml"],["swf","application/x-shockwave-flash"],["tar","application/x-tar"],["tif","image/tiff"],["tiff","image/tiff"],["ts","video/mp2t"],["ttf","font/ttf"],["txt","text/plain"],["vsd","application/vnd.visio"],["wav","audio/wav"],["weba","audio/webm"],["webm","video/webm"],["webp","image/webp"],["woff","font/woff"],["woff2","font/woff2"],["xhtml","application/xhtml+xml"],["xls","application/vnd.ms-excel"],["xlsx","application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"],["xml","application/xml"],["xul","application/vnd.mozilla.xul+xml"],["zip","application/zip"],["7z","application/x-7z-compressed"],["mkv","video/x-matroska"],["mov","video/quicktime"],["msg","application/vnd.ms-outlook"]]);function Du(e,t){var n=kA(e);if(typeof n.path!="string"){var r=e.webkitRelativePath;Object.defineProperty(n,"path",{value:typeof t=="string"?t:typeof r=="string"&&r.length>0?r:e.name,writable:!1,configurable:!1,enumerable:!0})}return n}function kA(e){var t=e.name,n=t&&t.lastIndexOf(".")!==-1;if(n&&!e.type){var r=t.split(".").pop().toLowerCase(),o=_A.get(r);o&&Object.defineProperty(e,"type",{value:o,writable:!1,configurable:!1,enumerable:!0})}return e}var PA=[".DS_Store","Thumbs.db"];function jA(e){return Zl(this,void 0,void 0,function(){return ec(this,function(t){return Lf(e)&&IA(e.dataTransfer)?[2,RA(e.dataTransfer,e.type)]:EA(e)?[2,OA(e)]:Array.isArray(e)&&e.every(function(n){return"getFile"in n&&typeof n.getFile=="function"})?[2,MA(e)]:[2,[]]})})}function IA(e){return Lf(e)}function EA(e){return Lf(e)&&Lf(e.target)}function Lf(e){return typeof e=="object"&&e!==null}function OA(e){return f0(e.target.files).map(function(t){return Du(t)})}function MA(e){return Zl(this,void 0,void 0,function(){var t;return ec(this,function(n){switch(n.label){case 0:return[4,Promise.all(e.map(function(r){return r.getFile()}))];case 1:return t=n.sent(),[2,t.map(function(r){return Du(r)})]}})})}function RA(e,t){return Zl(this,void 0,void 0,function(){var n,r;return ec(this,function(o){switch(o.label){case 0:return e.items?(n=f0(e.items).filter(function(s){return s.kind==="file"}),t!=="drop"?[2,n]:[4,Promise.all(n.map(DA))]):[3,2];case 1:return r=o.sent(),[2,Zx(f5(r))];case 2:return[2,Zx(f0(e.files).map(function(s){return Du(s)}))]}})})}function Zx(e){return e.filter(function(t){return PA.indexOf(t.name)===-1})}function f0(e){if(e===null)return[];for(var t=[],n=0;ne.length)&&(t=e.length);for(var n=0,r=new Array(t);nn)return[!1,o2(n)];if(e.sizen)return[!1,o2(n)]}return[!0,null]}function vi(e){return e!=null}function YA(e){var t=e.files,n=e.accept,r=e.minSize,o=e.maxSize,s=e.multiple,i=e.maxFiles,u=e.validator;return!s&&t.length>1||s&&i>=1&&t.length>i?!1:t.every(function(d){var p=g5(d,n),h=au(p,1),g=h[0],v=v5(d,r,o),b=au(v,1),S=b[0],w=u?u(d):null;return g&&S&&!w})}function Bf(e){return typeof e.isPropagationStopped=="function"?e.isPropagationStopped():typeof e.cancelBubble<"u"?e.cancelBubble:!1}function Rd(e){return e.dataTransfer?Array.prototype.some.call(e.dataTransfer.types,function(t){return t==="Files"||t==="application/x-moz-file"}):!!e.target&&!!e.target.files}function a2(e){e.preventDefault()}function QA(e){return e.indexOf("MSIE")!==-1||e.indexOf("Trident/")!==-1}function XA(e){return e.indexOf("Edge/")!==-1}function JA(){var e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:window.navigator.userAgent;return QA(e)||XA(e)}function As(){for(var e=arguments.length,t=new Array(e),n=0;n1?o-1:0),i=1;ie.length)&&(t=e.length);for(var n=0,r=new Array(t);n=0)&&Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}function mN(e,t){if(e==null)return{};var n={},r=Object.keys(e),o,s;for(s=0;s=0)&&(n[o]=e[o]);return n}var Wv=f.forwardRef(function(e,t){var n=e.children,r=Ff(e,oN),o=Vv(r),s=o.open,i=Ff(o,sN);return f.useImperativeHandle(t,function(){return{open:s}},[s]),N.createElement(f.Fragment,null,n(er(er({},i),{},{open:s})))});Wv.displayName="Dropzone";var w5={disabled:!1,getFilesFromEvent:jA,maxSize:1/0,minSize:0,multiple:!0,maxFiles:0,preventDropOnDocument:!0,noClick:!1,noKeyboard:!1,noDrag:!1,noDragEventsBubbling:!1,validator:null,useFsAccessApi:!0,autoFocus:!1};Wv.defaultProps=w5;Wv.propTypes={children:Tn.func,accept:Tn.objectOf(Tn.arrayOf(Tn.string)),multiple:Tn.bool,preventDropOnDocument:Tn.bool,noClick:Tn.bool,noKeyboard:Tn.bool,noDrag:Tn.bool,noDragEventsBubbling:Tn.bool,minSize:Tn.number,maxSize:Tn.number,maxFiles:Tn.number,disabled:Tn.bool,getFilesFromEvent:Tn.func,onFileDialogCancel:Tn.func,onFileDialogOpen:Tn.func,useFsAccessApi:Tn.bool,autoFocus:Tn.bool,onDragEnter:Tn.func,onDragLeave:Tn.func,onDragOver:Tn.func,onDrop:Tn.func,onDropAccepted:Tn.func,onDropRejected:Tn.func,onError:Tn.func,validator:Tn.func};var g0={isFocused:!1,isFileDialogActive:!1,isDragActive:!1,isDragAccept:!1,isDragReject:!1,acceptedFiles:[],fileRejections:[]};function Vv(){var e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},t=er(er({},w5),e),n=t.accept,r=t.disabled,o=t.getFilesFromEvent,s=t.maxSize,i=t.minSize,u=t.multiple,d=t.maxFiles,p=t.onDragEnter,h=t.onDragLeave,g=t.onDragOver,v=t.onDrop,b=t.onDropAccepted,S=t.onDropRejected,w=t.onFileDialogCancel,C=t.onFileDialogOpen,_=t.useFsAccessApi,k=t.autoFocus,j=t.preventDropOnDocument,E=t.noClick,I=t.noKeyboard,O=t.noDrag,M=t.noDragEventsBubbling,T=t.onError,A=t.validator,z=f.useMemo(function(){return tN(n)},[n]),$=f.useMemo(function(){return eN(n)},[n]),ee=f.useMemo(function(){return typeof C=="function"?C:l2},[C]),B=f.useMemo(function(){return typeof w=="function"?w:l2},[w]),H=f.useRef(null),G=f.useRef(null),K=f.useReducer(gN,g0),R=cg(K,2),U=R[0],V=R[1],J=U.isFocused,ie=U.isFileDialogActive,xe=f.useRef(typeof window<"u"&&window.isSecureContext&&_&&ZA()),he=function(){!xe.current&&ie&&setTimeout(function(){if(G.current){var Te=G.current.files;Te.length||(V({type:"closeDialog"}),B())}},300)};f.useEffect(function(){return window.addEventListener("focus",he,!1),function(){window.removeEventListener("focus",he,!1)}},[G,ie,B,xe]);var ae=f.useRef([]),Z=function(Te){H.current&&H.current.contains(Te.target)||(Te.preventDefault(),ae.current=[])};f.useEffect(function(){return j&&(document.addEventListener("dragover",a2,!1),document.addEventListener("drop",Z,!1)),function(){j&&(document.removeEventListener("dragover",a2),document.removeEventListener("drop",Z))}},[H,j]),f.useEffect(function(){return!r&&k&&H.current&&H.current.focus(),function(){}},[H,k,r]);var W=f.useCallback(function(be){T?T(be):console.error(be)},[T]),re=f.useCallback(function(be){be.preventDefault(),be.persist(),gt(be),ae.current=[].concat(lN(ae.current),[be.target]),Rd(be)&&Promise.resolve(o(be)).then(function(Te){if(!(Bf(be)&&!M)){var It=Te.length,Ft=It>0&&YA({files:Te,accept:z,minSize:i,maxSize:s,multiple:u,maxFiles:d,validator:A}),Wt=It>0&&!Ft;V({isDragAccept:Ft,isDragReject:Wt,isDragActive:!0,type:"setDraggedFiles"}),p&&p(be)}}).catch(function(Te){return W(Te)})},[o,p,W,M,z,i,s,u,d,A]),pe=f.useCallback(function(be){be.preventDefault(),be.persist(),gt(be);var Te=Rd(be);if(Te&&be.dataTransfer)try{be.dataTransfer.dropEffect="copy"}catch{}return Te&&g&&g(be),!1},[g,M]),ne=f.useCallback(function(be){be.preventDefault(),be.persist(),gt(be);var Te=ae.current.filter(function(Ft){return H.current&&H.current.contains(Ft)}),It=Te.indexOf(be.target);It!==-1&&Te.splice(It,1),ae.current=Te,!(Te.length>0)&&(V({type:"setDraggedFiles",isDragActive:!1,isDragAccept:!1,isDragReject:!1}),Rd(be)&&h&&h(be))},[H,h,M]),ge=f.useCallback(function(be,Te){var It=[],Ft=[];be.forEach(function(Wt){var Cn=g5(Wt,z),En=cg(Cn,2),ln=En[0],wr=En[1],vn=v5(Wt,i,s),sr=cg(vn,2),Ee=sr[0],at=sr[1],Ye=A?A(Wt):null;if(ln&&Ee&&!Ye)It.push(Wt);else{var rt=[wr,at];Ye&&(rt=rt.concat(Ye)),Ft.push({file:Wt,errors:rt.filter(function(Nt){return Nt})})}}),(!u&&It.length>1||u&&d>=1&&It.length>d)&&(It.forEach(function(Wt){Ft.push({file:Wt,errors:[KA]})}),It.splice(0)),V({acceptedFiles:It,fileRejections:Ft,type:"setFiles"}),v&&v(It,Ft,Te),Ft.length>0&&S&&S(Ft,Te),It.length>0&&b&&b(It,Te)},[V,u,z,i,s,d,v,b,S,A]),ue=f.useCallback(function(be){be.preventDefault(),be.persist(),gt(be),ae.current=[],Rd(be)&&Promise.resolve(o(be)).then(function(Te){Bf(be)&&!M||ge(Te,be)}).catch(function(Te){return W(Te)}),V({type:"reset"})},[o,ge,W,M]),Ce=f.useCallback(function(){if(xe.current){V({type:"openDialog"}),ee();var be={multiple:u,types:$};window.showOpenFilePicker(be).then(function(Te){return o(Te)}).then(function(Te){ge(Te,null),V({type:"closeDialog"})}).catch(function(Te){nN(Te)?(B(Te),V({type:"closeDialog"})):rN(Te)?(xe.current=!1,G.current?(G.current.value=null,G.current.click()):W(new Error("Cannot open the file picker because the https://developer.mozilla.org/en-US/docs/Web/API/File_System_Access_API is not supported and no was provided."))):W(Te)});return}G.current&&(V({type:"openDialog"}),ee(),G.current.value=null,G.current.click())},[V,ee,B,_,ge,W,$,u]),Re=f.useCallback(function(be){!H.current||!H.current.isEqualNode(be.target)||(be.key===" "||be.key==="Enter"||be.keyCode===32||be.keyCode===13)&&(be.preventDefault(),Ce())},[H,Ce]),me=f.useCallback(function(){V({type:"focus"})},[]),_e=f.useCallback(function(){V({type:"blur"})},[]),We=f.useCallback(function(){E||(JA()?setTimeout(Ce,0):Ce())},[E,Ce]),Le=function(Te){return r?null:Te},Ue=function(Te){return I?null:Le(Te)},kt=function(Te){return O?null:Le(Te)},gt=function(Te){M&&Te.stopPropagation()},Pn=f.useMemo(function(){return function(){var be=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},Te=be.refKey,It=Te===void 0?"ref":Te,Ft=be.role,Wt=be.onKeyDown,Cn=be.onFocus,En=be.onBlur,ln=be.onClick,wr=be.onDragEnter,vn=be.onDragOver,sr=be.onDragLeave,Ee=be.onDrop,at=Ff(be,aN);return er(er(m0({onKeyDown:Ue(As(Wt,Re)),onFocus:Ue(As(Cn,me)),onBlur:Ue(As(En,_e)),onClick:Le(As(ln,We)),onDragEnter:kt(As(wr,re)),onDragOver:kt(As(vn,pe)),onDragLeave:kt(As(sr,ne)),onDrop:kt(As(Ee,ue)),role:typeof Ft=="string"&&Ft!==""?Ft:"presentation"},It,H),!r&&!I?{tabIndex:0}:{}),at)}},[H,Re,me,_e,We,re,pe,ne,ue,I,O,r]),Pt=f.useCallback(function(be){be.stopPropagation()},[]),yt=f.useMemo(function(){return function(){var be=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},Te=be.refKey,It=Te===void 0?"ref":Te,Ft=be.onChange,Wt=be.onClick,Cn=Ff(be,iN),En=m0({accept:z,multiple:u,type:"file",style:{display:"none"},onChange:Le(As(Ft,ue)),onClick:Le(As(Wt,Pt)),tabIndex:-1},It,G);return er(er({},En),Cn)}},[G,n,u,ue,r]);return er(er({},U),{},{isFocused:J&&!r,getRootProps:Pn,getInputProps:yt,rootRef:H,inputRef:G,open:Le(Ce)})}function gN(e,t){switch(t.type){case"focus":return er(er({},e),{},{isFocused:!0});case"blur":return er(er({},e),{},{isFocused:!1});case"openDialog":return er(er({},g0),{},{isFileDialogActive:!0});case"closeDialog":return er(er({},e),{},{isFileDialogActive:!1});case"setDraggedFiles":return er(er({},e),{},{isDragActive:t.isDragActive,isDragAccept:t.isDragAccept,isDragReject:t.isDragReject});case"setFiles":return er(er({},e),{},{acceptedFiles:t.acceptedFiles,fileRejections:t.fileRejections});case"reset":return er({},g0);default:return e}}function l2(){}function v0(){return v0=Object.assign?Object.assign.bind():function(e){for(var t=1;t'),!0):t?e.some(function(n){return t.includes(n)})||e.includes("*"):!0}var CN=function(t,n,r){r===void 0&&(r=!1);var o=n.alt,s=n.meta,i=n.mod,u=n.shift,d=n.ctrl,p=n.keys,h=t.key,g=t.code,v=t.ctrlKey,b=t.metaKey,S=t.shiftKey,w=t.altKey,C=Ha(g),_=h.toLowerCase();if(!r){if(o===!w&&_!=="alt"||u===!S&&_!=="shift")return!1;if(i){if(!b&&!v)return!1}else if(s===!b&&_!=="meta"&&_!=="os"||d===!v&&_!=="ctrl"&&_!=="control")return!1}return p&&p.length===1&&(p.includes(_)||p.includes(C))?!0:p?C5(p):!p},_N=f.createContext(void 0),kN=function(){return f.useContext(_N)};function j5(e,t){return e&&t&&typeof e=="object"&&typeof t=="object"?Object.keys(e).length===Object.keys(t).length&&Object.keys(e).reduce(function(n,r){return n&&j5(e[r],t[r])},!0):e===t}var PN=f.createContext({hotkeys:[],enabledScopes:[],toggleScope:function(){},enableScope:function(){},disableScope:function(){}}),jN=function(){return f.useContext(PN)};function IN(e){var t=f.useRef(void 0);return j5(t.current,e)||(t.current=e),t.current}var c2=function(t){t.stopPropagation(),t.preventDefault(),t.stopImmediatePropagation()},EN=typeof window<"u"?f.useLayoutEffect:f.useEffect;function Ke(e,t,n,r){var o=f.useRef(null),s=f.useRef(!1),i=n instanceof Array?r instanceof Array?void 0:r:n,u=e instanceof Array?e.join(i==null?void 0:i.splitKey):e,d=n instanceof Array?n:r instanceof Array?r:void 0,p=f.useCallback(t,d??[]),h=f.useRef(p);d?h.current=p:h.current=t;var g=IN(i),v=jN(),b=v.enabledScopes,S=kN();return EN(function(){if(!((g==null?void 0:g.enabled)===!1||!SN(b,g==null?void 0:g.scopes))){var w=function(E,I){var O;if(I===void 0&&(I=!1),!(wN(E)&&!P5(E,g==null?void 0:g.enableOnFormTags))&&!(g!=null&&g.ignoreEventWhen!=null&&g.ignoreEventWhen(E))){if(o.current!==null&&document.activeElement!==o.current&&!o.current.contains(document.activeElement)){c2(E);return}(O=E.target)!=null&&O.isContentEditable&&!(g!=null&&g.enableOnContentEditable)||ug(u,g==null?void 0:g.splitKey).forEach(function(M){var T,A=dg(M,g==null?void 0:g.combinationKey);if(CN(E,A,g==null?void 0:g.ignoreModifiers)||(T=A.keys)!=null&&T.includes("*")){if(I&&s.current)return;if(bN(E,A,g==null?void 0:g.preventDefault),!xN(E,A,g==null?void 0:g.enabled)){c2(E);return}h.current(E,A),I||(s.current=!0)}})}},C=function(E){E.key!==void 0&&(_5(Ha(E.code)),((g==null?void 0:g.keydown)===void 0&&(g==null?void 0:g.keyup)!==!0||g!=null&&g.keydown)&&w(E))},_=function(E){E.key!==void 0&&(k5(Ha(E.code)),s.current=!1,g!=null&&g.keyup&&w(E,!0))},k=o.current||(i==null?void 0:i.document)||document;return k.addEventListener("keyup",_),k.addEventListener("keydown",C),S&&ug(u,g==null?void 0:g.splitKey).forEach(function(j){return S.addHotkey(dg(j,g==null?void 0:g.combinationKey,g==null?void 0:g.description))}),function(){k.removeEventListener("keyup",_),k.removeEventListener("keydown",C),S&&ug(u,g==null?void 0:g.splitKey).forEach(function(j){return S.removeHotkey(dg(j,g==null?void 0:g.combinationKey,g==null?void 0:g.description))})}}},[u,g,b]),o}const ON=e=>{const{isDragAccept:t,isDragReject:n,setIsHandlingUpload:r}=e;return Ke("esc",()=>{r(!1)}),a.jsx(ze,{sx:{position:"absolute",top:0,insetInlineStart:0,width:"100vw",height:"100vh",zIndex:999,backdropFilter:"blur(20px)"},children:a.jsx(F,{sx:{opacity:.4,width:"100%",height:"100%",flexDirection:"column",rowGap:4,alignItems:"center",justifyContent:"center",bg:"base.900",boxShadow:`inset 0 0 20rem 1rem var(--invokeai-colors-${t?"accent":"error"}-500)`},children:t?a.jsx(aa,{size:"lg",children:"Drop to Upload"}):a.jsxs(a.Fragment,{children:[a.jsx(aa,{size:"lg",children:"Invalid Upload"}),a.jsx(aa,{size:"md",children:"Must be single JPEG or PNG image"})]})})})},MN=ve([Mo,ur],(e,t)=>{const{isConnected:n,isUploading:r}=e;return{isUploaderDisabled:!n||r,activeTabName:t}}),RN=e=>{const{children:t}=e,n=te(),{isUploaderDisabled:r,activeTabName:o}=L(MN),s=Ql(),{t:i}=fe(),[u,d]=f.useState(!1),{setOpenUploaderFunction:p}=fh(),h=f.useCallback(E=>{d(!0),s({title:i("toast.uploadFailed"),description:E.errors.map(I=>I.message).join(` +`),status:"error"})},[i,s]),g=f.useCallback(async E=>{n(x4({file:E,image_category:"user",is_intermediate:!1,postUploadAction:{type:"TOAST_UPLOADED"}}))},[n]),v=f.useCallback((E,I)=>{if(I.length>1){s({title:i("toast.uploadFailed"),description:i("toast.uploadFailedInvalidUploadDesc"),status:"error"});return}I.forEach(O=>{h(O)}),E.forEach(O=>{g(O)})},[i,s,g,h]),{getRootProps:b,getInputProps:S,isDragAccept:w,isDragReject:C,isDragActive:_,inputRef:k,open:j}=Vv({accept:{"image/png":[".png"],"image/jpeg":[".jpg",".jpeg",".png"]},noClick:!0,onDrop:v,onDragOver:()=>d(!0),disabled:r,multiple:!1});return f.useEffect(()=>{const E=async I=>{var O,M;k.current&&(O=I.clipboardData)!=null&&O.files&&(k.current.files=I.clipboardData.files,(M=k.current)==null||M.dispatchEvent(new Event("change",{bubbles:!0})))};return p(j),document.addEventListener("paste",E),()=>{document.removeEventListener("paste",E),p(()=>{})}},[k,j,p]),a.jsxs(ze,{...b({style:{}}),onKeyDown:E=>{E.key},children:[a.jsx("input",{...S()}),t,_&&u&&a.jsx(ON,{isDragAccept:w,isDragReject:C,setIsHandlingUpload:d})]})},DN=f.memo(RN),TN=JO(e=>{e(w4(!0))},300),vo=()=>(e,t)=>{ur(t())==="unifiedCanvas"&&TN(e)};var AN=globalThis&&globalThis.__extends||function(){var e=function(t,n){return e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(r,o){r.__proto__=o}||function(r,o){for(var s in o)Object.prototype.hasOwnProperty.call(o,s)&&(r[s]=o[s])},e(t,n)};return function(t,n){e(t,n);function r(){this.constructor=t}t.prototype=n===null?Object.create(n):(r.prototype=n.prototype,new r)}}(),yr=globalThis&&globalThis.__assign||function(){return yr=Object.assign||function(e){for(var t,n=1,r=arguments.length;n"u"?void 0:Number(r),maxHeight:typeof o>"u"?void 0:Number(o),minWidth:typeof s>"u"?void 0:Number(s),minHeight:typeof i>"u"?void 0:Number(i)}},HN=["as","style","className","grid","snap","bounds","boundsByDirection","size","defaultSize","minWidth","minHeight","maxWidth","maxHeight","lockAspectRatio","lockAspectRatioExtraWidth","lockAspectRatioExtraHeight","enable","handleStyles","handleClasses","handleWrapperStyle","handleWrapperClass","children","onResizeStart","onResize","onResizeStop","handleComponent","scale","resizeRatio","snapGap"],h2="__resizable_base__",WN=function(e){zN(t,e);function t(n){var r=e.call(this,n)||this;return r.ratio=1,r.resizable=null,r.parentLeft=0,r.parentTop=0,r.resizableLeft=0,r.resizableRight=0,r.resizableTop=0,r.resizableBottom=0,r.targetLeft=0,r.targetTop=0,r.appendBase=function(){if(!r.resizable||!r.window)return null;var o=r.parentNode;if(!o)return null;var s=r.window.document.createElement("div");return s.style.width="100%",s.style.height="100%",s.style.position="absolute",s.style.transform="scale(0, 0)",s.style.left="0",s.style.flex="0 0 100%",s.classList?s.classList.add(h2):s.className+=h2,o.appendChild(s),s},r.removeBase=function(o){var s=r.parentNode;s&&s.removeChild(o)},r.ref=function(o){o&&(r.resizable=o)},r.state={isResizing:!1,width:typeof(r.propsSize&&r.propsSize.width)>"u"?"auto":r.propsSize&&r.propsSize.width,height:typeof(r.propsSize&&r.propsSize.height)>"u"?"auto":r.propsSize&&r.propsSize.height,direction:"right",original:{x:0,y:0,width:0,height:0},backgroundStyle:{height:"100%",width:"100%",backgroundColor:"rgba(0,0,0,0)",cursor:"auto",opacity:0,position:"fixed",zIndex:9999,top:"0",left:"0",bottom:"0",right:"0"},flexBasis:void 0},r.onResizeStart=r.onResizeStart.bind(r),r.onMouseMove=r.onMouseMove.bind(r),r.onMouseUp=r.onMouseUp.bind(r),r}return Object.defineProperty(t.prototype,"parentNode",{get:function(){return this.resizable?this.resizable.parentNode:null},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"window",{get:function(){return!this.resizable||!this.resizable.ownerDocument?null:this.resizable.ownerDocument.defaultView},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"propsSize",{get:function(){return this.props.size||this.props.defaultSize||LN},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"size",{get:function(){var n=0,r=0;if(this.resizable&&this.window){var o=this.resizable.offsetWidth,s=this.resizable.offsetHeight,i=this.resizable.style.position;i!=="relative"&&(this.resizable.style.position="relative"),n=this.resizable.style.width!=="auto"?this.resizable.offsetWidth:o,r=this.resizable.style.height!=="auto"?this.resizable.offsetHeight:s,this.resizable.style.position=i}return{width:n,height:r}},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"sizeStyle",{get:function(){var n=this,r=this.props.size,o=function(u){if(typeof n.state[u]>"u"||n.state[u]==="auto")return"auto";if(n.propsSize&&n.propsSize[u]&&n.propsSize[u].toString().endsWith("%")){if(n.state[u].toString().endsWith("%"))return n.state[u].toString();var d=n.getParentSize(),p=Number(n.state[u].toString().replace("px","")),h=p/d[u]*100;return h+"%"}return fg(n.state[u])},s=r&&typeof r.width<"u"&&!this.state.isResizing?fg(r.width):o("width"),i=r&&typeof r.height<"u"&&!this.state.isResizing?fg(r.height):o("height");return{width:s,height:i}},enumerable:!1,configurable:!0}),t.prototype.getParentSize=function(){if(!this.parentNode)return this.window?{width:this.window.innerWidth,height:this.window.innerHeight}:{width:0,height:0};var n=this.appendBase();if(!n)return{width:0,height:0};var r=!1,o=this.parentNode.style.flexWrap;o!=="wrap"&&(r=!0,this.parentNode.style.flexWrap="wrap"),n.style.position="relative",n.style.minWidth="100%",n.style.minHeight="100%";var s={width:n.offsetWidth,height:n.offsetHeight};return r&&(this.parentNode.style.flexWrap=o),this.removeBase(n),s},t.prototype.bindEvents=function(){this.window&&(this.window.addEventListener("mouseup",this.onMouseUp),this.window.addEventListener("mousemove",this.onMouseMove),this.window.addEventListener("mouseleave",this.onMouseUp),this.window.addEventListener("touchmove",this.onMouseMove,{capture:!0,passive:!1}),this.window.addEventListener("touchend",this.onMouseUp))},t.prototype.unbindEvents=function(){this.window&&(this.window.removeEventListener("mouseup",this.onMouseUp),this.window.removeEventListener("mousemove",this.onMouseMove),this.window.removeEventListener("mouseleave",this.onMouseUp),this.window.removeEventListener("touchmove",this.onMouseMove,!0),this.window.removeEventListener("touchend",this.onMouseUp))},t.prototype.componentDidMount=function(){if(!(!this.resizable||!this.window)){var n=this.window.getComputedStyle(this.resizable);this.setState({width:this.state.width||this.size.width,height:this.state.height||this.size.height,flexBasis:n.flexBasis!=="auto"?n.flexBasis:void 0})}},t.prototype.componentWillUnmount=function(){this.window&&this.unbindEvents()},t.prototype.createSizeForCssProperty=function(n,r){var o=this.propsSize&&this.propsSize[r];return this.state[r]==="auto"&&this.state.original[r]===n&&(typeof o>"u"||o==="auto")?"auto":n},t.prototype.calculateNewMaxFromBoundary=function(n,r){var o=this.props.boundsByDirection,s=this.state.direction,i=o&&ul("left",s),u=o&&ul("top",s),d,p;if(this.props.bounds==="parent"){var h=this.parentNode;h&&(d=i?this.resizableRight-this.parentLeft:h.offsetWidth+(this.parentLeft-this.resizableLeft),p=u?this.resizableBottom-this.parentTop:h.offsetHeight+(this.parentTop-this.resizableTop))}else this.props.bounds==="window"?this.window&&(d=i?this.resizableRight:this.window.innerWidth-this.resizableLeft,p=u?this.resizableBottom:this.window.innerHeight-this.resizableTop):this.props.bounds&&(d=i?this.resizableRight-this.targetLeft:this.props.bounds.offsetWidth+(this.targetLeft-this.resizableLeft),p=u?this.resizableBottom-this.targetTop:this.props.bounds.offsetHeight+(this.targetTop-this.resizableTop));return d&&Number.isFinite(d)&&(n=n&&n"u"?10:s.width,g=typeof o.width>"u"||o.width<0?n:o.width,v=typeof s.height>"u"?10:s.height,b=typeof o.height>"u"||o.height<0?r:o.height,S=d||0,w=p||0;if(u){var C=(v-S)*this.ratio+w,_=(b-S)*this.ratio+w,k=(h-w)/this.ratio+S,j=(g-w)/this.ratio+S,E=Math.max(h,C),I=Math.min(g,_),O=Math.max(v,k),M=Math.min(b,j);n=Td(n,E,I),r=Td(r,O,M)}else n=Td(n,h,g),r=Td(r,v,b);return{newWidth:n,newHeight:r}},t.prototype.setBoundingClientRect=function(){if(this.props.bounds==="parent"){var n=this.parentNode;if(n){var r=n.getBoundingClientRect();this.parentLeft=r.left,this.parentTop=r.top}}if(this.props.bounds&&typeof this.props.bounds!="string"){var o=this.props.bounds.getBoundingClientRect();this.targetLeft=o.left,this.targetTop=o.top}if(this.resizable){var s=this.resizable.getBoundingClientRect(),i=s.left,u=s.top,d=s.right,p=s.bottom;this.resizableLeft=i,this.resizableRight=d,this.resizableTop=u,this.resizableBottom=p}},t.prototype.onResizeStart=function(n,r){if(!(!this.resizable||!this.window)){var o=0,s=0;if(n.nativeEvent&&BN(n.nativeEvent)?(o=n.nativeEvent.clientX,s=n.nativeEvent.clientY):n.nativeEvent&&Ad(n.nativeEvent)&&(o=n.nativeEvent.touches[0].clientX,s=n.nativeEvent.touches[0].clientY),this.props.onResizeStart&&this.resizable){var i=this.props.onResizeStart(n,r,this.resizable);if(i===!1)return}this.props.size&&(typeof this.props.size.height<"u"&&this.props.size.height!==this.state.height&&this.setState({height:this.props.size.height}),typeof this.props.size.width<"u"&&this.props.size.width!==this.state.width&&this.setState({width:this.props.size.width})),this.ratio=typeof this.props.lockAspectRatio=="number"?this.props.lockAspectRatio:this.size.width/this.size.height;var u,d=this.window.getComputedStyle(this.resizable);if(d.flexBasis!=="auto"){var p=this.parentNode;if(p){var h=this.window.getComputedStyle(p).flexDirection;this.flexDir=h.startsWith("row")?"row":"column",u=d.flexBasis}}this.setBoundingClientRect(),this.bindEvents();var g={original:{x:o,y:s,width:this.size.width,height:this.size.height},isResizing:!0,backgroundStyle:Ns(Ns({},this.state.backgroundStyle),{cursor:this.window.getComputedStyle(n.target).cursor||"auto"}),direction:r,flexBasis:u};this.setState(g)}},t.prototype.onMouseMove=function(n){var r=this;if(!(!this.state.isResizing||!this.resizable||!this.window)){if(this.window.TouchEvent&&Ad(n))try{n.preventDefault(),n.stopPropagation()}catch{}var o=this.props,s=o.maxWidth,i=o.maxHeight,u=o.minWidth,d=o.minHeight,p=Ad(n)?n.touches[0].clientX:n.clientX,h=Ad(n)?n.touches[0].clientY:n.clientY,g=this.state,v=g.direction,b=g.original,S=g.width,w=g.height,C=this.getParentSize(),_=FN(C,this.window.innerWidth,this.window.innerHeight,s,i,u,d);s=_.maxWidth,i=_.maxHeight,u=_.minWidth,d=_.minHeight;var k=this.calculateNewSizeFromDirection(p,h),j=k.newHeight,E=k.newWidth,I=this.calculateNewMaxFromBoundary(s,i);this.props.snap&&this.props.snap.x&&(E=p2(E,this.props.snap.x,this.props.snapGap)),this.props.snap&&this.props.snap.y&&(j=p2(j,this.props.snap.y,this.props.snapGap));var O=this.calculateNewSizeFromAspectRatio(E,j,{width:I.maxWidth,height:I.maxHeight},{width:u,height:d});if(E=O.newWidth,j=O.newHeight,this.props.grid){var M=f2(E,this.props.grid[0]),T=f2(j,this.props.grid[1]),A=this.props.snapGap||0;E=A===0||Math.abs(M-E)<=A?M:E,j=A===0||Math.abs(T-j)<=A?T:j}var z={width:E-b.width,height:j-b.height};if(S&&typeof S=="string"){if(S.endsWith("%")){var $=E/C.width*100;E=$+"%"}else if(S.endsWith("vw")){var ee=E/this.window.innerWidth*100;E=ee+"vw"}else if(S.endsWith("vh")){var B=E/this.window.innerHeight*100;E=B+"vh"}}if(w&&typeof w=="string"){if(w.endsWith("%")){var $=j/C.height*100;j=$+"%"}else if(w.endsWith("vw")){var ee=j/this.window.innerWidth*100;j=ee+"vw"}else if(w.endsWith("vh")){var B=j/this.window.innerHeight*100;j=B+"vh"}}var H={width:this.createSizeForCssProperty(E,"width"),height:this.createSizeForCssProperty(j,"height")};this.flexDir==="row"?H.flexBasis=H.width:this.flexDir==="column"&&(H.flexBasis=H.height),Xl.flushSync(function(){r.setState(H)}),this.props.onResize&&this.props.onResize(n,v,this.resizable,z)}},t.prototype.onMouseUp=function(n){var r=this.state,o=r.isResizing,s=r.direction,i=r.original;if(!(!o||!this.resizable)){var u={width:this.size.width-i.width,height:this.size.height-i.height};this.props.onResizeStop&&this.props.onResizeStop(n,s,this.resizable,u),this.props.size&&this.setState(this.props.size),this.unbindEvents(),this.setState({isResizing:!1,backgroundStyle:Ns(Ns({},this.state.backgroundStyle),{cursor:"auto"})})}},t.prototype.updateSize=function(n){this.setState({width:n.width,height:n.height})},t.prototype.renderResizer=function(){var n=this,r=this.props,o=r.enable,s=r.handleStyles,i=r.handleClasses,u=r.handleWrapperStyle,d=r.handleWrapperClass,p=r.handleComponent;if(!o)return null;var h=Object.keys(o).map(function(g){return o[g]!==!1?f.createElement($N,{key:g,direction:g,onResizeStart:n.onResizeStart,replaceStyles:s&&s[g],className:i&&i[g]},p&&p[g]?p[g]:null):null});return f.createElement("div",{className:d,style:u},h)},t.prototype.render=function(){var n=this,r=Object.keys(this.props).reduce(function(i,u){return HN.indexOf(u)!==-1||(i[u]=n.props[u]),i},{}),o=Ns(Ns(Ns({position:"relative",userSelect:this.state.isResizing?"none":"auto"},this.props.style),this.sizeStyle),{maxWidth:this.props.maxWidth,maxHeight:this.props.maxHeight,minWidth:this.props.minWidth,minHeight:this.props.minHeight,boxSizing:"border-box",flexShrink:0});this.state.flexBasis&&(o.flexBasis=this.state.flexBasis);var s=this.props.as||"div";return f.createElement(s,Ns({ref:this.ref,style:o,className:this.props.className},r),this.state.isResizing&&f.createElement("div",{style:this.state.backgroundStyle}),this.props.children,this.renderResizer())},t.defaultProps={as:"div",onResizeStart:function(){},onResize:function(){},onResizeStop:function(){},enable:{top:!0,right:!0,bottom:!0,left:!0,topRight:!0,bottomRight:!0,bottomLeft:!0,topLeft:!0},style:{},grid:[1,1],lockAspectRatio:!1,lockAspectRatioExtraWidth:0,lockAspectRatioExtraHeight:0,scale:1,resizeRatio:1,snapGap:0},t}(f.PureComponent);const VN=({direction:e,langDirection:t})=>({top:e==="bottom",right:t!=="rtl"&&e==="left"||t==="rtl"&&e==="right",bottom:e==="top",left:t!=="rtl"&&e==="right"||t==="rtl"&&e==="left"}),UN=({direction:e,minWidth:t,maxWidth:n,minHeight:r,maxHeight:o})=>{const s=t??(["left","right"].includes(e)?10:void 0),i=n??(["left","right"].includes(e)?"95vw":void 0),u=r??(["top","bottom"].includes(e)?10:void 0),d=o??(["top","bottom"].includes(e)?"95vh":void 0);return{...s?{minWidth:s}:{},...i?{maxWidth:i}:{},...u?{minHeight:u}:{},...d?{maxHeight:d}:{}}},oa="0.75rem",$d="1rem",Pc="5px",GN=({isResizable:e,direction:t})=>{const n=`calc((2 * ${oa} + ${Pc}) / -2)`;return t==="top"?{containerStyles:{borderBottomWidth:Pc,paddingBottom:$d},handleStyles:e?{top:{paddingTop:oa,paddingBottom:oa,bottom:n}}:{}}:t==="left"?{containerStyles:{borderInlineEndWidth:Pc,paddingInlineEnd:$d},handleStyles:e?{right:{paddingInlineStart:oa,paddingInlineEnd:oa,insetInlineEnd:n}}:{}}:t==="bottom"?{containerStyles:{borderTopWidth:Pc,paddingTop:$d},handleStyles:e?{bottom:{paddingTop:oa,paddingBottom:oa,top:n}}:{}}:t==="right"?{containerStyles:{borderInlineStartWidth:Pc,paddingInlineStart:$d},handleStyles:e?{left:{paddingInlineStart:oa,paddingInlineEnd:oa,insetInlineStart:n}}:{}}:{containerStyles:{},handleStyles:{}}},qN=(e,t)=>["top","bottom"].includes(e)?e:e==="left"?t==="rtl"?"right":"left":e==="right"?t==="rtl"?"left":"right":"left",ke=(e,t)=>n=>n==="light"?e:t,KN=He(WN,{shouldForwardProp:e=>!["sx"].includes(e)}),I5=({direction:e="left",isResizable:t,isOpen:n,onClose:r,children:o,initialWidth:s,minWidth:i,maxWidth:u,initialHeight:d,minHeight:p,maxHeight:h,onResizeStart:g,onResizeStop:v,onResize:b,sx:S={}})=>{const w=Gp().direction,{colorMode:C}=Ro(),_=f.useRef(null),k=f.useMemo(()=>s??i??(["left","right"].includes(e)?"auto":"100%"),[s,i,e]),j=f.useMemo(()=>d??p??(["top","bottom"].includes(e)?"auto":"100%"),[d,p,e]),[E,I]=f.useState(k),[O,M]=f.useState(j);zR({ref:_,handler:()=>{r()},enabled:n});const T=f.useMemo(()=>t?VN({direction:e,langDirection:w}):{},[t,w,e]),A=f.useMemo(()=>UN({direction:e,minWidth:i,maxWidth:u,minHeight:p,maxHeight:h}),[i,u,p,h,e]),{containerStyles:z,handleStyles:$}=f.useMemo(()=>GN({isResizable:t,direction:e}),[t,e]),ee=f.useMemo(()=>qN(e,w),[e,w]);return f.useEffect(()=>{["left","right"].includes(e)&&M("100vh"),["top","bottom"].includes(e)&&I("100vw")},[e]),a.jsx(I3,{direction:ee,in:n,motionProps:{initial:!1},style:{width:"full"},children:a.jsx(ze,{ref:_,sx:{width:"full",height:"full"},children:a.jsx(KN,{size:{width:t?E:k,height:t?O:j},enable:T,handleStyles:$,...A,sx:{borderColor:ke("base.200","base.800")(C),p:4,bg:ke("base.100","base.900")(C),height:"full",shadow:n?"dark-lg":void 0,...z,...S},onResizeStart:(B,H,G)=>{g&&g(B,H,G)},onResize:(B,H,G,K)=>{b&&b(B,H,G,K)},onResizeStop:(B,H,G,K)=>{["left","right"].includes(H)&&I(Number(E)+K.width),["top","bottom"].includes(H)&&M(Number(O)+K.height),v&&v(B,H,G,K)},children:o})})})},YN=e=>{const{triggerComponent:t,children:n,hasArrow:r=!0,isLazy:o=!0,...s}=e;return a.jsxs(Bv,{isLazy:o,...s,children:[a.jsx(Lv,{children:t}),a.jsxs(Fv,{shadow:"dark-lg",children:[r&&a.jsx(q6,{}),n]})]})},zi=f.memo(YN),QN=e=>{const{label:t,...n}=e,{colorMode:r}=Ro();return a.jsx(D3,{colorScheme:"accent",...n,children:a.jsx(nt,{sx:{fontSize:"sm",color:ke("base.800","base.200")(r)},children:t})})},Bn=f.memo(QN);function E5(e){return Ve({tag:"svg",attr:{fill:"currentColor",viewBox:"0 0 16 16"},child:[{tag:"path",attr:{d:"M9.828.722a.5.5 0 0 1 .354.146l4.95 4.95a.5.5 0 0 1 0 .707c-.48.48-1.072.588-1.503.588-.177 0-.335-.018-.46-.039l-3.134 3.134a5.927 5.927 0 0 1 .16 1.013c.046.702-.032 1.687-.72 2.375a.5.5 0 0 1-.707 0l-2.829-2.828-3.182 3.182c-.195.195-1.219.902-1.414.707-.195-.195.512-1.22.707-1.414l3.182-3.182-2.828-2.829a.5.5 0 0 1 0-.707c.688-.688 1.673-.767 2.375-.72a5.922 5.922 0 0 1 1.013.16l3.134-3.133a2.772 2.772 0 0 1-.04-.461c0-.43.108-1.022.589-1.503a.5.5 0 0 1 .353-.146z"}}]})(e)}function O5(e){return Ve({tag:"svg",attr:{fill:"currentColor",viewBox:"0 0 16 16"},child:[{tag:"path",attr:{d:"M9.828.722a.5.5 0 0 1 .354.146l4.95 4.95a.5.5 0 0 1 0 .707c-.48.48-1.072.588-1.503.588-.177 0-.335-.018-.46-.039l-3.134 3.134a5.927 5.927 0 0 1 .16 1.013c.046.702-.032 1.687-.72 2.375a.5.5 0 0 1-.707 0l-2.829-2.828-3.182 3.182c-.195.195-1.219.902-1.414.707-.195-.195.512-1.22.707-1.414l3.182-3.182-2.828-2.829a.5.5 0 0 1 0-.707c.688-.688 1.673-.767 2.375-.72a5.922 5.922 0 0 1 1.013.16l3.134-3.133a2.772 2.772 0 0 1-.04-.461c0-.43.108-1.022.589-1.503a.5.5 0 0 1 .353-.146zm.122 2.112v-.002.002zm0-.002v.002a.5.5 0 0 1-.122.51L6.293 6.878a.5.5 0 0 1-.511.12H5.78l-.014-.004a4.507 4.507 0 0 0-.288-.076 4.922 4.922 0 0 0-.765-.116c-.422-.028-.836.008-1.175.15l5.51 5.509c.141-.34.177-.753.149-1.175a4.924 4.924 0 0 0-.192-1.054l-.004-.013v-.001a.5.5 0 0 1 .12-.512l3.536-3.535a.5.5 0 0 1 .532-.115l.096.022c.087.017.208.034.344.034.114 0 .23-.011.343-.04L9.927 2.028c-.029.113-.04.23-.04.343a1.779 1.779 0 0 0 .062.46z"}}]})(e)}function XN(e){return Ve({tag:"svg",attr:{viewBox:"0 0 640 512"},child:[{tag:"path",attr:{d:"M524.531,69.836a1.5,1.5,0,0,0-.764-.7A485.065,485.065,0,0,0,404.081,32.03a1.816,1.816,0,0,0-1.923.91,337.461,337.461,0,0,0-14.9,30.6,447.848,447.848,0,0,0-134.426,0,309.541,309.541,0,0,0-15.135-30.6,1.89,1.89,0,0,0-1.924-.91A483.689,483.689,0,0,0,116.085,69.137a1.712,1.712,0,0,0-.788.676C39.068,183.651,18.186,294.69,28.43,404.354a2.016,2.016,0,0,0,.765,1.375A487.666,487.666,0,0,0,176.02,479.918a1.9,1.9,0,0,0,2.063-.676A348.2,348.2,0,0,0,208.12,430.4a1.86,1.86,0,0,0-1.019-2.588,321.173,321.173,0,0,1-45.868-21.853,1.885,1.885,0,0,1-.185-3.126c3.082-2.309,6.166-4.711,9.109-7.137a1.819,1.819,0,0,1,1.9-.256c96.229,43.917,200.41,43.917,295.5,0a1.812,1.812,0,0,1,1.924.233c2.944,2.426,6.027,4.851,9.132,7.16a1.884,1.884,0,0,1-.162,3.126,301.407,301.407,0,0,1-45.89,21.83,1.875,1.875,0,0,0-1,2.611,391.055,391.055,0,0,0,30.014,48.815,1.864,1.864,0,0,0,2.063.7A486.048,486.048,0,0,0,610.7,405.729a1.882,1.882,0,0,0,.765-1.352C623.729,277.594,590.933,167.465,524.531,69.836ZM222.491,337.58c-28.972,0-52.844-26.587-52.844-59.239S193.056,219.1,222.491,219.1c29.665,0,53.306,26.82,52.843,59.239C275.334,310.993,251.924,337.58,222.491,337.58Zm195.38,0c-28.971,0-52.843-26.587-52.843-59.239S388.437,219.1,417.871,219.1c29.667,0,53.307,26.82,52.844,59.239C470.715,310.993,447.538,337.58,417.871,337.58Z"}}]})(e)}function JN(e){return Ve({tag:"svg",attr:{viewBox:"0 0 496 512"},child:[{tag:"path",attr:{d:"M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"}}]})(e)}function ZN(e){return Ve({tag:"svg",attr:{viewBox:"0 0 576 512"},child:[{tag:"path",attr:{d:"M528 32H48C21.5 32 0 53.5 0 80v352c0 26.5 21.5 48 48 48h480c26.5 0 48-21.5 48-48V80c0-26.5-21.5-48-48-48zm-352 96c35.3 0 64 28.7 64 64s-28.7 64-64 64-64-28.7-64-64 28.7-64 64-64zm112 236.8c0 10.6-10 19.2-22.4 19.2H86.4C74 384 64 375.4 64 364.8v-19.2c0-31.8 30.1-57.6 67.2-57.6h5c12.3 5.1 25.7 8 39.8 8s27.6-2.9 39.8-8h5c37.1 0 67.2 25.8 67.2 57.6v19.2zM512 312c0 4.4-3.6 8-8 8H360c-4.4 0-8-3.6-8-8v-16c0-4.4 3.6-8 8-8h144c4.4 0 8 3.6 8 8v16zm0-64c0 4.4-3.6 8-8 8H360c-4.4 0-8-3.6-8-8v-16c0-4.4 3.6-8 8-8h144c4.4 0 8 3.6 8 8v16zm0-64c0 4.4-3.6 8-8 8H360c-4.4 0-8-3.6-8-8v-16c0-4.4 3.6-8 8-8h144c4.4 0 8 3.6 8 8v16z"}}]})(e)}function e$(e){return Ve({tag:"svg",attr:{viewBox:"0 0 448 512"},child:[{tag:"path",attr:{d:"M224.3 273l-136 136c-9.4 9.4-24.6 9.4-33.9 0l-22.6-22.6c-9.4-9.4-9.4-24.6 0-33.9l96.4-96.4-96.4-96.4c-9.4-9.4-9.4-24.6 0-33.9L54.3 103c9.4-9.4 24.6-9.4 33.9 0l136 136c9.5 9.4 9.5 24.6.1 34zm192-34l-136-136c-9.4-9.4-24.6-9.4-33.9 0l-22.6 22.6c-9.4 9.4-9.4 24.6 0 33.9l96.4 96.4-96.4 96.4c-9.4 9.4-9.4 24.6 0 33.9l22.6 22.6c9.4 9.4 24.6 9.4 33.9 0l136-136c9.4-9.2 9.4-24.4 0-33.8z"}}]})(e)}function t$(e){return Ve({tag:"svg",attr:{viewBox:"0 0 256 512"},child:[{tag:"path",attr:{d:"M31.7 239l136-136c9.4-9.4 24.6-9.4 33.9 0l22.6 22.6c9.4 9.4 9.4 24.6 0 33.9L127.9 256l96.4 96.4c9.4 9.4 9.4 24.6 0 33.9L201.7 409c-9.4 9.4-24.6 9.4-33.9 0l-136-136c-9.5-9.4-9.5-24.6-.1-34z"}}]})(e)}function n$(e){return Ve({tag:"svg",attr:{viewBox:"0 0 256 512"},child:[{tag:"path",attr:{d:"M224.3 273l-136 136c-9.4 9.4-24.6 9.4-33.9 0l-22.6-22.6c-9.4-9.4-9.4-24.6 0-33.9l96.4-96.4-96.4-96.4c-9.4-9.4-9.4-24.6 0-33.9L54.3 103c9.4-9.4 24.6-9.4 33.9 0l136 136c9.5 9.4 9.5 24.6.1 34z"}}]})(e)}function r$(e){return Ve({tag:"svg",attr:{viewBox:"0 0 448 512"},child:[{tag:"path",attr:{d:"M257.5 445.1l-22.2 22.2c-9.4 9.4-24.6 9.4-33.9 0L7 273c-9.4-9.4-9.4-24.6 0-33.9L201.4 44.7c9.4-9.4 24.6-9.4 33.9 0l22.2 22.2c9.5 9.5 9.3 25-.4 34.3L136.6 216H424c13.3 0 24 10.7 24 24v32c0 13.3-10.7 24-24 24H136.6l120.5 114.8c9.8 9.3 10 24.8.4 34.3z"}}]})(e)}function o$(e){return Ve({tag:"svg",attr:{viewBox:"0 0 448 512"},child:[{tag:"path",attr:{d:"M190.5 66.9l22.2-22.2c9.4-9.4 24.6-9.4 33.9 0L441 239c9.4 9.4 9.4 24.6 0 33.9L246.6 467.3c-9.4 9.4-24.6 9.4-33.9 0l-22.2-22.2c-9.5-9.5-9.3-25 .4-34.3L311.4 296H24c-13.3 0-24-10.7-24-24v-32c0-13.3 10.7-24 24-24h287.4L190.9 101.2c-9.8-9.3-10-24.8-.4-34.3z"}}]})(e)}function M5(e){return Ve({tag:"svg",attr:{viewBox:"0 0 512 512"},child:[{tag:"path",attr:{d:"M352.201 425.775l-79.196 79.196c-9.373 9.373-24.568 9.373-33.941 0l-79.196-79.196c-15.119-15.119-4.411-40.971 16.971-40.97h51.162L228 284H127.196v51.162c0 21.382-25.851 32.09-40.971 16.971L7.029 272.937c-9.373-9.373-9.373-24.569 0-33.941L86.225 159.8c15.119-15.119 40.971-4.411 40.971 16.971V228H228V127.196h-51.23c-21.382 0-32.09-25.851-16.971-40.971l79.196-79.196c9.373-9.373 24.568-9.373 33.941 0l79.196 79.196c15.119 15.119 4.411 40.971-16.971 40.971h-51.162V228h100.804v-51.162c0-21.382 25.851-32.09 40.97-16.971l79.196 79.196c9.373 9.373 9.373 24.569 0 33.941L425.773 352.2c-15.119 15.119-40.971 4.411-40.97-16.971V284H284v100.804h51.23c21.382 0 32.09 25.851 16.971 40.971z"}}]})(e)}function R5(e){return Ve({tag:"svg",attr:{viewBox:"0 0 512 512"},child:[{tag:"path",attr:{d:"M478.21 334.093L336 256l142.21-78.093c11.795-6.477 15.961-21.384 9.232-33.037l-19.48-33.741c-6.728-11.653-21.72-15.499-33.227-8.523L296 186.718l3.475-162.204C299.763 11.061 288.937 0 275.48 0h-38.96c-13.456 0-24.283 11.061-23.994 24.514L216 186.718 77.265 102.607c-11.506-6.976-26.499-3.13-33.227 8.523l-19.48 33.741c-6.728 11.653-2.562 26.56 9.233 33.037L176 256 33.79 334.093c-11.795 6.477-15.961 21.384-9.232 33.037l19.48 33.741c6.728 11.653 21.721 15.499 33.227 8.523L216 325.282l-3.475 162.204C212.237 500.939 223.064 512 236.52 512h38.961c13.456 0 24.283-11.061 23.995-24.514L296 325.282l138.735 84.111c11.506 6.976 26.499 3.13 33.227-8.523l19.48-33.741c6.728-11.653 2.563-26.559-9.232-33.036z"}}]})(e)}function s$(e){return Ve({tag:"svg",attr:{viewBox:"0 0 512 512"},child:[{tag:"path",attr:{d:"M511.988 288.9c-.478 17.43-15.217 31.1-32.653 31.1H424v16c0 21.864-4.882 42.584-13.6 61.145l60.228 60.228c12.496 12.497 12.496 32.758 0 45.255-12.498 12.497-32.759 12.496-45.256 0l-54.736-54.736C345.886 467.965 314.351 480 280 480V236c0-6.627-5.373-12-12-12h-24c-6.627 0-12 5.373-12 12v244c-34.351 0-65.886-12.035-90.636-32.108l-54.736 54.736c-12.498 12.497-32.759 12.496-45.256 0-12.496-12.497-12.496-32.758 0-45.255l60.228-60.228C92.882 378.584 88 357.864 88 336v-16H32.666C15.23 320 .491 306.33.013 288.9-.484 270.816 14.028 256 32 256h56v-58.745l-46.628-46.628c-12.496-12.497-12.496-32.758 0-45.255 12.498-12.497 32.758-12.497 45.256 0L141.255 160h229.489l54.627-54.627c12.498-12.497 32.758-12.497 45.256 0 12.496 12.497 12.496 32.758 0 45.255L424 197.255V256h56c17.972 0 32.484 14.816 31.988 32.9zM257 0c-61.856 0-112 50.144-112 112h224C369 50.144 318.856 0 257 0z"}}]})(e)}function a$(e){return Ve({tag:"svg",attr:{viewBox:"0 0 512 512"},child:[{tag:"path",attr:{d:"M173.898 439.404l-166.4-166.4c-9.997-9.997-9.997-26.206 0-36.204l36.203-36.204c9.997-9.998 26.207-9.998 36.204 0L192 312.69 432.095 72.596c9.997-9.997 26.207-9.997 36.204 0l36.203 36.204c9.997 9.997 9.997 26.206 0 36.204l-294.4 294.401c-9.998 9.997-26.207 9.997-36.204-.001z"}}]})(e)}function i$(e){return Ve({tag:"svg",attr:{viewBox:"0 0 512 512"},child:[{tag:"path",attr:{d:"M256 8C119 8 8 119 8 256s111 248 248 248 248-111 248-248S393 8 256 8z"}}]})(e)}function Uv(e){return Ve({tag:"svg",attr:{viewBox:"0 0 640 512"},child:[{tag:"path",attr:{d:"M278.9 511.5l-61-17.7c-6.4-1.8-10-8.5-8.2-14.9L346.2 8.7c1.8-6.4 8.5-10 14.9-8.2l61 17.7c6.4 1.8 10 8.5 8.2 14.9L293.8 503.3c-1.9 6.4-8.5 10.1-14.9 8.2zm-114-112.2l43.5-46.4c4.6-4.9 4.3-12.7-.8-17.2L117 256l90.6-79.7c5.1-4.5 5.5-12.3.8-17.2l-43.5-46.4c-4.5-4.8-12.1-5.1-17-.5L3.8 247.2c-5.1 4.7-5.1 12.8 0 17.5l144.1 135.1c4.9 4.6 12.5 4.4 17-.5zm327.2.6l144.1-135.1c5.1-4.7 5.1-12.8 0-17.5L492.1 112.1c-4.8-4.5-12.4-4.3-17 .5L431.6 159c-4.6 4.9-4.3 12.7.8 17.2L523 256l-90.6 79.7c-5.1 4.5-5.5 12.3-.8 17.2l43.5 46.4c4.5 4.9 12.1 5.1 17 .6z"}}]})(e)}function rc(e){return Ve({tag:"svg",attr:{viewBox:"0 0 448 512"},child:[{tag:"path",attr:{d:"M320 448v40c0 13.255-10.745 24-24 24H24c-13.255 0-24-10.745-24-24V120c0-13.255 10.745-24 24-24h72v296c0 30.879 25.121 56 56 56h168zm0-344V0H152c-13.255 0-24 10.745-24 24v368c0 13.255 10.745 24 24 24h272c13.255 0 24-10.745 24-24V128H344c-13.2 0-24-10.8-24-24zm120.971-31.029L375.029 7.029A24 24 0 0 0 358.059 0H352v96h96v-6.059a24 24 0 0 0-7.029-16.97z"}}]})(e)}function D5(e){return Ve({tag:"svg",attr:{viewBox:"0 0 512 512"},child:[{tag:"path",attr:{d:"M500 224h-30.364C455.724 130.325 381.675 56.276 288 42.364V12c0-6.627-5.373-12-12-12h-40c-6.627 0-12 5.373-12 12v30.364C130.325 56.276 56.276 130.325 42.364 224H12c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12h30.364C56.276 381.675 130.325 455.724 224 469.636V500c0 6.627 5.373 12 12 12h40c6.627 0 12-5.373 12-12v-30.364C381.675 455.724 455.724 381.675 469.636 288H500c6.627 0 12-5.373 12-12v-40c0-6.627-5.373-12-12-12zM288 404.634V364c0-6.627-5.373-12-12-12h-40c-6.627 0-12 5.373-12 12v40.634C165.826 392.232 119.783 346.243 107.366 288H148c6.627 0 12-5.373 12-12v-40c0-6.627-5.373-12-12-12h-40.634C119.768 165.826 165.757 119.783 224 107.366V148c0 6.627 5.373 12 12 12h40c6.627 0 12-5.373 12-12v-40.634C346.174 119.768 392.217 165.757 404.634 224H364c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12h40.634C392.232 346.174 346.243 392.217 288 404.634zM288 256c0 17.673-14.327 32-32 32s-32-14.327-32-32c0-17.673 14.327-32 32-32s32 14.327 32 32z"}}]})(e)}function l$(e){return Ve({tag:"svg",attr:{viewBox:"0 0 512 512"},child:[{tag:"path",attr:{d:"M239.1 6.3l-208 78c-18.7 7-31.1 25-31.1 45v225.1c0 18.2 10.3 34.8 26.5 42.9l208 104c13.5 6.8 29.4 6.8 42.9 0l208-104c16.3-8.1 26.5-24.8 26.5-42.9V129.3c0-20-12.4-37.9-31.1-44.9l-208-78C262 2.2 250 2.2 239.1 6.3zM256 68.4l192 72v1.1l-192 78-192-78v-1.1l192-72zm32 356V275.5l160-65v133.9l-160 80z"}}]})(e)}function Gv(e){return Ve({tag:"svg",attr:{viewBox:"0 0 512 512"},child:[{tag:"path",attr:{d:"M216 0h80c13.3 0 24 10.7 24 24v168h87.7c17.8 0 26.7 21.5 14.1 34.1L269.7 378.3c-7.5 7.5-19.8 7.5-27.3 0L90.1 226.1c-12.6-12.6-3.7-34.1 14.1-34.1H192V24c0-13.3 10.7-24 24-24zm296 376v112c0 13.3-10.7 24-24 24H24c-13.3 0-24-10.7-24-24V376c0-13.3 10.7-24 24-24h146.7l49 49c20.1 20.1 52.5 20.1 72.6 0l49-49H488c13.3 0 24 10.7 24 24zm-124 88c0-11-9-20-20-20s-20 9-20 20 9 20 20 20 20-9 20-20zm64 0c0-11-9-20-20-20s-20 9-20 20 9 20 20 20 20-9 20-20z"}}]})(e)}function T5(e){return Ve({tag:"svg",attr:{viewBox:"0 0 512 512"},child:[{tag:"path",attr:{d:"M497.941 273.941c18.745-18.745 18.745-49.137 0-67.882l-160-160c-18.745-18.745-49.136-18.746-67.883 0l-256 256c-18.745 18.745-18.745 49.137 0 67.882l96 96A48.004 48.004 0 0 0 144 480h356c6.627 0 12-5.373 12-12v-40c0-6.627-5.373-12-12-12H355.883l142.058-142.059zm-302.627-62.627l137.373 137.373L265.373 416H150.628l-80-80 124.686-124.686z"}}]})(e)}function c$(e){return Ve({tag:"svg",attr:{viewBox:"0 0 512 512"},child:[{tag:"path",attr:{d:"M504 256c0 136.997-111.043 248-248 248S8 392.997 8 256C8 119.083 119.043 8 256 8s248 111.083 248 248zm-248 50c-25.405 0-46 20.595-46 46s20.595 46 46 46 46-20.595 46-46-20.595-46-46-46zm-43.673-165.346l7.418 136c.347 6.364 5.609 11.346 11.982 11.346h48.546c6.373 0 11.635-4.982 11.982-11.346l7.418-136c.375-6.874-5.098-12.654-11.982-12.654h-63.383c-6.884 0-12.356 5.78-11.981 12.654z"}}]})(e)}function u$(e){return Ve({tag:"svg",attr:{viewBox:"0 0 192 512"},child:[{tag:"path",attr:{d:"M176 432c0 44.112-35.888 80-80 80s-80-35.888-80-80 35.888-80 80-80 80 35.888 80 80zM25.26 25.199l13.6 272C39.499 309.972 50.041 320 62.83 320h66.34c12.789 0 23.331-10.028 23.97-22.801l13.6-272C167.425 11.49 156.496 0 142.77 0H49.23C35.504 0 24.575 11.49 25.26 25.199z"}}]})(e)}function d$(e){return Ve({tag:"svg",attr:{viewBox:"0 0 448 512"},child:[{tag:"path",attr:{d:"M448 344v112a23.94 23.94 0 0 1-24 24H312c-21.39 0-32.09-25.9-17-41l36.2-36.2L224 295.6 116.77 402.9 153 439c15.09 15.1 4.39 41-17 41H24a23.94 23.94 0 0 1-24-24V344c0-21.4 25.89-32.1 41-17l36.19 36.2L184.46 256 77.18 148.7 41 185c-15.1 15.1-41 4.4-41-17V56a23.94 23.94 0 0 1 24-24h112c21.39 0 32.09 25.9 17 41l-36.2 36.2L224 216.4l107.23-107.3L295 73c-15.09-15.1-4.39-41 17-41h112a23.94 23.94 0 0 1 24 24v112c0 21.4-25.89 32.1-41 17l-36.19-36.2L263.54 256l107.28 107.3L407 327.1c15.1-15.2 41-4.5 41 16.9z"}}]})(e)}function f$(e){return Ve({tag:"svg",attr:{viewBox:"0 0 448 512"},child:[{tag:"path",attr:{d:"M0 180V56c0-13.3 10.7-24 24-24h124c6.6 0 12 5.4 12 12v40c0 6.6-5.4 12-12 12H64v84c0 6.6-5.4 12-12 12H12c-6.6 0-12-5.4-12-12zM288 44v40c0 6.6 5.4 12 12 12h84v84c0 6.6 5.4 12 12 12h40c6.6 0 12-5.4 12-12V56c0-13.3-10.7-24-24-24H300c-6.6 0-12 5.4-12 12zm148 276h-40c-6.6 0-12 5.4-12 12v84h-84c-6.6 0-12 5.4-12 12v40c0 6.6 5.4 12 12 12h124c13.3 0 24-10.7 24-24V332c0-6.6-5.4-12-12-12zM160 468v-40c0-6.6-5.4-12-12-12H64v-84c0-6.6-5.4-12-12-12H12c-6.6 0-12 5.4-12 12v124c0 13.3 10.7 24 24 24h124c6.6 0 12-5.4 12-12z"}}]})(e)}function p$(e){return Ve({tag:"svg",attr:{viewBox:"0 0 512 512"},child:[{tag:"path",attr:{d:"M432,320H400a16,16,0,0,0-16,16V448H64V128H208a16,16,0,0,0,16-16V80a16,16,0,0,0-16-16H48A48,48,0,0,0,0,112V464a48,48,0,0,0,48,48H400a48,48,0,0,0,48-48V336A16,16,0,0,0,432,320ZM488,0h-128c-21.37,0-32.05,25.91-17,41l35.73,35.73L135,320.37a24,24,0,0,0,0,34L157.67,377a24,24,0,0,0,34,0L435.28,133.32,471,169c15,15,41,4.5,41-17V24A24,24,0,0,0,488,0Z"}}]})(e)}function A5(e){return Ve({tag:"svg",attr:{viewBox:"0 0 512 512"},child:[{tag:"path",attr:{d:"M50.75 333.25c-12 12-18.75 28.28-18.75 45.26V424L0 480l32 32 56-32h45.49c16.97 0 33.25-6.74 45.25-18.74l126.64-126.62-128-128L50.75 333.25zM483.88 28.12c-37.47-37.5-98.28-37.5-135.75 0l-77.09 77.09-13.1-13.1c-9.44-9.44-24.65-9.31-33.94 0l-40.97 40.97c-9.37 9.37-9.37 24.57 0 33.94l161.94 161.94c9.44 9.44 24.65 9.31 33.94 0L419.88 288c9.37-9.37 9.37-24.57 0-33.94l-13.1-13.1 77.09-77.09c37.51-37.48 37.51-98.26.01-135.75z"}}]})(e)}function h$(e){return Ve({tag:"svg",attr:{viewBox:"0 0 640 512"},child:[{tag:"path",attr:{d:"M320 400c-75.85 0-137.25-58.71-142.9-133.11L72.2 185.82c-13.79 17.3-26.48 35.59-36.72 55.59a32.35 32.35 0 0 0 0 29.19C89.71 376.41 197.07 448 320 448c26.91 0 52.87-4 77.89-10.46L346 397.39a144.13 144.13 0 0 1-26 2.61zm313.82 58.1l-110.55-85.44a331.25 331.25 0 0 0 81.25-102.07 32.35 32.35 0 0 0 0-29.19C550.29 135.59 442.93 64 320 64a308.15 308.15 0 0 0-147.32 37.7L45.46 3.37A16 16 0 0 0 23 6.18L3.37 31.45A16 16 0 0 0 6.18 53.9l588.36 454.73a16 16 0 0 0 22.46-2.81l19.64-25.27a16 16 0 0 0-2.82-22.45zm-183.72-142l-39.3-30.38A94.75 94.75 0 0 0 416 256a94.76 94.76 0 0 0-121.31-92.21A47.65 47.65 0 0 1 304 192a46.64 46.64 0 0 1-1.54 10l-73.61-56.89A142.31 142.31 0 0 1 320 112a143.92 143.92 0 0 1 144 144c0 21.63-5.29 41.79-13.9 60.11z"}}]})(e)}function m$(e){return Ve({tag:"svg",attr:{viewBox:"0 0 576 512"},child:[{tag:"path",attr:{d:"M572.52 241.4C518.29 135.59 410.93 64 288 64S57.68 135.64 3.48 241.41a32.35 32.35 0 0 0 0 29.19C57.71 376.41 165.07 448 288 448s230.32-71.64 284.52-177.41a32.35 32.35 0 0 0 0-29.19zM288 400a144 144 0 1 1 144-144 143.93 143.93 0 0 1-144 144zm0-240a95.31 95.31 0 0 0-25.31 3.79 47.85 47.85 0 0 1-66.9 66.9A95.78 95.78 0 1 0 288 160z"}}]})(e)}function N5(e){return Ve({tag:"svg",attr:{viewBox:"0 0 576 512"},child:[{tag:"path",attr:{d:"M512 320s-64 92.65-64 128c0 35.35 28.66 64 64 64s64-28.65 64-64-64-128-64-128zm-9.37-102.94L294.94 9.37C288.69 3.12 280.5 0 272.31 0s-16.38 3.12-22.62 9.37l-81.58 81.58L81.93 4.76c-6.25-6.25-16.38-6.25-22.62 0L36.69 27.38c-6.24 6.25-6.24 16.38 0 22.62l86.19 86.18-94.76 94.76c-37.49 37.48-37.49 98.26 0 135.75l117.19 117.19c18.74 18.74 43.31 28.12 67.87 28.12 24.57 0 49.13-9.37 67.87-28.12l221.57-221.57c12.5-12.5 12.5-32.75.01-45.25zm-116.22 70.97H65.93c1.36-3.84 3.57-7.98 7.43-11.83l13.15-13.15 81.61-81.61 58.6 58.6c12.49 12.49 32.75 12.49 45.24 0s12.49-32.75 0-45.24l-58.6-58.6 58.95-58.95 162.44 162.44-48.34 48.34z"}}]})(e)}function g$(e){return Ve({tag:"svg",attr:{viewBox:"0 0 512 512"},child:[{tag:"path",attr:{d:"M464,128H272L208,64H48A48,48,0,0,0,0,112V400a48,48,0,0,0,48,48H464a48,48,0,0,0,48-48V176A48,48,0,0,0,464,128ZM359.5,296a16,16,0,0,1-16,16h-64v64a16,16,0,0,1-16,16h-16a16,16,0,0,1-16-16V312h-64a16,16,0,0,1-16-16V280a16,16,0,0,1,16-16h64V200a16,16,0,0,1,16-16h16a16,16,0,0,1,16,16v64h64a16,16,0,0,1,16,16Z"}}]})(e)}function qc(e){return Ve({tag:"svg",attr:{viewBox:"0 0 512 512"},child:[{tag:"path",attr:{d:"M464 128H272l-64-64H48C21.49 64 0 85.49 0 112v288c0 26.51 21.49 48 48 48h416c26.51 0 48-21.49 48-48V176c0-26.51-21.49-48-48-48z"}}]})(e)}function v$(e){return Ve({tag:"svg",attr:{viewBox:"0 0 448 512"},child:[{tag:"path",attr:{d:"M432 416h-23.41L277.88 53.69A32 32 0 0 0 247.58 32h-47.16a32 32 0 0 0-30.3 21.69L39.41 416H16a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h128a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16h-19.58l23.3-64h152.56l23.3 64H304a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h128a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16zM176.85 272L224 142.51 271.15 272z"}}]})(e)}function y$(e){return Ve({tag:"svg",attr:{viewBox:"0 0 384 512"},child:[{tag:"path",attr:{d:"M360 0H24C10.745 0 0 10.745 0 24v16c0 13.255 10.745 24 24 24 0 90.965 51.016 167.734 120.842 192C75.016 280.266 24 357.035 24 448c-13.255 0-24 10.745-24 24v16c0 13.255 10.745 24 24 24h336c13.255 0 24-10.745 24-24v-16c0-13.255-10.745-24-24-24 0-90.965-51.016-167.734-120.842-192C308.984 231.734 360 154.965 360 64c13.255 0 24-10.745 24-24V24c0-13.255-10.745-24-24-24zm-75.078 384H99.08c17.059-46.797 52.096-80 92.92-80 40.821 0 75.862 33.196 92.922 80zm.019-256H99.078C91.988 108.548 88 86.748 88 64h208c0 22.805-3.987 44.587-11.059 64z"}}]})(e)}function oc(e){return Ve({tag:"svg",attr:{viewBox:"0 0 512 512"},child:[{tag:"path",attr:{d:"M464 448H48c-26.51 0-48-21.49-48-48V112c0-26.51 21.49-48 48-48h416c26.51 0 48 21.49 48 48v288c0 26.51-21.49 48-48 48zM112 120c-30.928 0-56 25.072-56 56s25.072 56 56 56 56-25.072 56-56-25.072-56-56-56zM64 384h384V272l-87.515-87.515c-4.686-4.686-12.284-4.686-16.971 0L208 320l-55.515-55.515c-4.686-4.686-12.284-4.686-16.971 0L64 336v48z"}}]})(e)}function $5(e){return Ve({tag:"svg",attr:{viewBox:"0 0 576 512"},child:[{tag:"path",attr:{d:"M480 416v16c0 26.51-21.49 48-48 48H48c-26.51 0-48-21.49-48-48V176c0-26.51 21.49-48 48-48h16v208c0 44.112 35.888 80 80 80h336zm96-80V80c0-26.51-21.49-48-48-48H144c-26.51 0-48 21.49-48 48v256c0 26.51 21.49 48 48 48h384c26.51 0 48-21.49 48-48zM256 128c0 26.51-21.49 48-48 48s-48-21.49-48-48 21.49-48 48-48 48 21.49 48 48zm-96 144l55.515-55.515c4.686-4.686 12.284-4.686 16.971 0L272 256l135.515-135.515c4.686-4.686 12.284-4.686 16.971 0L512 208v112H160v-48z"}}]})(e)}function b$(e){return Ve({tag:"svg",attr:{viewBox:"0 0 512 512"},child:[{tag:"path",attr:{d:"M256 8C119.043 8 8 119.083 8 256c0 136.997 111.043 248 248 248s248-111.003 248-248C504 119.083 392.957 8 256 8zm0 110c23.196 0 42 18.804 42 42s-18.804 42-42 42-42-18.804-42-42 18.804-42 42-42zm56 254c0 6.627-5.373 12-12 12h-88c-6.627 0-12-5.373-12-12v-24c0-6.627 5.373-12 12-12h12v-64h-12c-6.627 0-12-5.373-12-12v-24c0-6.627 5.373-12 12-12h64c6.627 0 12 5.373 12 12v100h12c6.627 0 12 5.373 12 12v24z"}}]})(e)}function x$(e){return Ve({tag:"svg",attr:{viewBox:"0 0 192 512"},child:[{tag:"path",attr:{d:"M20 424.229h20V279.771H20c-11.046 0-20-8.954-20-20V212c0-11.046 8.954-20 20-20h112c11.046 0 20 8.954 20 20v212.229h20c11.046 0 20 8.954 20 20V492c0 11.046-8.954 20-20 20H20c-11.046 0-20-8.954-20-20v-47.771c0-11.046 8.954-20 20-20zM96 0C56.235 0 24 32.235 24 72s32.235 72 72 72 72-32.235 72-72S135.764 0 96 0z"}}]})(e)}function w$(e){return Ve({tag:"svg",attr:{viewBox:"0 0 576 512"},child:[{tag:"path",attr:{d:"M528 448H48c-26.51 0-48-21.49-48-48V112c0-26.51 21.49-48 48-48h480c26.51 0 48 21.49 48 48v288c0 26.51-21.49 48-48 48zM128 180v-40c0-6.627-5.373-12-12-12H76c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12h40c6.627 0 12-5.373 12-12zm96 0v-40c0-6.627-5.373-12-12-12h-40c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12h40c6.627 0 12-5.373 12-12zm96 0v-40c0-6.627-5.373-12-12-12h-40c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12h40c6.627 0 12-5.373 12-12zm96 0v-40c0-6.627-5.373-12-12-12h-40c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12h40c6.627 0 12-5.373 12-12zm96 0v-40c0-6.627-5.373-12-12-12h-40c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12h40c6.627 0 12-5.373 12-12zm-336 96v-40c0-6.627-5.373-12-12-12h-40c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12h40c6.627 0 12-5.373 12-12zm96 0v-40c0-6.627-5.373-12-12-12h-40c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12h40c6.627 0 12-5.373 12-12zm96 0v-40c0-6.627-5.373-12-12-12h-40c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12h40c6.627 0 12-5.373 12-12zm96 0v-40c0-6.627-5.373-12-12-12h-40c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12h40c6.627 0 12-5.373 12-12zm-336 96v-40c0-6.627-5.373-12-12-12H76c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12h40c6.627 0 12-5.373 12-12zm288 0v-40c0-6.627-5.373-12-12-12H172c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12h232c6.627 0 12-5.373 12-12zm96 0v-40c0-6.627-5.373-12-12-12h-40c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12h40c6.627 0 12-5.373 12-12z"}}]})(e)}function qv(e){return Ve({tag:"svg",attr:{viewBox:"0 0 512 512"},child:[{tag:"path",attr:{d:"M12.41 148.02l232.94 105.67c6.8 3.09 14.49 3.09 21.29 0l232.94-105.67c16.55-7.51 16.55-32.52 0-40.03L266.65 2.31a25.607 25.607 0 0 0-21.29 0L12.41 107.98c-16.55 7.51-16.55 32.53 0 40.04zm487.18 88.28l-58.09-26.33-161.64 73.27c-7.56 3.43-15.59 5.17-23.86 5.17s-16.29-1.74-23.86-5.17L70.51 209.97l-58.1 26.33c-16.55 7.5-16.55 32.5 0 40l232.94 105.59c6.8 3.08 14.49 3.08 21.29 0L499.59 276.3c16.55-7.5 16.55-32.5 0-40zm0 127.8l-57.87-26.23-161.86 73.37c-7.56 3.43-15.59 5.17-23.86 5.17s-16.29-1.74-23.86-5.17L70.29 337.87 12.41 364.1c-16.55 7.5-16.55 32.5 0 40l232.94 105.59c6.8 3.08 14.49 3.08 21.29 0L499.59 404.1c16.55-7.5 16.55-32.5 0-40z"}}]})(e)}function S$(e){return Ve({tag:"svg",attr:{viewBox:"0 0 512 512"},child:[{tag:"path",attr:{d:"M80 368H16a16 16 0 0 0-16 16v64a16 16 0 0 0 16 16h64a16 16 0 0 0 16-16v-64a16 16 0 0 0-16-16zm0-320H16A16 16 0 0 0 0 64v64a16 16 0 0 0 16 16h64a16 16 0 0 0 16-16V64a16 16 0 0 0-16-16zm0 160H16a16 16 0 0 0-16 16v64a16 16 0 0 0 16 16h64a16 16 0 0 0 16-16v-64a16 16 0 0 0-16-16zm416 176H176a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h320a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16zm0-320H176a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h320a16 16 0 0 0 16-16V80a16 16 0 0 0-16-16zm0 160H176a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h320a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16z"}}]})(e)}function C$(e){return Ve({tag:"svg",attr:{viewBox:"0 0 384 512"},child:[{tag:"path",attr:{d:"M172.268 501.67C26.97 291.031 0 269.413 0 192 0 85.961 85.961 0 192 0s192 85.961 192 192c0 77.413-26.97 99.031-172.268 309.67-9.535 13.774-29.93 13.773-39.464 0zM192 272c44.183 0 80-35.817 80-80s-35.817-80-80-80-80 35.817-80 80 35.817 80 80 80z"}}]})(e)}function _$(e){return Ve({tag:"svg",attr:{viewBox:"0 0 640 512"},child:[{tag:"path",attr:{d:"M320.67 64c-442.6 0-357.57 384-158.46 384 39.9 0 77.47-20.69 101.42-55.86l25.73-37.79c15.66-22.99 46.97-22.99 62.63 0l25.73 37.79C401.66 427.31 439.23 448 479.13 448c189.86 0 290.63-384-158.46-384zM184 308.36c-41.06 0-67.76-25.66-80.08-41.05-5.23-6.53-5.23-16.09 0-22.63 12.32-15.4 39.01-41.05 80.08-41.05s67.76 25.66 80.08 41.05c5.23 6.53 5.23 16.09 0 22.63-12.32 15.4-39.02 41.05-80.08 41.05zm272 0c-41.06 0-67.76-25.66-80.08-41.05-5.23-6.53-5.23-16.09 0-22.63 12.32-15.4 39.01-41.05 80.08-41.05s67.76 25.66 80.08 41.05c5.23 6.53 5.23 16.09 0 22.63-12.32 15.4-39.02 41.05-80.08 41.05z"}}]})(e)}function k$(e){return Ve({tag:"svg",attr:{viewBox:"0 0 448 512"},child:[{tag:"path",attr:{d:"M416 208H32c-17.67 0-32 14.33-32 32v32c0 17.67 14.33 32 32 32h384c17.67 0 32-14.33 32-32v-32c0-17.67-14.33-32-32-32z"}}]})(e)}function P$(e){return Ve({tag:"svg",attr:{viewBox:"0 0 512 512"},child:[{tag:"path",attr:{d:"M283.211 512c78.962 0 151.079-35.925 198.857-94.792 7.068-8.708-.639-21.43-11.562-19.35-124.203 23.654-238.262-71.576-238.262-196.954 0-72.222 38.662-138.635 101.498-174.394 9.686-5.512 7.25-20.197-3.756-22.23A258.156 258.156 0 0 0 283.211 0c-141.309 0-256 114.511-256 256 0 141.309 114.511 256 256 256z"}}]})(e)}function z5(e){return Ve({tag:"svg",attr:{viewBox:"0 0 512 512"},child:[{tag:"path",attr:{d:"M167.02 309.34c-40.12 2.58-76.53 17.86-97.19 72.3-2.35 6.21-8 9.98-14.59 9.98-11.11 0-45.46-27.67-55.25-34.35C0 439.62 37.93 512 128 512c75.86 0 128-43.77 128-120.19 0-3.11-.65-6.08-.97-9.13l-88.01-73.34zM457.89 0c-15.16 0-29.37 6.71-40.21 16.45C213.27 199.05 192 203.34 192 257.09c0 13.7 3.25 26.76 8.73 38.7l63.82 53.18c7.21 1.8 14.64 3.03 22.39 3.03 62.11 0 98.11-45.47 211.16-256.46 7.38-14.35 13.9-29.85 13.9-45.99C512 20.64 486 0 457.89 0z"}}]})(e)}function L5(e){return Ve({tag:"svg",attr:{viewBox:"0 0 448 512"},child:[{tag:"path",attr:{d:"M424.4 214.7L72.4 6.6C43.8-10.3 0 6.1 0 47.9V464c0 37.5 40.7 60.1 72.4 41.3l352-208c31.4-18.5 31.5-64.1 0-82.6z"}}]})(e)}function Tu(e){return Ve({tag:"svg",attr:{viewBox:"0 0 448 512"},child:[{tag:"path",attr:{d:"M416 208H272V64c0-17.67-14.33-32-32-32h-32c-17.67 0-32 14.33-32 32v144H32c-17.67 0-32 14.33-32 32v32c0 17.67 14.33 32 32 32h144v144c0 17.67 14.33 32 32 32h32c17.67 0 32-14.33 32-32V304h144c17.67 0 32-14.33 32-32v-32c0-17.67-14.33-32-32-32z"}}]})(e)}function B5(e){return Ve({tag:"svg",attr:{viewBox:"0 0 512 512"},child:[{tag:"path",attr:{d:"M464 32H336c-26.5 0-48 21.5-48 48v128c0 26.5 21.5 48 48 48h80v64c0 35.3-28.7 64-64 64h-8c-13.3 0-24 10.7-24 24v48c0 13.3 10.7 24 24 24h8c88.4 0 160-71.6 160-160V80c0-26.5-21.5-48-48-48zm-288 0H48C21.5 32 0 53.5 0 80v128c0 26.5 21.5 48 48 48h80v64c0 35.3-28.7 64-64 64h-8c-13.3 0-24 10.7-24 24v48c0 13.3 10.7 24 24 24h8c88.4 0 160-71.6 160-160V80c0-26.5-21.5-48-48-48z"}}]})(e)}function j$(e){return Ve({tag:"svg",attr:{viewBox:"0 0 512 512"},child:[{tag:"path",attr:{d:"M504.971 359.029c9.373 9.373 9.373 24.569 0 33.941l-80 79.984c-15.01 15.01-40.971 4.49-40.971-16.971V416h-58.785a12.004 12.004 0 0 1-8.773-3.812l-70.556-75.596 53.333-57.143L352 336h32v-39.981c0-21.438 25.943-31.998 40.971-16.971l80 79.981zM12 176h84l52.781 56.551 53.333-57.143-70.556-75.596A11.999 11.999 0 0 0 122.785 96H12c-6.627 0-12 5.373-12 12v56c0 6.627 5.373 12 12 12zm372 0v39.984c0 21.46 25.961 31.98 40.971 16.971l80-79.984c9.373-9.373 9.373-24.569 0-33.941l-80-79.981C409.943 24.021 384 34.582 384 56.019V96h-58.785a12.004 12.004 0 0 0-8.773 3.812L96 336H12c-6.627 0-12 5.373-12 12v56c0 6.627 5.373 12 12 12h110.785c3.326 0 6.503-1.381 8.773-3.812L352 176h32z"}}]})(e)}function I$(e){return Ve({tag:"svg",attr:{viewBox:"0 0 512 512"},child:[{tag:"path",attr:{d:"M500.33 0h-47.41a12 12 0 0 0-12 12.57l4 82.76A247.42 247.42 0 0 0 256 8C119.34 8 7.9 119.53 8 256.19 8.1 393.07 119.1 504 256 504a247.1 247.1 0 0 0 166.18-63.91 12 12 0 0 0 .48-17.43l-34-34a12 12 0 0 0-16.38-.55A176 176 0 1 1 402.1 157.8l-101.53-4.87a12 12 0 0 0-12.57 12v47.41a12 12 0 0 0 12 12h200.33a12 12 0 0 0 12-12V12a12 12 0 0 0-12-12z"}}]})(e)}function ph(e){return Ve({tag:"svg",attr:{viewBox:"0 0 448 512"},child:[{tag:"path",attr:{d:"M433.941 129.941l-83.882-83.882A48 48 0 0 0 316.118 32H48C21.49 32 0 53.49 0 80v352c0 26.51 21.49 48 48 48h352c26.51 0 48-21.49 48-48V163.882a48 48 0 0 0-14.059-33.941zM224 416c-35.346 0-64-28.654-64-64 0-35.346 28.654-64 64-64s64 28.654 64 64c0 35.346-28.654 64-64 64zm96-304.52V212c0 6.627-5.373 12-12 12H76c-6.627 0-12-5.373-12-12V108c0-6.627 5.373-12 12-12h228.52c3.183 0 6.235 1.264 8.485 3.515l3.48 3.48A11.996 11.996 0 0 1 320 111.48z"}}]})(e)}function E$(e){return Ve({tag:"svg",attr:{viewBox:"0 0 512 512"},child:[{tag:"path",attr:{d:"M505 442.7L405.3 343c-4.5-4.5-10.6-7-17-7H372c27.6-35.3 44-79.7 44-128C416 93.1 322.9 0 208 0S0 93.1 0 208s93.1 208 208 208c48.3 0 92.7-16.4 128-44v16.3c0 6.4 2.5 12.5 7 17l99.7 99.7c9.4 9.4 24.6 9.4 33.9 0l28.3-28.3c9.4-9.4 9.4-24.6.1-34zM208 336c-70.7 0-128-57.2-128-128 0-70.7 57.2-128 128-128 70.7 0 128 57.2 128 128 0 70.7-57.2 128-128 128z"}}]})(e)}function F5(e){return Ve({tag:"svg",attr:{viewBox:"0 0 512 512"},child:[{tag:"path",attr:{d:"M64 96H0c0 123.7 100.3 224 224 224v144c0 8.8 7.2 16 16 16h32c8.8 0 16-7.2 16-16V320C288 196.3 187.7 96 64 96zm384-64c-84.2 0-157.4 46.5-195.7 115.2 27.7 30.2 48.2 66.9 59 107.6C424 243.1 512 147.9 512 32h-64z"}}]})(e)}function O$(e){return Ve({tag:"svg",attr:{viewBox:"0 0 512 512"},child:[{tag:"path",attr:{d:"M480 160H32c-17.673 0-32-14.327-32-32V64c0-17.673 14.327-32 32-32h448c17.673 0 32 14.327 32 32v64c0 17.673-14.327 32-32 32zm-48-88c-13.255 0-24 10.745-24 24s10.745 24 24 24 24-10.745 24-24-10.745-24-24-24zm-64 0c-13.255 0-24 10.745-24 24s10.745 24 24 24 24-10.745 24-24-10.745-24-24-24zm112 248H32c-17.673 0-32-14.327-32-32v-64c0-17.673 14.327-32 32-32h448c17.673 0 32 14.327 32 32v64c0 17.673-14.327 32-32 32zm-48-88c-13.255 0-24 10.745-24 24s10.745 24 24 24 24-10.745 24-24-10.745-24-24-24zm-64 0c-13.255 0-24 10.745-24 24s10.745 24 24 24 24-10.745 24-24-10.745-24-24-24zm112 248H32c-17.673 0-32-14.327-32-32v-64c0-17.673 14.327-32 32-32h448c17.673 0 32 14.327 32 32v64c0 17.673-14.327 32-32 32zm-48-88c-13.255 0-24 10.745-24 24s10.745 24 24 24 24-10.745 24-24-10.745-24-24-24zm-64 0c-13.255 0-24 10.745-24 24s10.745 24 24 24 24-10.745 24-24-10.745-24-24-24z"}}]})(e)}function M$(e){return Ve({tag:"svg",attr:{viewBox:"0 0 448 512"},child:[{tag:"path",attr:{d:"M352 320c-22.608 0-43.387 7.819-59.79 20.895l-102.486-64.054a96.551 96.551 0 0 0 0-41.683l102.486-64.054C308.613 184.181 329.392 192 352 192c53.019 0 96-42.981 96-96S405.019 0 352 0s-96 42.981-96 96c0 7.158.79 14.13 2.276 20.841L155.79 180.895C139.387 167.819 118.608 160 96 160c-53.019 0-96 42.981-96 96s42.981 96 96 96c22.608 0 43.387-7.819 59.79-20.895l102.486 64.054A96.301 96.301 0 0 0 256 416c0 53.019 42.981 96 96 96s96-42.981 96-96-42.981-96-96-96z"}}]})(e)}function m2(e){return Ve({tag:"svg",attr:{viewBox:"0 0 512 512"},child:[{tag:"path",attr:{d:"M503.691 189.836L327.687 37.851C312.281 24.546 288 35.347 288 56.015v80.053C127.371 137.907 0 170.1 0 322.326c0 61.441 39.581 122.309 83.333 154.132 13.653 9.931 33.111-2.533 28.077-18.631C66.066 312.814 132.917 274.316 288 272.085V360c0 20.7 24.3 31.453 39.687 18.164l176.004-152c11.071-9.562 11.086-26.753 0-36.328z"}}]})(e)}function Kv(e){return Ve({tag:"svg",attr:{viewBox:"0 0 512 512"},child:[{tag:"path",attr:{d:"M496 384H160v-16c0-8.8-7.2-16-16-16h-32c-8.8 0-16 7.2-16 16v16H16c-8.8 0-16 7.2-16 16v32c0 8.8 7.2 16 16 16h80v16c0 8.8 7.2 16 16 16h32c8.8 0 16-7.2 16-16v-16h336c8.8 0 16-7.2 16-16v-32c0-8.8-7.2-16-16-16zm0-160h-80v-16c0-8.8-7.2-16-16-16h-32c-8.8 0-16 7.2-16 16v16H16c-8.8 0-16 7.2-16 16v32c0 8.8 7.2 16 16 16h336v16c0 8.8 7.2 16 16 16h32c8.8 0 16-7.2 16-16v-16h80c8.8 0 16-7.2 16-16v-32c0-8.8-7.2-16-16-16zm0-160H288V48c0-8.8-7.2-16-16-16h-32c-8.8 0-16 7.2-16 16v16H16C7.2 64 0 71.2 0 80v32c0 8.8 7.2 16 16 16h208v16c0 8.8 7.2 16 16 16h32c8.8 0 16-7.2 16-16v-16h208c8.8 0 16-7.2 16-16V80c0-8.8-7.2-16-16-16z"}}]})(e)}function R$(e){return Ve({tag:"svg",attr:{viewBox:"0 0 512 512"},child:[{tag:"path",attr:{d:"M256 160c-52.9 0-96 43.1-96 96s43.1 96 96 96 96-43.1 96-96-43.1-96-96-96zm246.4 80.5l-94.7-47.3 33.5-100.4c4.5-13.6-8.4-26.5-21.9-21.9l-100.4 33.5-47.4-94.8c-6.4-12.8-24.6-12.8-31 0l-47.3 94.7L92.7 70.8c-13.6-4.5-26.5 8.4-21.9 21.9l33.5 100.4-94.7 47.4c-12.8 6.4-12.8 24.6 0 31l94.7 47.3-33.5 100.5c-4.5 13.6 8.4 26.5 21.9 21.9l100.4-33.5 47.3 94.7c6.4 12.8 24.6 12.8 31 0l47.3-94.7 100.4 33.5c13.6 4.5 26.5-8.4 21.9-21.9l-33.5-100.4 94.7-47.3c13-6.5 13-24.7.2-31.1zm-155.9 106c-49.9 49.9-131.1 49.9-181 0-49.9-49.9-49.9-131.1 0-181 49.9-49.9 131.1-49.9 181 0 49.9 49.9 49.9 131.1 0 181z"}}]})(e)}function D$(e){return Ve({tag:"svg",attr:{viewBox:"0 0 512 512"},child:[{tag:"path",attr:{d:"M370.72 133.28C339.458 104.008 298.888 87.962 255.848 88c-77.458.068-144.328 53.178-162.791 126.85-1.344 5.363-6.122 9.15-11.651 9.15H24.103c-7.498 0-13.194-6.807-11.807-14.176C33.933 94.924 134.813 8 256 8c66.448 0 126.791 26.136 171.315 68.685L463.03 40.97C478.149 25.851 504 36.559 504 57.941V192c0 13.255-10.745 24-24 24H345.941c-21.382 0-32.09-25.851-16.971-40.971l41.75-41.749zM32 296h134.059c21.382 0 32.09 25.851 16.971 40.971l-41.75 41.75c31.262 29.273 71.835 45.319 114.876 45.28 77.418-.07 144.315-53.144 162.787-126.849 1.344-5.363 6.122-9.15 11.651-9.15h57.304c7.498 0 13.194 6.807 11.807 14.176C478.067 417.076 377.187 504 256 504c-66.448 0-126.791-26.136-171.315-68.685L48.97 471.03C33.851 486.149 8 475.441 8 454.059V320c0-13.255 10.745-24 24-24z"}}]})(e)}function T$(e){return Ve({tag:"svg",attr:{viewBox:"0 0 512 512"},child:[{tag:"path",attr:{d:"M440.65 12.57l4 82.77A247.16 247.16 0 0 0 255.83 8C134.73 8 33.91 94.92 12.29 209.82A12 12 0 0 0 24.09 224h49.05a12 12 0 0 0 11.67-9.26 175.91 175.91 0 0 1 317-56.94l-101.46-4.86a12 12 0 0 0-12.57 12v47.41a12 12 0 0 0 12 12H500a12 12 0 0 0 12-12V12a12 12 0 0 0-12-12h-47.37a12 12 0 0 0-11.98 12.57zM255.83 432a175.61 175.61 0 0 1-146-77.8l101.8 4.87a12 12 0 0 0 12.57-12v-47.4a12 12 0 0 0-12-12H12a12 12 0 0 0-12 12V500a12 12 0 0 0 12 12h47.35a12 12 0 0 0 12-12.6l-4.15-82.57A247.17 247.17 0 0 0 255.83 504c121.11 0 221.93-86.92 243.55-201.82a12 12 0 0 0-11.8-14.18h-49.05a12 12 0 0 0-11.67 9.26A175.86 175.86 0 0 1 255.83 432z"}}]})(e)}function A$(e){return Ve({tag:"svg",attr:{viewBox:"0 0 352 512"},child:[{tag:"path",attr:{d:"M242.72 256l100.07-100.07c12.28-12.28 12.28-32.19 0-44.48l-22.24-22.24c-12.28-12.28-32.19-12.28-44.48 0L176 189.28 75.93 89.21c-12.28-12.28-32.19-12.28-44.48 0L9.21 111.45c-12.28 12.28-12.28 32.19 0 44.48L109.28 256 9.21 356.07c-12.28 12.28-12.28 32.19 0 44.48l22.24 22.24c12.28 12.28 32.2 12.28 44.48 0L176 322.72l100.07 100.07c12.28 12.28 32.2 12.28 44.48 0l22.24-22.24c12.28-12.28 12.28-32.19 0-44.48L242.72 256z"}}]})(e)}function yo(e){return Ve({tag:"svg",attr:{viewBox:"0 0 448 512"},child:[{tag:"path",attr:{d:"M432 32H312l-9.4-18.7A24 24 0 0 0 281.1 0H166.8a23.72 23.72 0 0 0-21.4 13.3L136 32H16A16 16 0 0 0 0 48v32a16 16 0 0 0 16 16h416a16 16 0 0 0 16-16V48a16 16 0 0 0-16-16zM53.2 467a48 48 0 0 0 47.9 45h245.8a48 48 0 0 0 47.9-45L416 128H32z"}}]})(e)}function Yv(e){return Ve({tag:"svg",attr:{viewBox:"0 0 512 512"},child:[{tag:"path",attr:{d:"M212.333 224.333H12c-6.627 0-12-5.373-12-12V12C0 5.373 5.373 0 12 0h48c6.627 0 12 5.373 12 12v78.112C117.773 39.279 184.26 7.47 258.175 8.007c136.906.994 246.448 111.623 246.157 248.532C504.041 393.258 393.12 504 256.333 504c-64.089 0-122.496-24.313-166.51-64.215-5.099-4.622-5.334-12.554-.467-17.42l33.967-33.967c4.474-4.474 11.662-4.717 16.401-.525C170.76 415.336 211.58 432 256.333 432c97.268 0 176-78.716 176-176 0-97.267-78.716-176-176-176-58.496 0-110.28 28.476-142.274 72.333h98.274c6.627 0 12 5.373 12 12v48c0 6.627-5.373 12-12 12z"}}]})(e)}function Au(e){return Ve({tag:"svg",attr:{viewBox:"0 0 512 512"},child:[{tag:"path",attr:{d:"M296 384h-80c-13.3 0-24-10.7-24-24V192h-87.7c-17.8 0-26.7-21.5-14.1-34.1L242.3 5.7c7.5-7.5 19.8-7.5 27.3 0l152.2 152.2c12.6 12.6 3.7 34.1-14.1 34.1H320v168c0 13.3-10.7 24-24 24zm216-8v112c0 13.3-10.7 24-24 24H24c-13.3 0-24-10.7-24-24V376c0-13.3 10.7-24 24-24h136v8c0 30.9 25.1 56 56 56h80c30.9 0 56-25.1 56-56v-8h136c13.3 0 24 10.7 24 24zm-124 88c0-11-9-20-20-20s-20 9-20 20 9 20 20 20 20-9 20-20zm64 0c0-11-9-20-20-20s-20 9-20 20 9 20 20 20 20-9 20-20z"}}]})(e)}function Qv(e){return Ve({tag:"svg",attr:{viewBox:"0 0 512 512"},child:[{tag:"path",attr:{d:"M507.73 109.1c-2.24-9.03-13.54-12.09-20.12-5.51l-74.36 74.36-67.88-11.31-11.31-67.88 74.36-74.36c6.62-6.62 3.43-17.9-5.66-20.16-47.38-11.74-99.55.91-136.58 37.93-39.64 39.64-50.55 97.1-34.05 147.2L18.74 402.76c-24.99 24.99-24.99 65.51 0 90.5 24.99 24.99 65.51 24.99 90.5 0l213.21-213.21c50.12 16.71 107.47 5.68 147.37-34.22 37.07-37.07 49.7-89.32 37.91-136.73zM64 472c-13.25 0-24-10.75-24-24 0-13.26 10.75-24 24-24s24 10.74 24 24c0 13.25-10.75 24-24 24z"}}]})(e)}var H5=Cu({displayName:"ExternalLinkIcon",path:a.jsxs("g",{fill:"none",stroke:"currentColor",strokeLinecap:"round",strokeWidth:"2",children:[a.jsx("path",{d:"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"}),a.jsx("path",{d:"M15 3h6v6"}),a.jsx("path",{d:"M10 14L21 3"})]})}),Xv=Cu({d:"M12 8l-6 6 1.41 1.41L12 10.83l4.59 4.58L18 14z",displayName:"ChevronUpIcon"}),N$=Cu({displayName:"CloseIcon",d:"M.439,21.44a1.5,1.5,0,0,0,2.122,2.121L11.823,14.3a.25.25,0,0,1,.354,0l9.262,9.263a1.5,1.5,0,1,0,2.122-2.121L14.3,12.177a.25.25,0,0,1,0-.354l9.263-9.262A1.5,1.5,0,0,0,21.439.44L12.177,9.7a.25.25,0,0,1-.354,0L2.561.44A1.5,1.5,0,0,0,.439,2.561L9.7,11.823a.25.25,0,0,1,0,.354Z"}),$$=Cu({displayName:"DeleteIcon",path:a.jsx("g",{fill:"currentColor",children:a.jsx("path",{d:"M19.452 7.5H4.547a.5.5 0 00-.5.545l1.287 14.136A2 2 0 007.326 24h9.347a2 2 0 001.992-1.819L19.95 8.045a.5.5 0 00-.129-.382.5.5 0 00-.369-.163zm-9.2 13a.75.75 0 01-1.5 0v-9a.75.75 0 011.5 0zm5 0a.75.75 0 01-1.5 0v-9a.75.75 0 011.5 0zM22 4h-4.75a.25.25 0 01-.25-.25V2.5A2.5 2.5 0 0014.5 0h-5A2.5 2.5 0 007 2.5v1.25a.25.25 0 01-.25.25H2a1 1 0 000 2h20a1 1 0 000-2zM9 3.75V2.5a.5.5 0 01.5-.5h5a.5.5 0 01.5.5v1.25a.25.25 0 01-.25.25h-5.5A.25.25 0 019 3.75z"})})}),z$=Cu({displayName:"ChevronDownIcon",d:"M16.59 8.59L12 13.17 7.41 8.59 6 10l6 6 6-6z"});/*! + * OverlayScrollbars + * Version: 2.2.1 + * + * Copyright (c) Rene Haas | KingSora. + * https://github.com/KingSora + * + * Released under the MIT license. + */function gn(e,t){if(mh(e))for(let n=0;nt(e[n],n,e));return e}function Xr(e,t){const n=ri(t);if(bs(t)||n){let o=n?"":{};if(e){const s=window.getComputedStyle(e,null);o=n?b2(e,s,t):t.reduce((i,u)=>(i[u]=b2(e,s,u),i),o)}return o}e&&gn(Oo(t),o=>ez(e,o,t[o]))}const is=(e,t)=>{const{o:n,u:r,_:o}=e;let s=n,i;const u=(h,g)=>{const v=s,b=h,S=g||(r?!r(v,b):v!==b);return(S||o)&&(s=b,i=v),[s,S,i]};return[t?h=>u(t(s,i),h):u,h=>[s,!!h,i]]},Nu=()=>typeof window<"u",W5=Nu()&&Node.ELEMENT_NODE,{toString:L$,hasOwnProperty:pg}=Object.prototype,_a=e=>e===void 0,hh=e=>e===null,B$=e=>_a(e)||hh(e)?`${e}`:L$.call(e).replace(/^\[object (.+)\]$/,"$1").toLowerCase(),Ya=e=>typeof e=="number",ri=e=>typeof e=="string",Jv=e=>typeof e=="boolean",ys=e=>typeof e=="function",bs=e=>Array.isArray(e),iu=e=>typeof e=="object"&&!bs(e)&&!hh(e),mh=e=>{const t=!!e&&e.length,n=Ya(t)&&t>-1&&t%1==0;return bs(e)||!ys(e)&&n?t>0&&iu(e)?t-1 in e:!0:!1},y0=e=>{if(!e||!iu(e)||B$(e)!=="object")return!1;let t;const n="constructor",r=e[n],o=r&&r.prototype,s=pg.call(e,n),i=o&&pg.call(o,"isPrototypeOf");if(r&&!s&&!i)return!1;for(t in e);return _a(t)||pg.call(e,t)},Hf=e=>{const t=HTMLElement;return e?t?e instanceof t:e.nodeType===W5:!1},gh=e=>{const t=Element;return e?t?e instanceof t:e.nodeType===W5:!1},Zv=(e,t,n)=>e.indexOf(t,n),In=(e,t,n)=>(!n&&!ri(t)&&mh(t)?Array.prototype.push.apply(e,t):e.push(t),e),Mi=e=>{const t=Array.from,n=[];return t&&e?t(e):(e instanceof Set?e.forEach(r=>{In(n,r)}):gn(e,r=>{In(n,r)}),n)},e1=e=>!!e&&e.length===0,Ys=(e,t,n)=>{gn(e,o=>o&&o.apply(void 0,t||[])),!n&&(e.length=0)},vh=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),Oo=e=>e?Object.keys(e):[],nr=(e,t,n,r,o,s,i)=>{const u=[t,n,r,o,s,i];return(typeof e!="object"||hh(e))&&!ys(e)&&(e={}),gn(u,d=>{gn(Oo(d),p=>{const h=d[p];if(e===h)return!0;const g=bs(h);if(h&&(y0(h)||g)){const v=e[p];let b=v;g&&!bs(v)?b=[]:!g&&!y0(v)&&(b={}),e[p]=nr(b,h)}else e[p]=h})}),e},t1=e=>{for(const t in e)return!1;return!0},V5=(e,t,n,r)=>{if(_a(r))return n?n[e]:t;n&&(ri(r)||Ya(r))&&(n[e]=r)},Qr=(e,t,n)=>{if(_a(n))return e?e.getAttribute(t):null;e&&e.setAttribute(t,n)},ho=(e,t)=>{e&&e.removeAttribute(t)},Si=(e,t,n,r)=>{if(n){const o=Qr(e,t)||"",s=new Set(o.split(" "));s[r?"add":"delete"](n);const i=Mi(s).join(" ").trim();Qr(e,t,i)}},F$=(e,t,n)=>{const r=Qr(e,t)||"";return new Set(r.split(" ")).has(n)},fs=(e,t)=>V5("scrollLeft",0,e,t),ca=(e,t)=>V5("scrollTop",0,e,t),b0=Nu()&&Element.prototype,U5=(e,t)=>{const n=[],r=t?gh(t)?t:null:document;return r?In(n,r.querySelectorAll(e)):n},H$=(e,t)=>{const n=t?gh(t)?t:null:document;return n?n.querySelector(e):null},Wf=(e,t)=>gh(e)?(b0.matches||b0.msMatchesSelector).call(e,t):!1,n1=e=>e?Mi(e.childNodes):[],ba=e=>e?e.parentElement:null,yl=(e,t)=>{if(gh(e)){const n=b0.closest;if(n)return n.call(e,t);do{if(Wf(e,t))return e;e=ba(e)}while(e)}return null},W$=(e,t,n)=>{const r=e&&yl(e,t),o=e&&H$(n,r),s=yl(o,t)===r;return r&&o?r===e||o===e||s&&yl(yl(e,n),t)!==r:!1},r1=(e,t,n)=>{if(n&&e){let r=t,o;mh(n)?(o=document.createDocumentFragment(),gn(n,s=>{s===r&&(r=s.previousSibling),o.appendChild(s)})):o=n,t&&(r?r!==t&&(r=r.nextSibling):r=e.firstChild),e.insertBefore(o,r||null)}},Go=(e,t)=>{r1(e,null,t)},V$=(e,t)=>{r1(ba(e),e,t)},g2=(e,t)=>{r1(ba(e),e&&e.nextSibling,t)},Us=e=>{if(mh(e))gn(Mi(e),t=>Us(t));else if(e){const t=ba(e);t&&t.removeChild(e)}},Ci=e=>{const t=document.createElement("div");return e&&Qr(t,"class",e),t},G5=e=>{const t=Ci();return t.innerHTML=e.trim(),gn(n1(t),n=>Us(n))},x0=e=>e.charAt(0).toUpperCase()+e.slice(1),U$=()=>Ci().style,G$=["-webkit-","-moz-","-o-","-ms-"],q$=["WebKit","Moz","O","MS","webkit","moz","o","ms"],hg={},mg={},K$=e=>{let t=mg[e];if(vh(mg,e))return t;const n=x0(e),r=U$();return gn(G$,o=>{const s=o.replace(/-/g,"");return!(t=[e,o+e,s+n,x0(s)+n].find(u=>r[u]!==void 0))}),mg[e]=t||""},$u=e=>{if(Nu()){let t=hg[e]||window[e];return vh(hg,e)||(gn(q$,n=>(t=t||window[n+x0(e)],!t)),hg[e]=t),t}},Y$=$u("MutationObserver"),v2=$u("IntersectionObserver"),bl=$u("ResizeObserver"),q5=$u("cancelAnimationFrame"),K5=$u("requestAnimationFrame"),Vf=Nu()&&window.setTimeout,w0=Nu()&&window.clearTimeout,Q$=/[^\x20\t\r\n\f]+/g,Y5=(e,t,n)=>{const r=e&&e.classList;let o,s=0,i=!1;if(r&&t&&ri(t)){const u=t.match(Q$)||[];for(i=u.length>0;o=u[s++];)i=!!n(r,o)&&i}return i},o1=(e,t)=>{Y5(e,t,(n,r)=>n.remove(r))},ua=(e,t)=>(Y5(e,t,(n,r)=>n.add(r)),o1.bind(0,e,t)),yh=(e,t,n,r)=>{if(e&&t){let o=!0;return gn(n,s=>{const i=r?r(e[s]):e[s],u=r?r(t[s]):t[s];i!==u&&(o=!1)}),o}return!1},Q5=(e,t)=>yh(e,t,["w","h"]),X5=(e,t)=>yh(e,t,["x","y"]),X$=(e,t)=>yh(e,t,["t","r","b","l"]),y2=(e,t,n)=>yh(e,t,["width","height"],n&&(r=>Math.round(r))),Uo=()=>{},ml=e=>{let t;const n=e?Vf:K5,r=e?w0:q5;return[o=>{r(t),t=n(o,ys(e)?e():e)},()=>r(t)]},s1=(e,t)=>{let n,r,o,s=Uo;const{v:i,g:u,p:d}=t||{},p=function(S){s(),w0(n),n=r=void 0,s=Uo,e.apply(this,S)},h=b=>d&&r?d(r,b):b,g=()=>{s!==Uo&&p(h(o)||o)},v=function(){const S=Mi(arguments),w=ys(i)?i():i;if(Ya(w)&&w>=0){const _=ys(u)?u():u,k=Ya(_)&&_>=0,j=w>0?Vf:K5,E=w>0?w0:q5,O=h(S)||S,M=p.bind(0,O);s();const T=j(M,w);s=()=>E(T),k&&!n&&(n=Vf(g,_)),r=o=O}else p(S)};return v.m=g,v},J$={opacity:1,zindex:1},zd=(e,t)=>{const n=t?parseFloat(e):parseInt(e,10);return n===n?n:0},Z$=(e,t)=>!J$[e.toLowerCase()]&&Ya(t)?`${t}px`:t,b2=(e,t,n)=>t!=null?t[n]||t.getPropertyValue(n):e.style[n],ez=(e,t,n)=>{try{const{style:r}=e;_a(r[t])?r.setProperty(t,n):r[t]=Z$(t,n)}catch{}},lu=e=>Xr(e,"direction")==="rtl",x2=(e,t,n)=>{const r=t?`${t}-`:"",o=n?`-${n}`:"",s=`${r}top${o}`,i=`${r}right${o}`,u=`${r}bottom${o}`,d=`${r}left${o}`,p=Xr(e,[s,i,u,d]);return{t:zd(p[s],!0),r:zd(p[i],!0),b:zd(p[u],!0),l:zd(p[d],!0)}},{round:w2}=Math,a1={w:0,h:0},cu=e=>e?{w:e.offsetWidth,h:e.offsetHeight}:a1,yf=e=>e?{w:e.clientWidth,h:e.clientHeight}:a1,Uf=e=>e?{w:e.scrollWidth,h:e.scrollHeight}:a1,Gf=e=>{const t=parseFloat(Xr(e,"height"))||0,n=parseFloat(Xr(e,"width"))||0;return{w:n-w2(n),h:t-w2(t)}},Fs=e=>e.getBoundingClientRect();let Ld;const tz=()=>{if(_a(Ld)){Ld=!1;try{window.addEventListener("test",null,Object.defineProperty({},"passive",{get(){Ld=!0}}))}catch{}}return Ld},J5=e=>e.split(" "),nz=(e,t,n,r)=>{gn(J5(t),o=>{e.removeEventListener(o,n,r)})},Ir=(e,t,n,r)=>{var o;const s=tz(),i=(o=s&&r&&r.S)!=null?o:s,u=r&&r.$||!1,d=r&&r.C||!1,p=[],h=s?{passive:i,capture:u}:u;return gn(J5(t),g=>{const v=d?b=>{e.removeEventListener(g,v,u),n&&n(b)}:n;In(p,nz.bind(null,e,g,v,u)),e.addEventListener(g,v,h)}),Ys.bind(0,p)},Z5=e=>e.stopPropagation(),e_=e=>e.preventDefault(),rz={x:0,y:0},gg=e=>{const t=e?Fs(e):0;return t?{x:t.left+window.pageYOffset,y:t.top+window.pageXOffset}:rz},S2=(e,t)=>{gn(bs(t)?t:[t],e)},i1=e=>{const t=new Map,n=(s,i)=>{if(s){const u=t.get(s);S2(d=>{u&&u[d?"delete":"clear"](d)},i)}else t.forEach(u=>{u.clear()}),t.clear()},r=(s,i)=>{if(ri(s)){const p=t.get(s)||new Set;return t.set(s,p),S2(h=>{ys(h)&&p.add(h)},i),n.bind(0,s,i)}Jv(i)&&i&&n();const u=Oo(s),d=[];return gn(u,p=>{const h=s[p];h&&In(d,r(p,h))}),Ys.bind(0,d)},o=(s,i)=>{const u=t.get(s);gn(Mi(u),d=>{i&&!e1(i)?d.apply(0,i):d()})};return r(e||{}),[r,n,o]},C2=e=>JSON.stringify(e,(t,n)=>{if(ys(n))throw new Error;return n}),oz={paddingAbsolute:!1,showNativeOverlaidScrollbars:!1,update:{elementEvents:[["img","load"]],debounce:[0,33],attributes:null,ignoreMutation:null},overflow:{x:"scroll",y:"scroll"},scrollbars:{theme:"os-theme-dark",visibility:"auto",autoHide:"never",autoHideDelay:1300,dragScroll:!0,clickScroll:!1,pointers:["mouse","touch","pen"]}},t_=(e,t)=>{const n={},r=Oo(t).concat(Oo(e));return gn(r,o=>{const s=e[o],i=t[o];if(iu(s)&&iu(i))nr(n[o]={},t_(s,i)),t1(n[o])&&delete n[o];else if(vh(t,o)&&i!==s){let u=!0;if(bs(s)||bs(i))try{C2(s)===C2(i)&&(u=!1)}catch{}u&&(n[o]=i)}}),n},n_="os-environment",r_=`${n_}-flexbox-glue`,sz=`${r_}-max`,o_="os-scrollbar-hidden",vg="data-overlayscrollbars-initialize",ls="data-overlayscrollbars",s_=`${ls}-overflow-x`,a_=`${ls}-overflow-y`,El="overflowVisible",az="scrollbarHidden",_2="scrollbarPressed",qf="updating",La="data-overlayscrollbars-viewport",yg="arrange",i_="scrollbarHidden",Ol=El,S0="data-overlayscrollbars-padding",iz=Ol,k2="data-overlayscrollbars-content",l1="os-size-observer",lz=`${l1}-appear`,cz=`${l1}-listener`,uz="os-trinsic-observer",dz="os-no-css-vars",fz="os-theme-none",xo="os-scrollbar",pz=`${xo}-rtl`,hz=`${xo}-horizontal`,mz=`${xo}-vertical`,l_=`${xo}-track`,c1=`${xo}-handle`,gz=`${xo}-visible`,vz=`${xo}-cornerless`,P2=`${xo}-transitionless`,j2=`${xo}-interaction`,I2=`${xo}-unusable`,E2=`${xo}-auto-hidden`,O2=`${xo}-wheel`,yz=`${l_}-interactive`,bz=`${c1}-interactive`,c_={},Ri=()=>c_,xz=e=>{const t=[];return gn(bs(e)?e:[e],n=>{const r=Oo(n);gn(r,o=>{In(t,c_[o]=n[o])})}),t},wz="__osOptionsValidationPlugin",Sz="__osSizeObserverPlugin",u1="__osScrollbarsHidingPlugin",Cz="__osClickScrollPlugin";let bg;const M2=(e,t,n,r)=>{Go(e,t);const o=yf(t),s=cu(t),i=Gf(n);return r&&Us(t),{x:s.h-o.h+i.h,y:s.w-o.w+i.w}},_z=e=>{let t=!1;const n=ua(e,o_);try{t=Xr(e,K$("scrollbar-width"))==="none"||window.getComputedStyle(e,"::-webkit-scrollbar").getPropertyValue("display")==="none"}catch{}return n(),t},kz=(e,t)=>{const n="hidden";Xr(e,{overflowX:n,overflowY:n,direction:"rtl"}),fs(e,0);const r=gg(e),o=gg(t);fs(e,-999);const s=gg(t);return{i:r.x===o.x,n:o.x!==s.x}},Pz=(e,t)=>{const n=ua(e,r_),r=Fs(e),o=Fs(t),s=y2(o,r,!0),i=ua(e,sz),u=Fs(e),d=Fs(t),p=y2(d,u,!0);return n(),i(),s&&p},jz=()=>{const{body:e}=document,n=G5(`
`)[0],r=n.firstChild,[o,,s]=i1(),[i,u]=is({o:M2(e,n,r),u:X5},M2.bind(0,e,n,r,!0)),[d]=u(),p=_z(n),h={x:d.x===0,y:d.y===0},g={elements:{host:null,padding:!p,viewport:k=>p&&k===k.ownerDocument.body&&k,content:!1},scrollbars:{slot:!0},cancel:{nativeScrollbarsOverlaid:!1,body:null}},v=nr({},oz),b=nr.bind(0,{},v),S=nr.bind(0,{},g),w={k:d,A:h,I:p,L:Xr(n,"zIndex")==="-1",B:kz(n,r),V:Pz(n,r),Y:o.bind(0,"z"),j:o.bind(0,"r"),N:S,q:k=>nr(g,k)&&S(),F:b,G:k=>nr(v,k)&&b(),X:nr({},g),U:nr({},v)},C=window.addEventListener,_=s1(k=>s(k?"z":"r"),{v:33,g:99});if(ho(n,"style"),Us(n),C("resize",_.bind(0,!1)),!p&&(!h.x||!h.y)){let k;C("resize",()=>{const j=Ri()[u1];k=k||j&&j.R(),k&&k(w,i,_.bind(0,!0))})}return w},wo=()=>(bg||(bg=jz()),bg),d1=(e,t)=>ys(t)?t.apply(0,e):t,Iz=(e,t,n,r)=>{const o=_a(r)?n:r;return d1(e,o)||t.apply(0,e)},u_=(e,t,n,r)=>{const o=_a(r)?n:r,s=d1(e,o);return!!s&&(Hf(s)?s:t.apply(0,e))},Ez=(e,t,n)=>{const{nativeScrollbarsOverlaid:r,body:o}=n||{},{A:s,I:i}=wo(),{nativeScrollbarsOverlaid:u,body:d}=t,p=r??u,h=_a(o)?d:o,g=(s.x||s.y)&&p,v=e&&(hh(h)?!i:h);return!!g||!!v},f1=new WeakMap,Oz=(e,t)=>{f1.set(e,t)},Mz=e=>{f1.delete(e)},d_=e=>f1.get(e),R2=(e,t)=>e?t.split(".").reduce((n,r)=>n&&vh(n,r)?n[r]:void 0,e):void 0,C0=(e,t,n)=>r=>[R2(e,r),n||R2(t,r)!==void 0],f_=e=>{let t=e;return[()=>t,n=>{t=nr({},t,n)}]},Bd="tabindex",Fd=Ci.bind(0,""),xg=e=>{Go(ba(e),n1(e)),Us(e)},Rz=e=>{const t=wo(),{N:n,I:r}=t,o=Ri()[u1],s=o&&o.T,{elements:i}=n(),{host:u,padding:d,viewport:p,content:h}=i,g=Hf(e),v=g?{}:e,{elements:b}=v,{host:S,padding:w,viewport:C,content:_}=b||{},k=g?e:v.target,j=Wf(k,"textarea"),E=k.ownerDocument,I=E.documentElement,O=k===E.body,M=E.defaultView,T=Iz.bind(0,[k]),A=u_.bind(0,[k]),z=d1.bind(0,[k]),$=T.bind(0,Fd,p),ee=A.bind(0,Fd,h),B=$(C),H=B===k,G=H&&O,K=!H&&ee(_),R=!H&&Hf(B)&&B===K,U=R&&!!z(h),V=U?$():B,J=U?K:ee(),xe=G?I:R?V:B,he=j?T(Fd,u,S):k,ae=G?xe:he,Z=R?J:K,W=E.activeElement,re=!H&&M.top===M&&W===k,pe={W:k,Z:ae,J:xe,K:!H&&A(Fd,d,w),tt:Z,nt:!H&&!r&&s&&s(t),ot:G?I:xe,st:G?E:xe,et:M,ct:E,rt:j,it:O,lt:g,ut:H,dt:R,ft:(Pt,yt)=>F$(xe,H?ls:La,H?yt:Pt),_t:(Pt,yt,be)=>Si(xe,H?ls:La,H?yt:Pt,be)},ne=Oo(pe).reduce((Pt,yt)=>{const be=pe[yt];return In(Pt,be&&!ba(be)?be:!1)},[]),ge=Pt=>Pt?Zv(ne,Pt)>-1:null,{W:ue,Z:Ce,K:Re,J:me,tt:_e,nt:We}=pe,Le=[()=>{ho(Ce,ls),ho(Ce,vg),ho(ue,vg),O&&(ho(I,ls),ho(I,vg))}],Ue=j&&ge(Ce);let kt=j?ue:n1([_e,me,Re,Ce,ue].find(Pt=>ge(Pt)===!1));const gt=G?ue:_e||me;return[pe,()=>{Qr(Ce,ls,H?"viewport":"host"),Qr(Re,S0,""),Qr(_e,k2,""),H||Qr(me,La,"");const Pt=O&&!H?ua(ba(k),o_):Uo;if(Ue&&(g2(ue,Ce),In(Le,()=>{g2(Ce,ue),Us(Ce)})),Go(gt,kt),Go(Ce,Re),Go(Re||Ce,!H&&me),Go(me,_e),In(Le,()=>{Pt(),ho(Re,S0),ho(_e,k2),ho(me,s_),ho(me,a_),ho(me,La),ge(_e)&&xg(_e),ge(me)&&xg(me),ge(Re)&&xg(Re)}),r&&!H&&(Si(me,La,i_,!0),In(Le,ho.bind(0,me,La))),We&&(V$(me,We),In(Le,Us.bind(0,We))),re){const yt=Qr(me,Bd);Qr(me,Bd,"-1"),me.focus();const be=()=>yt?Qr(me,Bd,yt):ho(me,Bd),Te=Ir(E,"pointerdown keydown",()=>{be(),Te()});In(Le,[be,Te])}else W&&W.focus&&W.focus();kt=0},Ys.bind(0,Le)]},Dz=(e,t)=>{const{tt:n}=e,[r]=t;return o=>{const{V:s}=wo(),{ht:i}=r(),{vt:u}=o,d=(n||!s)&&u;return d&&Xr(n,{height:i?"":"100%"}),{gt:d,wt:d}}},Tz=(e,t)=>{const[n,r]=t,{Z:o,K:s,J:i,ut:u}=e,[d,p]=is({u:X$,o:x2()},x2.bind(0,o,"padding",""));return(h,g,v)=>{let[b,S]=p(v);const{I:w,V:C}=wo(),{bt:_}=n(),{gt:k,wt:j,yt:E}=h,[I,O]=g("paddingAbsolute");(k||S||!C&&j)&&([b,S]=d(v));const T=!u&&(O||E||S);if(T){const A=!I||!s&&!w,z=b.r+b.l,$=b.t+b.b,ee={marginRight:A&&!_?-z:0,marginBottom:A?-$:0,marginLeft:A&&_?-z:0,top:A?-b.t:0,right:A?_?-b.r:"auto":0,left:A?_?"auto":-b.l:0,width:A?`calc(100% + ${z}px)`:""},B={paddingTop:A?b.t:0,paddingRight:A?b.r:0,paddingBottom:A?b.b:0,paddingLeft:A?b.l:0};Xr(s||i,ee),Xr(i,B),r({K:b,St:!A,P:s?B:nr({},ee,B)})}return{xt:T}}},{max:_0}=Math,Ba=_0.bind(0,0),p_="visible",D2="hidden",Az=42,Hd={u:Q5,o:{w:0,h:0}},Nz={u:X5,o:{x:D2,y:D2}},$z=(e,t)=>{const n=window.devicePixelRatio%1!==0?1:0,r={w:Ba(e.w-t.w),h:Ba(e.h-t.h)};return{w:r.w>n?r.w:0,h:r.h>n?r.h:0}},Wd=e=>e.indexOf(p_)===0,zz=(e,t)=>{const[n,r]=t,{Z:o,K:s,J:i,nt:u,ut:d,_t:p,it:h,et:g}=e,{k:v,V:b,I:S,A:w}=wo(),C=Ri()[u1],_=!d&&!S&&(w.x||w.y),k=h&&d,[j,E]=is(Hd,Gf.bind(0,i)),[I,O]=is(Hd,Uf.bind(0,i)),[M,T]=is(Hd),[A,z]=is(Hd),[$]=is(Nz),ee=(U,V)=>{if(Xr(i,{height:""}),V){const{St:J,K:ie}=n(),{$t:xe,D:he}=U,ae=Gf(o),Z=yf(o),W=Xr(i,"boxSizing")==="content-box",re=J||W?ie.b+ie.t:0,pe=!(w.x&&W);Xr(i,{height:Z.h+ae.h+(xe.x&&pe?he.x:0)-re})}},B=(U,V)=>{const J=!S&&!U?Az:0,ie=(ge,ue,Ce)=>{const Re=Xr(i,ge),_e=(V?V[ge]:Re)==="scroll";return[Re,_e,_e&&!S?ue?J:Ce:0,ue&&!!J]},[xe,he,ae,Z]=ie("overflowX",w.x,v.x),[W,re,pe,ne]=ie("overflowY",w.y,v.y);return{Ct:{x:xe,y:W},$t:{x:he,y:re},D:{x:ae,y:pe},M:{x:Z,y:ne}}},H=(U,V,J,ie)=>{const xe=(re,pe)=>{const ne=Wd(re),ge=pe&&ne&&re.replace(`${p_}-`,"")||"";return[pe&&!ne?re:"",Wd(ge)?"hidden":ge]},[he,ae]=xe(J.x,V.x),[Z,W]=xe(J.y,V.y);return ie.overflowX=ae&&Z?ae:he,ie.overflowY=W&&he?W:Z,B(U,ie)},G=(U,V,J,ie)=>{const{D:xe,M:he}=U,{x:ae,y:Z}=he,{x:W,y:re}=xe,{P:pe}=n(),ne=V?"marginLeft":"marginRight",ge=V?"paddingLeft":"paddingRight",ue=pe[ne],Ce=pe.marginBottom,Re=pe[ge],me=pe.paddingBottom;ie.width=`calc(100% + ${re+-1*ue}px)`,ie[ne]=-re+ue,ie.marginBottom=-W+Ce,J&&(ie[ge]=Re+(Z?re:0),ie.paddingBottom=me+(ae?W:0))},[K,R]=C?C.H(_,b,i,u,n,B,G):[()=>_,()=>[Uo]];return(U,V,J)=>{const{gt:ie,Ot:xe,wt:he,xt:ae,vt:Z,yt:W}=U,{ht:re,bt:pe}=n(),[ne,ge]=V("showNativeOverlaidScrollbars"),[ue,Ce]=V("overflow"),Re=ne&&w.x&&w.y,me=!d&&!b&&(ie||he||xe||ge||Z),_e=Wd(ue.x),We=Wd(ue.y),Le=_e||We;let Ue=E(J),kt=O(J),gt=T(J),Pn=z(J),Pt;if(ge&&S&&p(i_,az,!Re),me&&(Pt=B(Re),ee(Pt,re)),ie||ae||he||W||ge){Le&&p(Ol,El,!1);const[Ee,at]=R(Re,pe,Pt),[Ye,rt]=Ue=j(J),[Nt,dr]=kt=I(J),yn=yf(i);let bn=Nt,zr=yn;Ee(),(dr||rt||ge)&&at&&!Re&&K(at,Nt,Ye,pe)&&(zr=yf(i),bn=Uf(i));const fr={w:Ba(_0(Nt.w,bn.w)+Ye.w),h:Ba(_0(Nt.h,bn.h)+Ye.h)},An={w:Ba((k?g.innerWidth:zr.w+Ba(yn.w-Nt.w))+Ye.w),h:Ba((k?g.innerHeight+Ye.h:zr.h+Ba(yn.h-Nt.h))+Ye.h)};Pn=A(An),gt=M($z(fr,An),J)}const[yt,be]=Pn,[Te,It]=gt,[Ft,Wt]=kt,[Cn,En]=Ue,ln={x:Te.w>0,y:Te.h>0},wr=_e&&We&&(ln.x||ln.y)||_e&&ln.x&&!ln.y||We&&ln.y&&!ln.x;if(ae||W||En||Wt||be||It||Ce||ge||me){const Ee={marginRight:0,marginBottom:0,marginLeft:0,width:"",overflowY:"",overflowX:""},at=H(Re,ln,ue,Ee),Ye=K(at,Ft,Cn,pe);d||G(at,pe,Ye,Ee),me&&ee(at,re),d?(Qr(o,s_,Ee.overflowX),Qr(o,a_,Ee.overflowY)):Xr(i,Ee)}Si(o,ls,El,wr),Si(s,S0,iz,wr),d||Si(i,La,Ol,Le);const[vn,sr]=$(B(Re).Ct);return r({Ct:vn,zt:{x:yt.w,y:yt.h},Tt:{x:Te.w,y:Te.h},Et:ln}),{It:sr,At:be,Lt:It}}},T2=(e,t,n)=>{const r={},o=t||{},s=Oo(e).concat(Oo(o));return gn(s,i=>{const u=e[i],d=o[i];r[i]=!!(n||u||d)}),r},Lz=(e,t)=>{const{W:n,J:r,_t:o,ut:s}=e,{I:i,A:u,V:d}=wo(),p=!i&&(u.x||u.y),h=[Dz(e,t),Tz(e,t),zz(e,t)];return(g,v,b)=>{const S=T2(nr({gt:!1,xt:!1,yt:!1,vt:!1,At:!1,Lt:!1,It:!1,Ot:!1,wt:!1},v),{},b),w=p||!d,C=w&&fs(r),_=w&&ca(r);o("",qf,!0);let k=S;return gn(h,j=>{k=T2(k,j(k,g,!!b)||{},b)}),fs(r,C),ca(r,_),o("",qf),s||(fs(n,0),ca(n,0)),k}},Bz=(e,t,n)=>{let r,o=!1;const s=()=>{o=!0},i=u=>{if(n){const d=n.reduce((p,h)=>{if(h){const[g,v]=h,b=v&&g&&(u?u(g):U5(g,e));b&&b.length&&v&&ri(v)&&In(p,[b,v.trim()],!0)}return p},[]);gn(d,p=>gn(p[0],h=>{const g=p[1],v=r.get(h)||[];if(e.contains(h)){const S=Ir(h,g,w=>{o?(S(),r.delete(h)):t(w)});r.set(h,In(v,S))}else Ys(v),r.delete(h)}))}};return n&&(r=new WeakMap,i()),[s,i]},A2=(e,t,n,r)=>{let o=!1;const{Ht:s,Pt:i,Dt:u,Mt:d,Rt:p,kt:h}=r||{},g=s1(()=>{o&&n(!0)},{v:33,g:99}),[v,b]=Bz(e,g,u),S=s||[],w=i||[],C=S.concat(w),_=(j,E)=>{const I=p||Uo,O=h||Uo,M=new Set,T=new Set;let A=!1,z=!1;if(gn(j,$=>{const{attributeName:ee,target:B,type:H,oldValue:G,addedNodes:K,removedNodes:R}=$,U=H==="attributes",V=H==="childList",J=e===B,ie=U&&ri(ee)?Qr(B,ee):0,xe=ie!==0&&G!==ie,he=Zv(w,ee)>-1&&xe;if(t&&(V||!J)){const ae=!U,Z=U&&xe,W=Z&&d&&Wf(B,d),pe=(W?!I(B,ee,G,ie):ae||Z)&&!O($,!!W,e,r);gn(K,ne=>M.add(ne)),gn(R,ne=>M.add(ne)),z=z||pe}!t&&J&&xe&&!I(B,ee,G,ie)&&(T.add(ee),A=A||he)}),M.size>0&&b($=>Mi(M).reduce((ee,B)=>(In(ee,U5($,B)),Wf(B,$)?In(ee,B):ee),[])),t)return!E&&z&&n(!1),[!1];if(T.size>0||A){const $=[Mi(T),A];return!E&&n.apply(0,$),$}},k=new Y$(j=>_(j));return k.observe(e,{attributes:!0,attributeOldValue:!0,attributeFilter:C,subtree:t,childList:t,characterData:t}),o=!0,[()=>{o&&(v(),k.disconnect(),o=!1)},()=>{if(o){g.m();const j=k.takeRecords();return!e1(j)&&_(j,!0)}}]},Vd=3333333,Ud=e=>e&&(e.height||e.width),h_=(e,t,n)=>{const{Bt:r=!1,Vt:o=!1}=n||{},s=Ri()[Sz],{B:i}=wo(),d=G5(`
`)[0],p=d.firstChild,h=lu.bind(0,e),[g]=is({o:void 0,_:!0,u:(w,C)=>!(!w||!Ud(w)&&Ud(C))}),v=w=>{const C=bs(w)&&w.length>0&&iu(w[0]),_=!C&&Jv(w[0]);let k=!1,j=!1,E=!0;if(C){const[I,,O]=g(w.pop().contentRect),M=Ud(I),T=Ud(O);k=!O||!M,j=!T&&M,E=!k}else _?[,E]=w:j=w===!0;if(r&&E){const I=_?w[0]:lu(d);fs(d,I?i.n?-Vd:i.i?0:Vd:Vd),ca(d,Vd)}k||t({gt:!_,Yt:_?w:void 0,Vt:!!j})},b=[];let S=o?v:!1;return[()=>{Ys(b),Us(d)},()=>{if(bl){const w=new bl(v);w.observe(p),In(b,()=>{w.disconnect()})}else if(s){const[w,C]=s.O(p,v,o);S=w,In(b,C)}if(r){const[w]=is({o:void 0},h);In(b,Ir(d,"scroll",C=>{const _=w(),[k,j,E]=_;j&&(o1(p,"ltr rtl"),k?ua(p,"rtl"):ua(p,"ltr"),v([!!k,j,E])),Z5(C)}))}S&&(ua(d,lz),In(b,Ir(d,"animationstart",S,{C:!!bl}))),(bl||s)&&Go(e,d)}]},Fz=e=>e.h===0||e.isIntersecting||e.intersectionRatio>0,Hz=(e,t)=>{let n;const r=Ci(uz),o=[],[s]=is({o:!1}),i=(d,p)=>{if(d){const h=s(Fz(d)),[,g]=h;if(g)return!p&&t(h),[h]}},u=(d,p)=>{if(d&&d.length>0)return i(d.pop(),p)};return[()=>{Ys(o),Us(r)},()=>{if(v2)n=new v2(d=>u(d),{root:e}),n.observe(r),In(o,()=>{n.disconnect()});else{const d=()=>{const g=cu(r);i(g)},[p,h]=h_(r,d);In(o,p),h(),d()}Go(e,r)},()=>{if(n)return u(n.takeRecords(),!0)}]},N2=`[${ls}]`,Wz=`[${La}]`,wg=["tabindex"],$2=["wrap","cols","rows"],Sg=["id","class","style","open"],Vz=(e,t,n)=>{let r,o,s;const{Z:i,J:u,tt:d,rt:p,ut:h,ft:g,_t:v}=e,{V:b}=wo(),[S]=is({u:Q5,o:{w:0,h:0}},()=>{const H=g(Ol,El),G=g(yg,""),K=G&&fs(u),R=G&&ca(u);v(Ol,El),v(yg,""),v("",qf,!0);const U=Uf(d),V=Uf(u),J=Gf(u);return v(Ol,El,H),v(yg,"",G),v("",qf),fs(u,K),ca(u,R),{w:V.w+U.w+J.w,h:V.h+U.h+J.h}}),w=p?$2:Sg.concat($2),C=s1(n,{v:()=>r,g:()=>o,p(H,G){const[K]=H,[R]=G;return[Oo(K).concat(Oo(R)).reduce((U,V)=>(U[V]=K[V]||R[V],U),{})]}}),_=H=>{gn(H||wg,G=>{if(Zv(wg,G)>-1){const K=Qr(i,G);ri(K)?Qr(u,G,K):ho(u,G)}})},k=(H,G)=>{const[K,R]=H,U={vt:R};return t({ht:K}),!G&&n(U),U},j=({gt:H,Yt:G,Vt:K})=>{const R=!H||K?n:C;let U=!1;if(G){const[V,J]=G;U=J,t({bt:V})}R({gt:H,yt:U})},E=(H,G)=>{const[,K]=S(),R={wt:K};return K&&!G&&(H?n:C)(R),R},I=(H,G,K)=>{const R={Ot:G};return G?!K&&C(R):h||_(H),R},[O,M,T]=d||!b?Hz(i,k):[Uo,Uo,Uo],[A,z]=h?[Uo,Uo]:h_(i,j,{Vt:!0,Bt:!0}),[$,ee]=A2(i,!1,I,{Pt:Sg,Ht:Sg.concat(wg)}),B=h&&bl&&new bl(j.bind(0,{gt:!0}));return B&&B.observe(i),_(),[()=>{O(),A(),s&&s[0](),B&&B.disconnect(),$()},()=>{z(),M()},()=>{const H={},G=ee(),K=T(),R=s&&s[1]();return G&&nr(H,I.apply(0,In(G,!0))),K&&nr(H,k.apply(0,In(K,!0))),R&&nr(H,E.apply(0,In(R,!0))),H},H=>{const[G]=H("update.ignoreMutation"),[K,R]=H("update.attributes"),[U,V]=H("update.elementEvents"),[J,ie]=H("update.debounce"),xe=V||R,he=ae=>ys(G)&&G(ae);if(xe&&(s&&(s[1](),s[0]()),s=A2(d||u,!0,E,{Ht:w.concat(K||[]),Dt:U,Mt:N2,kt:(ae,Z)=>{const{target:W,attributeName:re}=ae;return(!Z&&re&&!h?W$(W,N2,Wz):!1)||!!yl(W,`.${xo}`)||!!he(ae)}})),ie)if(C.m(),bs(J)){const ae=J[0],Z=J[1];r=Ya(ae)&&ae,o=Ya(Z)&&Z}else Ya(J)?(r=J,o=!1):(r=!1,o=!1)}]},z2={x:0,y:0},Uz=e=>({K:{t:0,r:0,b:0,l:0},St:!1,P:{marginRight:0,marginBottom:0,marginLeft:0,paddingTop:0,paddingRight:0,paddingBottom:0,paddingLeft:0},zt:z2,Tt:z2,Ct:{x:"hidden",y:"hidden"},Et:{x:!1,y:!1},ht:!1,bt:lu(e.Z)}),Gz=(e,t)=>{const n=C0(t,{}),[r,o,s]=i1(),[i,u,d]=Rz(e),p=f_(Uz(i)),[h,g]=p,v=Lz(i,p),b=(j,E,I)=>{const M=Oo(j).some(T=>j[T])||!t1(E)||I;return M&&s("u",[j,E,I]),M},[S,w,C,_]=Vz(i,g,j=>b(v(n,j),{},!1)),k=h.bind(0);return k.jt=j=>r("u",j),k.Nt=()=>{const{W:j,J:E}=i,I=fs(j),O=ca(j);w(),u(),fs(E,I),ca(E,O)},k.qt=i,[(j,E)=>{const I=C0(t,j,E);return _(I),b(v(I,C(),E),j,!!E)},k,()=>{o(),S(),d()}]},{round:L2}=Math,qz=e=>{const{width:t,height:n}=Fs(e),{w:r,h:o}=cu(e);return{x:L2(t)/r||1,y:L2(n)/o||1}},Kz=(e,t,n)=>{const r=t.scrollbars,{button:o,isPrimary:s,pointerType:i}=e,{pointers:u}=r;return o===0&&s&&r[n?"dragScroll":"clickScroll"]&&(u||[]).includes(i)},Yz=(e,t)=>Ir(e,"mousedown",Ir.bind(0,t,"click",Z5,{C:!0,$:!0}),{$:!0}),B2="pointerup pointerleave pointercancel lostpointercapture",Qz=(e,t,n,r,o,s,i)=>{const{B:u}=wo(),{Ft:d,Gt:p,Xt:h}=r,g=`scroll${i?"Left":"Top"}`,v=`client${i?"X":"Y"}`,b=i?"width":"height",S=i?"left":"top",w=i?"w":"h",C=i?"x":"y",_=(k,j)=>E=>{const{Tt:I}=s(),O=cu(p)[w]-cu(d)[w],T=j*E/O*I[C],z=lu(h)&&i?u.n||u.i?1:-1:1;o[g]=k+T*z};return Ir(p,"pointerdown",k=>{const j=yl(k.target,`.${c1}`)===d,E=j?d:p;if(Si(t,ls,_2,!0),Kz(k,e,j)){const I=!j&&k.shiftKey,O=()=>Fs(d),M=()=>Fs(p),T=(V,J)=>(V||O())[S]-(J||M())[S],A=_(o[g]||0,1/qz(o)[C]),z=k[v],$=O(),ee=M(),B=$[b],H=T($,ee)+B/2,G=z-ee[S],K=j?0:G-H,R=V=>{Ys(U),E.releasePointerCapture(V.pointerId)},U=[Si.bind(0,t,ls,_2),Ir(n,B2,R),Ir(n,"selectstart",V=>e_(V),{S:!1}),Ir(p,B2,R),Ir(p,"pointermove",V=>{const J=V[v]-z;(j||I)&&A(K+J)})];if(I)A(K);else if(!j){const V=Ri()[Cz];V&&In(U,V.O(A,T,K,B,G))}E.setPointerCapture(k.pointerId)}})},Xz=(e,t)=>(n,r,o,s,i,u)=>{const{Xt:d}=n,[p,h]=ml(333),g=!!i.scrollBy;let v=!0;return Ys.bind(0,[Ir(d,"pointerenter",()=>{r(j2,!0)}),Ir(d,"pointerleave pointercancel",()=>{r(j2)}),Ir(d,"wheel",b=>{const{deltaX:S,deltaY:w,deltaMode:C}=b;g&&v&&C===0&&ba(d)===s&&i.scrollBy({left:S,top:w,behavior:"smooth"}),v=!1,r(O2,!0),p(()=>{v=!0,r(O2)}),e_(b)},{S:!1,$:!0}),Yz(d,o),Qz(e,s,o,n,i,t,u),h])},{min:k0,max:F2,abs:Jz,round:Zz}=Math,m_=(e,t,n,r)=>{if(r){const u=n?"x":"y",{Tt:d,zt:p}=r,h=p[u],g=d[u];return F2(0,k0(1,h/(h+g)))}const o=n?"width":"height",s=Fs(e)[o],i=Fs(t)[o];return F2(0,k0(1,s/i))},eL=(e,t,n,r,o,s)=>{const{B:i}=wo(),u=s?"x":"y",d=s?"Left":"Top",{Tt:p}=r,h=Zz(p[u]),g=Jz(n[`scroll${d}`]),v=s&&o,b=i.i?g:h-g,w=k0(1,(v?b:g)/h),C=m_(e,t,s);return 1/C*(1-C)*w},tL=(e,t,n)=>{const{N:r,L:o}=wo(),{scrollbars:s}=r(),{slot:i}=s,{ct:u,W:d,Z:p,J:h,lt:g,ot:v,it:b,ut:S}=t,{scrollbars:w}=g?{}:e,{slot:C}=w||{},_=u_([d,p,h],()=>S&&b?d:p,i,C),k=(K,R,U)=>{const V=U?ua:o1;gn(K,J=>{V(J.Xt,R)})},j=(K,R)=>{gn(K,U=>{const[V,J]=R(U);Xr(V,J)})},E=(K,R,U)=>{j(K,V=>{const{Ft:J,Gt:ie}=V;return[J,{[U?"width":"height"]:`${(100*m_(J,ie,U,R)).toFixed(3)}%`}]})},I=(K,R,U)=>{const V=U?"X":"Y";j(K,J=>{const{Ft:ie,Gt:xe,Xt:he}=J,ae=eL(ie,xe,v,R,lu(he),U);return[ie,{transform:ae===ae?`translate${V}(${(100*ae).toFixed(3)}%)`:""}]})},O=[],M=[],T=[],A=(K,R,U)=>{const V=Jv(U),J=V?U:!0,ie=V?!U:!0;J&&k(M,K,R),ie&&k(T,K,R)},z=K=>{E(M,K,!0),E(T,K)},$=K=>{I(M,K,!0),I(T,K)},ee=K=>{const R=K?hz:mz,U=K?M:T,V=e1(U)?P2:"",J=Ci(`${xo} ${R} ${V}`),ie=Ci(l_),xe=Ci(c1),he={Xt:J,Gt:ie,Ft:xe};return o||ua(J,dz),Go(J,ie),Go(ie,xe),In(U,he),In(O,[Us.bind(0,J),n(he,A,u,p,v,K)]),he},B=ee.bind(0,!0),H=ee.bind(0,!1),G=()=>{Go(_,M[0].Xt),Go(_,T[0].Xt),Vf(()=>{A(P2)},300)};return B(),H(),[{Ut:z,Wt:$,Zt:A,Jt:{Kt:M,Qt:B,tn:j.bind(0,M)},nn:{Kt:T,Qt:H,tn:j.bind(0,T)}},G,Ys.bind(0,O)]},nL=(e,t,n,r)=>{let o,s,i,u,d,p=0;const h=f_({}),[g]=h,[v,b]=ml(),[S,w]=ml(),[C,_]=ml(100),[k,j]=ml(100),[E,I]=ml(()=>p),[O,M,T]=tL(e,n.qt,Xz(t,n)),{Z:A,J:z,ot:$,st:ee,ut:B,it:H}=n.qt,{Jt:G,nn:K,Zt:R,Ut:U,Wt:V}=O,{tn:J}=G,{tn:ie}=K,xe=re=>{const{Xt:pe}=re,ne=B&&!H&&ba(pe)===z&&pe;return[ne,{transform:ne?`translate(${fs($)}px, ${ca($)}px)`:""}]},he=(re,pe)=>{if(I(),re)R(E2);else{const ne=()=>R(E2,!0);p>0&&!pe?E(ne):ne()}},ae=()=>{u=s,u&&he(!0)},Z=[_,I,j,w,b,T,Ir(A,"pointerover",ae,{C:!0}),Ir(A,"pointerenter",ae),Ir(A,"pointerleave",()=>{u=!1,s&&he(!1)}),Ir(A,"pointermove",()=>{o&&v(()=>{_(),he(!0),k(()=>{o&&he(!1)})})}),Ir(ee,"scroll",re=>{S(()=>{V(n()),i&&he(!0),C(()=>{i&&!u&&he(!1)})}),r(re),B&&J(xe),B&&ie(xe)})],W=g.bind(0);return W.qt=O,W.Nt=M,[(re,pe,ne)=>{const{At:ge,Lt:ue,It:Ce,yt:Re}=ne,{A:me}=wo(),_e=C0(t,re,pe),We=n(),{Tt:Le,Ct:Ue,bt:kt}=We,[gt,Pn]=_e("showNativeOverlaidScrollbars"),[Pt,yt]=_e("scrollbars.theme"),[be,Te]=_e("scrollbars.visibility"),[It,Ft]=_e("scrollbars.autoHide"),[Wt]=_e("scrollbars.autoHideDelay"),[Cn,En]=_e("scrollbars.dragScroll"),[ln,wr]=_e("scrollbars.clickScroll"),vn=ge||ue||Re,sr=Ce||Te,Ee=gt&&me.x&&me.y,at=(Ye,rt)=>{const Nt=be==="visible"||be==="auto"&&Ye==="scroll";return R(gz,Nt,rt),Nt};if(p=Wt,Pn&&R(fz,Ee),yt&&(R(d),R(Pt,!0),d=Pt),Ft&&(o=It==="move",s=It==="leave",i=It!=="never",he(!i,!0)),En&&R(bz,Cn),wr&&R(yz,ln),sr){const Ye=at(Ue.x,!0),rt=at(Ue.y,!1);R(vz,!(Ye&&rt))}vn&&(U(We),V(We),R(I2,!Le.x,!0),R(I2,!Le.y,!1),R(pz,kt&&!H))},W,Ys.bind(0,Z)]},g_=(e,t,n)=>{ys(e)&&e(t||void 0,n||void 0)},Va=(e,t,n)=>{const{F:r,N:o,Y:s,j:i}=wo(),u=Ri(),d=Hf(e),p=d?e:e.target,h=d_(p);if(t&&!h){let g=!1;const v=B=>{const H=Ri()[wz],G=H&&H.O;return G?G(B,!0):B},b=nr({},r(),v(t)),[S,w,C]=i1(n),[_,k,j]=Gz(e,b),[E,I,O]=nL(e,b,k,B=>C("scroll",[ee,B])),M=(B,H)=>_(B,!!H),T=M.bind(0,{},!0),A=s(T),z=i(T),$=B=>{Mz(p),A(),z(),O(),j(),g=!0,C("destroyed",[ee,!!B]),w()},ee={options(B,H){if(B){const G=H?r():{},K=t_(b,nr(G,v(B)));t1(K)||(nr(b,K),M(K))}return nr({},b)},on:S,off:(B,H)=>{B&&H&&w(B,H)},state(){const{zt:B,Tt:H,Ct:G,Et:K,K:R,St:U,bt:V}=k();return nr({},{overflowEdge:B,overflowAmount:H,overflowStyle:G,hasOverflow:K,padding:R,paddingAbsolute:U,directionRTL:V,destroyed:g})},elements(){const{W:B,Z:H,K:G,J:K,tt:R,ot:U,st:V}=k.qt,{Jt:J,nn:ie}=I.qt,xe=ae=>{const{Ft:Z,Gt:W,Xt:re}=ae;return{scrollbar:re,track:W,handle:Z}},he=ae=>{const{Kt:Z,Qt:W}=ae,re=xe(Z[0]);return nr({},re,{clone:()=>{const pe=xe(W());return E({},!0,{}),pe}})};return nr({},{target:B,host:H,padding:G||K,viewport:K,content:R||K,scrollOffsetElement:U,scrollEventElement:V,scrollbarHorizontal:he(J),scrollbarVertical:he(ie)})},update:B=>M({},B),destroy:$.bind(0)};return k.jt((B,H,G)=>{E(H,G,B)}),Oz(p,ee),gn(Oo(u),B=>g_(u[B],0,ee)),Ez(k.qt.it,o().cancel,!d&&e.cancel)?($(!0),ee):(k.Nt(),I.Nt(),C("initialized",[ee]),k.jt((B,H,G)=>{const{gt:K,yt:R,vt:U,At:V,Lt:J,It:ie,wt:xe,Ot:he}=B;C("updated",[ee,{updateHints:{sizeChanged:K,directionChanged:R,heightIntrinsicChanged:U,overflowEdgeChanged:V,overflowAmountChanged:J,overflowStyleChanged:ie,contentMutation:xe,hostMutation:he},changedOptions:H,force:G}])}),ee.update(!0),ee)}return h};Va.plugin=e=>{gn(xz(e),t=>g_(t,Va))};Va.valid=e=>{const t=e&&e.elements,n=ys(t)&&t();return y0(n)&&!!d_(n.target)};Va.env=()=>{const{k:e,A:t,I:n,B:r,V:o,L:s,X:i,U:u,N:d,q:p,F:h,G:g}=wo();return nr({},{scrollbarsSize:e,scrollbarsOverlaid:t,scrollbarsHiding:n,rtlScrollBehavior:r,flexboxGlue:o,cssCustomProperties:s,staticDefaultInitialization:i,staticDefaultOptions:u,getDefaultInitialization:d,setDefaultInitialization:p,getDefaultOptions:h,setDefaultOptions:g})};const rL=()=>{if(typeof window>"u"){const p=()=>{};return[p,p]}let e,t;const n=window,r=typeof n.requestIdleCallback=="function",o=n.requestAnimationFrame,s=n.cancelAnimationFrame,i=r?n.requestIdleCallback:o,u=r?n.cancelIdleCallback:s,d=()=>{u(e),s(t)};return[(p,h)=>{d(),e=i(r?()=>{d(),t=o(p)}:p,typeof h=="object"?h:{timeout:2233})},d]},p1=e=>{const{options:t,events:n,defer:r}=e||{},[o,s]=f.useMemo(rL,[]),i=f.useRef(null),u=f.useRef(r),d=f.useRef(t),p=f.useRef(n);return f.useEffect(()=>{u.current=r},[r]),f.useEffect(()=>{const{current:h}=i;d.current=t,Va.valid(h)&&h.options(t||{},!0)},[t]),f.useEffect(()=>{const{current:h}=i;p.current=n,Va.valid(h)&&h.on(n||{},!0)},[n]),f.useEffect(()=>()=>{var h;s(),(h=i.current)==null||h.destroy()},[]),f.useMemo(()=>[h=>{const g=i.current;if(Va.valid(g))return;const v=u.current,b=d.current||{},S=p.current||{},w=()=>i.current=Va(h,b,S);v?o(w,v):w()},()=>i.current],[])},oL=(e,t)=>{const{element:n="div",options:r,events:o,defer:s,children:i,...u}=e,d=n,p=f.useRef(null),h=f.useRef(null),[g,v]=p1({options:r,events:o,defer:s});return f.useEffect(()=>{const{current:b}=p,{current:S}=h;return b&&S&&g({target:b,elements:{viewport:S,content:S}}),()=>{var w;return(w=v())==null?void 0:w.destroy()}},[g,n]),f.useImperativeHandle(t,()=>({osInstance:v,getElement:()=>p.current}),[]),N.createElement(d,{"data-overlayscrollbars-initialize":"",ref:p,...u},N.createElement("div",{ref:h},i))},v_=f.forwardRef(oL),sL=tt((e,t)=>{const{children:n,tooltip:r="",tooltipProps:{placement:o="top",hasArrow:s=!0,...i}={},isChecked:u,...d}=e;return a.jsx(_n,{label:r,placement:o,hasArrow:s,...i,children:a.jsx(Sf,{ref:t,colorScheme:u?"accent":"base",...d,children:n})})}),Zt=f.memo(sL),aL="My Board",iL=()=>{const[e,{isLoading:t}]=VE(),n=f.useCallback(()=>{e(aL)},[e]);return a.jsx(Zt,{isLoading:t,"aria-label":"Add Board",onClick:n,size:"sm",sx:{px:4},children:"Add Board"})},lL=e=>{const{isOver:t,label:n="Drop"}=e,r=f.useRef(Ga()),{colorMode:o}=Ro();return a.jsx(io.div,{initial:{opacity:0},animate:{opacity:1,transition:{duration:.1}},exit:{opacity:0,transition:{duration:.1}},children:a.jsxs(F,{sx:{position:"absolute",top:0,insetInlineStart:0,w:"full",h:"full"},children:[a.jsx(F,{sx:{position:"absolute",top:0,insetInlineStart:0,w:"full",h:"full",bg:ke("base.700","base.900")(o),opacity:.7,borderRadius:"base",alignItems:"center",justifyContent:"center",transitionProperty:"common",transitionDuration:"0.1s"}}),a.jsx(F,{sx:{position:"absolute",top:0,insetInlineStart:0,w:"full",h:"full",opacity:1,borderWidth:3,borderColor:t?ke("base.50","base.200")(o):ke("base.100","base.500")(o),borderRadius:"base",borderStyle:"dashed",transitionProperty:"common",transitionDuration:"0.1s",alignItems:"center",justifyContent:"center"},children:a.jsx(nt,{sx:{fontSize:"2xl",fontWeight:600,transform:t?"scale(1.02)":"scale(1)",color:t?ke("base.50","base.50")(o):ke("base.100","base.200")(o),transitionProperty:"common",transitionDuration:"0.1s"},children:n})})]})},r.current)},Kf=f.memo(lL),cL=e=>{const{dropLabel:t,data:n,disabled:r}=e,o=f.useRef(Ga()),{isOver:s,setNodeRef:i,active:u}=sv({id:o.current,disabled:r,data:n});return a.jsx(ze,{ref:i,position:"absolute",top:0,insetInlineStart:0,w:"full",h:"full",pointerEvents:"none",children:a.jsx(ws,{children:Cf(n,u)&&a.jsx(Kf,{isOver:s,label:t})})})},h1=f.memo(cL),Li=e=>{const{icon:t=oc,boxSize:n=16}=e;return a.jsxs(F,{sx:{w:"full",h:"full",alignItems:"center",justifyContent:"center",borderRadius:"base",flexDir:"column",gap:2,userSelect:"none",color:"base.700",_dark:{color:"base.500"},...e.sx},children:[a.jsx(mo,{as:t,boxSize:n,opacity:.7}),e.label&&a.jsx(nt,{textAlign:"center",children:e.label})]})},y_=e=>{const{droppableData:t,onClick:n,isSelected:r,icon:o,label:s,badgeCount:i}=e;return a.jsxs(F,{sx:{flexDir:"column",justifyContent:"space-between",alignItems:"center",cursor:"pointer",w:"full",h:"full",borderRadius:"base"},children:[a.jsxs(F,{onClick:n,sx:{position:"relative",justifyContent:"center",alignItems:"center",borderRadius:"base",w:"full",aspectRatio:"1/1",overflow:"hidden",shadow:r?"selected.light":void 0,_dark:{shadow:r?"selected.dark":void 0},flexShrink:0},children:[a.jsx(Li,{boxSize:8,icon:o,sx:{border:"2px solid var(--invokeai-colors-base-200)",_dark:{border:"2px solid var(--invokeai-colors-base-800)"}}}),a.jsx(F,{sx:{position:"absolute",insetInlineEnd:0,top:0,p:1},children:i!==void 0&&a.jsx(Xa,{variant:"solid",children:i})}),a.jsx(h1,{data:t})]}),a.jsx(F,{sx:{h:"full",alignItems:"center",fontWeight:r?600:void 0,fontSize:"xs",color:r?"base.900":"base.700",_dark:{color:r?"base.50":"base.200"}},children:s})]})},uL=({isSelected:e})=>{const t=S4(),n=()=>{t(av("all"))},r={id:"all-images-board",actionType:"MOVE_BOARD",context:{boardId:null}};return a.jsx(y_,{droppableData:r,onClick:n,isSelected:e,icon:$5,label:"All Images"})},dL=ve(Rt,e=>({count:e.gallery.batchImageNames.length})),fL=({isSelected:e})=>{const t=S4(),{count:n}=L(dL),r=f.useCallback(()=>{t(av("batch"))},[t]),o={id:"batch-board",actionType:"ADD_TO_BATCH"};return a.jsx(y_,{droppableData:o,onClick:r,isSelected:e,icon:qv,label:"Batch",badgeCount:n})};var Kc=globalThis&&globalThis.__assign||function(){return Kc=Object.assign||function(e){for(var t,n=1,r=arguments.length;n0&&ce[ce.length-1])||De[0]!==6&&De[0]!==2)){Qe=0;continue}if(De[0]===3&&(!ce||De[1]>ce[0]&&De[1]=200&&q.status<=299},ee=function(q){return/ion\/(vnd\.api\+)?json/.test(q.get("content-type")||"")};function B(q){if(!(0,A.isPlainObject)(q))return q;for(var Q=C({},q),le=0,we=Object.entries(Q);le"u"&&Qe===z&&console.warn("Warning: `fetch` is not available. Please supply a custom `fetchFn` property to use `fetchBaseQuery` on SSR environments."),function(Gt,$t){return I(Q,null,function(){var Me,ut,Ct,Tt,xn,zt,tn,Xt,Sr,Vn,vt,wn,kn,Un,ar,On,Mn,nn,pn,Sn,cn,un,Be,xt,pt,Xe,ft,Mt,lt,qe,Pe,Se,Ie,Ae,Ge,_t;return r(this,function(wt){switch(wt.label){case 0:return Me=$t.signal,ut=$t.getState,Ct=$t.extra,Tt=$t.endpoint,xn=$t.forced,zt=$t.type,Sr=(Xt=typeof Gt=="string"?{url:Gt}:Gt).url,vt=(Vn=Xt.headers)===void 0?new Headers(Lt.headers):Vn,kn=(wn=Xt.params)===void 0?void 0:wn,ar=(Un=Xt.responseHandler)===void 0?bt??"json":Un,Mn=(On=Xt.validateStatus)===void 0?Et??$:On,pn=(nn=Xt.timeout)===void 0?ht:nn,Sn=j(Xt,["url","headers","params","responseHandler","validateStatus","timeout"]),cn=C(_(C({},Lt),{signal:Me}),Sn),vt=new Headers(B(vt)),un=cn,[4,ce(vt,{getState:ut,extra:Ct,endpoint:Tt,forced:xn,type:zt})];case 1:un.headers=wt.sent()||vt,Be=function(Ne){return typeof Ne=="object"&&((0,A.isPlainObject)(Ne)||Array.isArray(Ne)||typeof Ne.toJSON=="function")},!cn.headers.has("content-type")&&Be(cn.body)&&cn.headers.set("content-type",ye),Be(cn.body)&&dt(cn.headers)&&(cn.body=JSON.stringify(cn.body,Fe)),kn&&(xt=~Sr.indexOf("?")?"&":"?",pt=Dt?Dt(kn):new URLSearchParams(B(kn)),Sr+=xt+pt),Sr=function(Ne,Kt){if(!Ne)return Kt;if(!Kt)return Ne;if(function(on){return new RegExp("(^|:)//").test(on)}(Kt))return Kt;var dn=Ne.endsWith("/")||!Kt.startsWith("?")?"/":"";return Ne=function(on){return on.replace(/\/$/,"")}(Ne),""+Ne+dn+function(on){return on.replace(/^\//,"")}(Kt)}(le,Sr),Xe=new Request(Sr,cn),ft=Xe.clone(),tn={request:ft},lt=!1,qe=pn&&setTimeout(function(){lt=!0,$t.abort()},pn),wt.label=2;case 2:return wt.trys.push([2,4,5,6]),[4,Qe(Xe)];case 3:return Mt=wt.sent(),[3,6];case 4:return Pe=wt.sent(),[2,{error:{status:lt?"TIMEOUT_ERROR":"FETCH_ERROR",error:String(Pe)},meta:tn}];case 5:return qe&&clearTimeout(qe),[7];case 6:Se=Mt.clone(),tn.response=Se,Ae="",wt.label=7;case 7:return wt.trys.push([7,9,,10]),[4,Promise.all([qt(Mt,ar).then(function(Ne){return Ie=Ne},function(Ne){return Ge=Ne}),Se.text().then(function(Ne){return Ae=Ne},function(){})])];case 8:if(wt.sent(),Ge)throw Ge;return[3,10];case 9:return _t=wt.sent(),[2,{error:{status:"PARSING_ERROR",originalStatus:Mt.status,data:Ae,error:String(_t)},meta:tn}];case 10:return[2,Mn(Mt,Ie)?{data:Ie,meta:tn}:{error:{status:Mt.status,data:Ie},meta:tn}]}})})};function qt(Gt,$t){return I(this,null,function(){var Me;return r(this,function(ut){switch(ut.label){case 0:return typeof $t=="function"?[2,$t(Gt)]:($t==="content-type"&&($t=dt(Gt.headers)?"json":"text"),$t!=="json"?[3,2]:[4,Gt.text()]);case 1:return[2,(Me=ut.sent()).length?JSON.parse(Me):null];case 2:return[2,Gt.text()]}})})}}var G=function(q,Q){Q===void 0&&(Q=void 0),this.value=q,this.meta=Q};function K(q,Q){return q===void 0&&(q=0),Q===void 0&&(Q=5),I(this,null,function(){var le,we;return r(this,function(ce){switch(ce.label){case 0:return le=Math.min(q,Q),we=~~((Math.random()+.4)*(300<=Se)}var Sn=(0,Ue.createAsyncThunk)(kn+"/executeQuery",nn,{getPendingMeta:function(){var Be;return(Be={startedTimeStamp:Date.now()})[Ue.SHOULD_AUTOBATCH]=!0,Be},condition:function(Be,xt){var pt,Xe,ft,Mt=(0,xt.getState)(),lt=(Xe=(pt=Mt[kn])==null?void 0:pt.queries)==null?void 0:Xe[Be.queryCacheKey],qe=lt==null?void 0:lt.fulfilledTimeStamp,Pe=Be.originalArgs,Se=lt==null?void 0:lt.originalArgs,Ie=ar[Be.endpointName];return!(!_e(Be)&&((lt==null?void 0:lt.status)==="pending"||!pn(Be,Mt)&&(!ne(Ie)||!((ft=Ie==null?void 0:Ie.forceRefetch)!=null&&ft.call(Ie,{currentArg:Pe,previousArg:Se,endpointState:lt,state:Mt})))&&qe))},dispatchConditionRejection:!0}),cn=(0,Ue.createAsyncThunk)(kn+"/executeMutation",nn,{getPendingMeta:function(){var Be;return(Be={startedTimeStamp:Date.now()})[Ue.SHOULD_AUTOBATCH]=!0,Be}});function un(Be){return function(xt){var pt,Xe;return((Xe=(pt=xt==null?void 0:xt.meta)==null?void 0:pt.arg)==null?void 0:Xe.endpointName)===Be}}return{queryThunk:Sn,mutationThunk:cn,prefetch:function(Be,xt,pt){return function(Xe,ft){var Mt=function(Ie){return"force"in Ie}(pt)&&pt.force,lt=function(Ie){return"ifOlderThan"in Ie}(pt)&&pt.ifOlderThan,qe=function(Ie){return Ie===void 0&&(Ie=!0),Mn.endpoints[Be].initiate(xt,{forceRefetch:Ie})},Pe=Mn.endpoints[Be].select(xt)(ft());if(Mt)Xe(qe());else if(lt){var Se=Pe==null?void 0:Pe.fulfilledTimeStamp;if(!Se)return void Xe(qe());(Number(new Date)-Number(new Date(Se)))/1e3>=lt&&Xe(qe())}else Xe(qe(!1))}},updateQueryData:function(Be,xt,pt){return function(Xe,ft){var Mt,lt,qe=Mn.endpoints[Be].select(xt)(ft()),Pe={patches:[],inversePatches:[],undo:function(){return Xe(Mn.util.patchQueryData(Be,xt,Pe.inversePatches))}};if(qe.status===t.uninitialized)return Pe;if("data"in qe)if((0,Le.isDraftable)(qe.data)){var Se=(0,Le.produceWithPatches)(qe.data,pt),Ie=Se[2];(Mt=Pe.patches).push.apply(Mt,Se[1]),(lt=Pe.inversePatches).push.apply(lt,Ie)}else{var Ae=pt(qe.data);Pe.patches.push({op:"replace",path:[],value:Ae}),Pe.inversePatches.push({op:"replace",path:[],value:qe.data})}return Xe(Mn.util.patchQueryData(Be,xt,Pe.patches)),Pe}},upsertQueryData:function(Be,xt,pt){return function(Xe){var ft;return Xe(Mn.endpoints[Be].initiate(xt,((ft={subscribe:!1,forceRefetch:!0})[me]=function(){return{data:pt}},ft)))}},patchQueryData:function(Be,xt,pt){return function(Xe){Xe(Mn.internalActions.queryResultPatched({queryCacheKey:On({queryArgs:xt,endpointDefinition:ar[Be],endpointName:Be}),patches:pt}))}},buildMatchThunkActions:function(Be,xt){return{matchPending:(0,We.isAllOf)((0,We.isPending)(Be),un(xt)),matchFulfilled:(0,We.isAllOf)((0,We.isFulfilled)(Be),un(xt)),matchRejected:(0,We.isAllOf)((0,We.isRejected)(Be),un(xt))}}}}({baseQuery:we,reducerPath:ce,context:le,api:q,serializeQueryArgs:et}),Fe=ye.queryThunk,ht=ye.mutationThunk,bt=ye.patchQueryData,Et=ye.updateQueryData,Lt=ye.upsertQueryData,qt=ye.prefetch,Gt=ye.buildMatchThunkActions,$t=function(vt){var wn=vt.reducerPath,kn=vt.queryThunk,Un=vt.mutationThunk,ar=vt.context,On=ar.endpointDefinitions,Mn=ar.apiUid,nn=ar.extractRehydrationInfo,pn=ar.hasRehydrationInfo,Sn=vt.assertTagType,cn=vt.config,un=(0,Ce.createAction)(wn+"/resetApiState"),Be=(0,Ce.createSlice)({name:wn+"/queries",initialState:It,reducers:{removeQueryResult:{reducer:function(qe,Pe){delete qe[Pe.payload.queryCacheKey]},prepare:(0,Ce.prepareAutoBatched)()},queryResultPatched:function(qe,Pe){var Se=Pe.payload,Ie=Se.patches;yt(qe,Se.queryCacheKey,function(Ae){Ae.data=(0,Pt.applyPatches)(Ae.data,Ie.concat())})}},extraReducers:function(qe){qe.addCase(kn.pending,function(Pe,Se){var Ie,Ae=Se.meta,Ge=Se.meta.arg,_t=_e(Ge);(Ge.subscribe||_t)&&(Pe[Ie=Ge.queryCacheKey]!=null||(Pe[Ie]={status:t.uninitialized,endpointName:Ge.endpointName})),yt(Pe,Ge.queryCacheKey,function(wt){wt.status=t.pending,wt.requestId=_t&&wt.requestId?wt.requestId:Ae.requestId,Ge.originalArgs!==void 0&&(wt.originalArgs=Ge.originalArgs),wt.startedTimeStamp=Ae.startedTimeStamp})}).addCase(kn.fulfilled,function(Pe,Se){var Ie=Se.meta,Ae=Se.payload;yt(Pe,Ie.arg.queryCacheKey,function(Ge){var _t;if(Ge.requestId===Ie.requestId||_e(Ie.arg)){var wt=On[Ie.arg.endpointName].merge;if(Ge.status=t.fulfilled,wt)if(Ge.data!==void 0){var Ne=Ie.fulfilledTimeStamp,Kt=Ie.arg,dn=Ie.baseQueryMeta,on=Ie.requestId,ir=(0,Ce.createNextState)(Ge.data,function(Fn){return wt(Fn,Ae,{arg:Kt.originalArgs,baseQueryMeta:dn,fulfilledTimeStamp:Ne,requestId:on})});Ge.data=ir}else Ge.data=Ae;else Ge.data=(_t=On[Ie.arg.endpointName].structuralSharing)==null||_t?T((0,Pn.isDraft)(Ge.data)?(0,Pt.original)(Ge.data):Ge.data,Ae):Ae;delete Ge.error,Ge.fulfilledTimeStamp=Ie.fulfilledTimeStamp}})}).addCase(kn.rejected,function(Pe,Se){var Ie=Se.meta,Ae=Ie.condition,Ge=Ie.requestId,_t=Se.error,wt=Se.payload;yt(Pe,Ie.arg.queryCacheKey,function(Ne){if(!Ae){if(Ne.requestId!==Ge)return;Ne.status=t.rejected,Ne.error=wt??_t}})}).addMatcher(pn,function(Pe,Se){for(var Ie=nn(Se).queries,Ae=0,Ge=Object.entries(Ie);Ae"u"||navigator.onLine===void 0||navigator.onLine,focused:typeof document>"u"||document.visibilityState!=="hidden",middlewareRegistered:!1},cn),reducers:{middlewareRegistered:function(qe,Pe){qe.middlewareRegistered=qe.middlewareRegistered!=="conflict"&&Mn===Pe.payload||"conflict"}},extraReducers:function(qe){qe.addCase(xe,function(Pe){Pe.online=!0}).addCase(he,function(Pe){Pe.online=!1}).addCase(J,function(Pe){Pe.focused=!0}).addCase(ie,function(Pe){Pe.focused=!1}).addMatcher(pn,function(Pe){return C({},Pe)})}}),lt=(0,Ce.combineReducers)({queries:Be.reducer,mutations:xt.reducer,provided:pt.reducer,subscriptions:ft.reducer,config:Mt.reducer});return{reducer:function(qe,Pe){return lt(un.match(Pe)?void 0:qe,Pe)},actions:_(C(C(C(C(C({},Mt.actions),Be.actions),Xe.actions),ft.actions),xt.actions),{unsubscribeMutationResult:xt.actions.removeMutationResult,resetApiState:un})}}({context:le,queryThunk:Fe,mutationThunk:ht,reducerPath:ce,assertTagType:De,config:{refetchOnFocus:ot,refetchOnReconnect:dt,refetchOnMountOrArgChange:Dt,keepUnusedDataFor:Qe,reducerPath:ce}}),Me=$t.reducer,ut=$t.actions;Dr(q.util,{patchQueryData:bt,updateQueryData:Et,upsertQueryData:Lt,prefetch:qt,resetApiState:ut.resetApiState}),Dr(q.internalActions,ut);var Ct=function(vt){var wn=vt.reducerPath,kn=vt.queryThunk,Un=vt.api,ar=vt.context,On=ar.apiUid,Mn={invalidateTags:(0,dr.createAction)(wn+"/invalidateTags")},nn=[Lr,yn,zr,fr,$n,So];return{middleware:function(Sn){var cn=!1,un=_(C({},vt),{internalState:{currentSubscriptions:{}},refetchQuery:pn}),Be=nn.map(function(Xe){return Xe(un)}),xt=function(Xe){var ft=Xe.api,Mt=Xe.queryThunk,lt=Xe.internalState,qe=ft.reducerPath+"/subscriptions",Pe=null,Se=!1,Ie=ft.internalActions,Ae=Ie.updateSubscriptionOptions,Ge=Ie.unsubscribeQueryResult;return function(_t,wt){var Ne,Kt;if(Pe||(Pe=JSON.parse(JSON.stringify(lt.currentSubscriptions))),ft.util.resetApiState.match(_t))return Pe=lt.currentSubscriptions={},[!0,!1];if(ft.internalActions.internal_probeSubscription.match(_t)){var dn=_t.payload;return[!1,!!((Ne=lt.currentSubscriptions[dn.queryCacheKey])!=null&&Ne[dn.requestId])]}var on=function(an,zn){var eo,rn,Rn,Fr,Cr,Pa,Fu,Co,Js;if(Ae.match(zn)){var Is=zn.payload,Zs=Is.queryCacheKey,to=Is.requestId;return(eo=an==null?void 0:an[Zs])!=null&&eo[to]&&(an[Zs][to]=Is.options),!0}if(Ge.match(zn)){var no=zn.payload;return to=no.requestId,an[Zs=no.queryCacheKey]&&delete an[Zs][to],!0}if(ft.internalActions.removeQueryResult.match(zn))return delete an[zn.payload.queryCacheKey],!0;if(Mt.pending.match(zn)){var ro=zn.meta;if(to=ro.requestId,(Ur=ro.arg).subscribe)return(Ao=(Rn=an[rn=Ur.queryCacheKey])!=null?Rn:an[rn]={})[to]=(Cr=(Fr=Ur.subscriptionOptions)!=null?Fr:Ao[to])!=null?Cr:{},!0}if(Mt.rejected.match(zn)){var Ao,_o=zn.meta,Ur=_o.arg;if(to=_o.requestId,_o.condition&&Ur.subscribe)return(Ao=(Fu=an[Pa=Ur.queryCacheKey])!=null?Fu:an[Pa]={})[to]=(Js=(Co=Ur.subscriptionOptions)!=null?Co:Ao[to])!=null?Js:{},!0}return!1}(lt.currentSubscriptions,_t);if(on){Se||(es(function(){var an=JSON.parse(JSON.stringify(lt.currentSubscriptions)),zn=(0,Br.produceWithPatches)(Pe,function(){return an});wt.next(ft.internalActions.subscriptionsUpdated(zn[1])),Pe=an,Se=!1}),Se=!0);var ir=!!((Kt=_t.type)!=null&&Kt.startsWith(qe)),Fn=Mt.rejected.match(_t)&&_t.meta.condition&&!!_t.meta.arg.subscribe;return[!ir&&!Fn,!1]}return[!0,!1]}}(un),pt=function(Xe){var ft=Xe.reducerPath,Mt=Xe.context,lt=Xe.refetchQuery,qe=Xe.internalState,Pe=Xe.api.internalActions.removeQueryResult;function Se(Ie,Ae){var Ge=Ie.getState()[ft],_t=Ge.queries,wt=qe.currentSubscriptions;Mt.batch(function(){for(var Ne=0,Kt=Object.keys(wt);Ne{const n=te(),{currentData:r}=gs(e.cover_image_name??qo.skipToken),{colorMode:o}=Ro(),{board_name:s,board_id:i}=e,{onClickDeleteBoardImages:u}=f.useContext(C4),d=f.useCallback(()=>{n(av(i))},[i,n]),[p,{isLoading:h}]=KE(),[g,{isLoading:v}]=YE(),b=k=>{p({board_id:i,changes:{board_name:k}})},S=f.useCallback(()=>{g(i)},[i,g]),w=f.useCallback(()=>{},[]),C=f.useCallback(()=>{u(e)},[e,u]),_=f.useMemo(()=>({id:i,actionType:"MOVE_BOARD",context:{boardId:i}}),[i]);return a.jsx(ze,{sx:{touchAction:"none",height:"full"},children:a.jsx(b_,{menuProps:{size:"sm",isLazy:!0},renderMenu:()=>a.jsxs(tc,{sx:{visibility:"visible !important"},children:[e.image_count>0&&a.jsxs(a.Fragment,{children:[a.jsx(Pr,{isDisabled:!e.image_count,icon:a.jsx($5,{}),onClickCapture:w,children:"Add Board to Batch"}),a.jsx(Pr,{sx:{color:"error.600",_dark:{color:"error.300"}},icon:a.jsx(yo,{}),onClickCapture:C,children:"Delete Board and Images"})]}),a.jsx(Pr,{sx:{color:"error.600",_dark:{color:"error.300"}},icon:a.jsx(yo,{}),onClickCapture:S,children:"Delete Board"})]}),children:k=>a.jsxs(F,{userSelect:"none",ref:k,sx:{flexDir:"column",justifyContent:"space-between",alignItems:"center",cursor:"pointer",w:"full",h:"full"},children:[a.jsxs(F,{onClick:d,sx:{position:"relative",justifyContent:"center",alignItems:"center",borderRadius:"base",w:"full",aspectRatio:"1/1",overflow:"hidden",shadow:t?"selected.light":void 0,_dark:{shadow:t?"selected.dark":void 0},flexShrink:0},children:[e.cover_image_name&&(r==null?void 0:r.image_url)&&a.jsx(bu,{src:r==null?void 0:r.image_url,draggable:!1}),!(e.cover_image_name&&(r!=null&&r.image_url))&&a.jsx(Li,{boxSize:8,icon:qc,sx:{border:"2px solid var(--invokeai-colors-base-200)",_dark:{border:"2px solid var(--invokeai-colors-base-800)"}}}),a.jsx(F,{sx:{position:"absolute",insetInlineEnd:0,top:0,p:1},children:a.jsx(Xa,{variant:"solid",children:e.image_count})}),a.jsx(h1,{data:_})]}),a.jsx(F,{sx:{width:"full",height:"full",justifyContent:"center",alignItems:"center"},children:a.jsxs(F3,{defaultValue:s,submitOnBlur:!1,onSubmit:j=>{b(j)},children:[a.jsx(z3,{sx:{color:t?ke("base.900","base.50")(o):ke("base.700","base.200")(o),fontWeight:t?600:void 0,fontSize:"xs",textAlign:"center",p:0},noOfLines:1}),a.jsx($3,{sx:{color:ke("base.900","base.50")(o),fontSize:"xs",borderColor:ke("base.500","base.500")(o),p:0,outline:0}})]})})]},i)})})});S_.displayName="HoverableBoard";const br=e=>{const t=L(i=>i.config.disabledTabs),n=L(i=>i.config.disabledFeatures),r=L(i=>i.config.disabledSDFeatures),o=f.useMemo(()=>n.includes(e)||r.includes(e)||t.includes(e),[n,r,t,e]),s=f.useMemo(()=>!(n.includes(e)||r.includes(e)||t.includes(e)),[n,r,t,e]);return{isFeatureDisabled:o,isFeatureEnabled:s}},hL=ve([Rt],({boards:e,gallery:t})=>{const{searchText:n}=e,{selectedBoardId:r}=t;return{selectedBoardId:r,searchText:n}},it),mL=e=>{const{isOpen:t}=e,n=te(),{selectedBoardId:r,searchText:o}=L(hL),{data:s}=lv(),i=br("batches").isFeatureEnabled,u=o?s==null?void 0:s.filter(v=>v.board_name.toLowerCase().includes(o.toLowerCase())):s,[d,p]=f.useState(!1),h=v=>{p(v.length>0),n(Wb(v))},g=()=>{p(!1),n(Wb(""))};return a.jsx(Jp,{in:t,animateOpacity:!0,children:a.jsxs(F,{layerStyle:"first",sx:{flexDir:"column",gap:2,p:2,mt:2,borderRadius:"base"},children:[a.jsxs(F,{sx:{gap:2,alignItems:"center"},children:[a.jsxs(k6,{children:[a.jsx(ku,{placeholder:"Search Boards...",value:o,onChange:v=>{h(v.target.value)}}),o&&o.length&&a.jsx(Rv,{children:a.jsx(qa,{onClick:g,size:"xs",variant:"ghost","aria-label":"Clear Search",icon:a.jsx(N$,{boxSize:3})})})]}),a.jsx(iL,{})]}),a.jsx(v_,{defer:!0,style:{height:"100%",width:"100%"},options:{scrollbars:{visibility:"auto",autoHide:"move",autoHideDelay:1300,theme:"os-theme-dark"}},children:a.jsxs(Ei,{className:"list-container",sx:{gridTemplateRows:"6.5rem 6.5rem",gridAutoFlow:"column dense",gridAutoColumns:"5rem"},children:[!d&&a.jsxs(a.Fragment,{children:[a.jsx(hf,{sx:{p:1.5},children:a.jsx(uL,{isSelected:r==="all"})}),i&&a.jsx(hf,{sx:{p:1.5},children:a.jsx(fL,{isSelected:r==="batch"})})]}),u&&u.map(v=>a.jsx(hf,{sx:{p:1.5},children:a.jsx(S_,{board:v,isSelected:r===v.board_id})},v.board_id))]})})]})})},gL=f.memo(mL),bh=0,oi=1,sc=2,C_=4;function vL(e,t){return n=>e(t(n))}function yL(e,t){return t(e)}function __(e,t){return n=>e(t,n)}function H2(e,t){return()=>e(t)}function m1(e,t){return t(e),e}function Bi(...e){return e}function bL(e){e()}function W2(e){return()=>e}function xL(...e){return()=>{e.map(bL)}}function xh(){}function ao(e,t){return e(oi,t)}function jr(e,t){e(bh,t)}function g1(e){e(sc)}function wh(e){return e(C_)}function Ln(e,t){return ao(e,__(t,bh))}function V2(e,t){const n=e(oi,r=>{n(),t(r)});return n}function hr(){const e=[];return(t,n)=>{switch(t){case sc:e.splice(0,e.length);return;case oi:return e.push(n),()=>{const r=e.indexOf(n);r>-1&&e.splice(r,1)};case bh:e.slice().forEach(r=>{r(n)});return;default:throw new Error(`unrecognized action ${t}`)}}}function Bt(e){let t=e;const n=hr();return(r,o)=>{switch(r){case oi:o(t);break;case bh:t=o;break;case C_:return t}return n(r,o)}}function wL(e){let t,n;const r=()=>t&&t();return function(o,s){switch(o){case oi:return s?n===s?void 0:(r(),n=s,t=ao(e,s),t):(r(),xh);case sc:r(),n=null;return;default:throw new Error(`unrecognized action ${o}`)}}}function Yc(e){return m1(hr(),t=>Ln(e,t))}function Ml(e,t){return m1(Bt(t),n=>Ln(e,n))}function SL(...e){return t=>e.reduceRight(yL,t)}function Ht(e,...t){const n=SL(...t);return(r,o)=>{switch(r){case oi:return ao(e,n(o));case sc:g1(e);return}}}function k_(e,t){return e===t}function go(e=k_){let t;return n=>r=>{e(t,r)||(t=r,n(r))}}function Vr(e){return t=>n=>{e(n)&&t(n)}}function Kn(e){return t=>vL(t,e)}function Fa(e){return t=>()=>t(e)}function Gd(e,t){return n=>r=>n(t=e(t,r))}function P0(e){return t=>n=>{e>0?e--:t(n)}}function Lc(e){let t=null,n;return r=>o=>{t=o,!n&&(n=setTimeout(()=>{n=void 0,r(t)},e))}}function U2(e){let t,n;return r=>o=>{t=o,n&&clearTimeout(n),n=setTimeout(()=>{r(t)},e)}}function $s(...e){const t=new Array(e.length);let n=0,r=null;const o=Math.pow(2,e.length)-1;return e.forEach((s,i)=>{const u=Math.pow(2,i);ao(s,d=>{const p=n;n=n|u,t[i]=d,p!==o&&n===o&&r&&(r(),r=null)})}),s=>i=>{const u=()=>s([i].concat(t));n===o?u():r=u}}function G2(...e){return function(t,n){switch(t){case oi:return xL(...e.map(r=>ao(r,n)));case sc:return;default:throw new Error(`unrecognized action ${t}`)}}}function fn(e,t=k_){return Ht(e,go(t))}function la(...e){const t=hr(),n=new Array(e.length);let r=0;const o=Math.pow(2,e.length)-1;return e.forEach((s,i)=>{const u=Math.pow(2,i);ao(s,d=>{n[i]=d,r=r|u,r===o&&jr(t,n)})}),function(s,i){switch(s){case oi:return r===o&&i(n),ao(t,i);case sc:return g1(t);default:throw new Error(`unrecognized action ${s}`)}}}function Qs(e,t=[],{singleton:n}={singleton:!0}){return{id:CL(),constructor:e,dependencies:t,singleton:n}}const CL=()=>Symbol();function _L(e){const t=new Map,n=({id:r,constructor:o,dependencies:s,singleton:i})=>{if(i&&t.has(r))return t.get(r);const u=o(s.map(d=>n(d)));return i&&t.set(r,u),u};return n(e)}function kL(e,t){const n={},r={};let o=0;const s=e.length;for(;o(C[_]=k=>{const j=w[t.methods[_]];jr(j,k)},C),{})}function h(w){return i.reduce((C,_)=>(C[_]=wL(w[t.events[_]]),C),{})}return{Component:N.forwardRef((w,C)=>{const{children:_,...k}=w,[j]=N.useState(()=>m1(_L(e),I=>d(I,k))),[E]=N.useState(H2(h,j));return qd(()=>{for(const I of i)I in k&&ao(E[I],k[I]);return()=>{Object.values(E).map(g1)}},[k,E,j]),qd(()=>{d(j,k)}),N.useImperativeHandle(C,W2(p(j))),N.createElement(u.Provider,{value:j},n?N.createElement(n,kL([...r,...o,...i],k),_):_)}),usePublisher:w=>N.useCallback(__(jr,N.useContext(u)[w]),[w]),useEmitterValue:w=>{const _=N.useContext(u)[w],[k,j]=N.useState(H2(wh,_));return qd(()=>ao(_,E=>{E!==k&&j(W2(E))}),[_,k]),k},useEmitter:(w,C)=>{const k=N.useContext(u)[w];qd(()=>ao(k,C),[C,k])}}}const jL=typeof document<"u"?N.useLayoutEffect:N.useEffect,IL=jL;var v1=(e=>(e[e.DEBUG=0]="DEBUG",e[e.INFO=1]="INFO",e[e.WARN=2]="WARN",e[e.ERROR=3]="ERROR",e))(v1||{});const EL={0:"debug",1:"log",2:"warn",3:"error"},OL=()=>typeof globalThis>"u"?window:globalThis,P_=Qs(()=>{const e=Bt(3);return{log:Bt((n,r,o=1)=>{var s;const i=(s=OL().VIRTUOSO_LOG_LEVEL)!=null?s:wh(e);o>=i&&console[EL[o]]("%creact-virtuoso: %c%s %o","color: #0253b3; font-weight: bold","color: initial",n,r)}),logLevel:e}},[],{singleton:!0});function j_(e,t=!0){const n=N.useRef(null);let r=o=>{};if(typeof ResizeObserver<"u"){const o=N.useMemo(()=>new ResizeObserver(s=>{const i=s[0].target;i.offsetParent!==null&&e(i)}),[e]);r=s=>{s&&t?(o.observe(s),n.current=s):(n.current&&o.unobserve(n.current),n.current=null)}}return{ref:n,callbackRef:r}}function Sh(e,t=!0){return j_(e,t).callbackRef}function Yf(e,t){return Math.round(e.getBoundingClientRect()[t])}function I_(e,t){return Math.abs(e-t)<1.01}function E_(e,t,n,r=xh,o){const s=N.useRef(null),i=N.useRef(null),u=N.useRef(null),d=N.useCallback(g=>{const v=g.target,b=v===window||v===document,S=b?window.pageYOffset||document.documentElement.scrollTop:v.scrollTop,w=b?document.documentElement.scrollHeight:v.scrollHeight,C=b?window.innerHeight:v.offsetHeight,_=()=>{e({scrollTop:Math.max(S,0),scrollHeight:w,viewportHeight:C})};g.suppressFlushSync?_():QE.flushSync(_),i.current!==null&&(S===i.current||S<=0||S===w-C)&&(i.current=null,t(!0),u.current&&(clearTimeout(u.current),u.current=null))},[e,t]);N.useEffect(()=>{const g=o||s.current;return r(o||s.current),d({target:g,suppressFlushSync:!0}),g.addEventListener("scroll",d,{passive:!0}),()=>{r(null),g.removeEventListener("scroll",d)}},[s,d,n,r,o]);function p(g){const v=s.current;if(!v||"offsetHeight"in v&&v.offsetHeight===0)return;const b=g.behavior==="smooth";let S,w,C;v===window?(w=Math.max(Yf(document.documentElement,"height"),document.documentElement.scrollHeight),S=window.innerHeight,C=document.documentElement.scrollTop):(w=v.scrollHeight,S=Yf(v,"height"),C=v.scrollTop);const _=w-S;if(g.top=Math.ceil(Math.max(Math.min(_,g.top),0)),I_(S,w)||g.top===C){e({scrollTop:C,scrollHeight:w,viewportHeight:S}),b&&t(!0);return}b?(i.current=g.top,u.current&&clearTimeout(u.current),u.current=setTimeout(()=>{u.current=null,i.current=null,t(!0)},1e3)):i.current=null,v.scrollTo(g)}function h(g){s.current.scrollBy(g)}return{scrollerRef:s,scrollByCallback:h,scrollToCallback:p}}const Ch=Qs(()=>{const e=hr(),t=hr(),n=Bt(0),r=hr(),o=Bt(0),s=hr(),i=hr(),u=Bt(0),d=Bt(0),p=Bt(0),h=Bt(0),g=hr(),v=hr(),b=Bt(!1);return Ln(Ht(e,Kn(({scrollTop:S})=>S)),t),Ln(Ht(e,Kn(({scrollHeight:S})=>S)),i),Ln(t,o),{scrollContainerState:e,scrollTop:t,viewportHeight:s,headerHeight:u,fixedHeaderHeight:d,fixedFooterHeight:p,footerHeight:h,scrollHeight:i,smoothScrollTargetReached:r,scrollTo:g,scrollBy:v,statefulScrollTop:o,deviation:n,scrollingInProgress:b}},[],{singleton:!0}),ML=typeof document<"u"&&"scrollBehavior"in document.documentElement.style;function RL(e){const t=typeof e=="number"?{index:e}:e;return t.align||(t.align="start"),(!t.behavior||!ML)&&(t.behavior="auto"),t.offset||(t.offset=0),t}const Qf="up",Qc="down",DL="none",TL={atBottom:!1,notAtBottomBecause:"NOT_SHOWING_LAST_ITEM",state:{offsetBottom:0,scrollTop:0,viewportHeight:0,scrollHeight:0}},AL=0,O_=Qs(([{scrollContainerState:e,scrollTop:t,viewportHeight:n,headerHeight:r,footerHeight:o,scrollBy:s}])=>{const i=Bt(!1),u=Bt(!0),d=hr(),p=hr(),h=Bt(4),g=Bt(AL),v=Ml(Ht(G2(Ht(fn(t),P0(1),Fa(!0)),Ht(fn(t),P0(1),Fa(!1),U2(100))),go()),!1),b=Ml(Ht(G2(Ht(s,Fa(!0)),Ht(s,Fa(!1),U2(200))),go()),!1);Ln(Ht(la(fn(t),fn(g)),Kn(([k,j])=>k<=j),go()),u),Ln(Ht(u,Lc(50)),p);const S=Yc(Ht(la(e,fn(n),fn(r),fn(o),fn(h)),Gd((k,[{scrollTop:j,scrollHeight:E},I,O,M,T])=>{const A=j+I-E>-T,z={viewportHeight:I,scrollTop:j,scrollHeight:E};if(A){let ee,B;return j>k.state.scrollTop?(ee="SCROLLED_DOWN",B=k.state.scrollTop-j):(ee="SIZE_DECREASED",B=k.state.scrollTop-j||k.scrollTopDelta),{atBottom:!0,state:z,atBottomBecause:ee,scrollTopDelta:B}}let $;return z.scrollHeight>k.state.scrollHeight?$="SIZE_INCREASED":Ik&&k.atBottom===j.atBottom))),w=Ml(Ht(e,Gd((k,{scrollTop:j,scrollHeight:E,viewportHeight:I})=>{if(I_(k.scrollHeight,E))return{scrollTop:j,scrollHeight:E,jump:0,changed:!1};{const O=E-(j+I)<1;return k.scrollTop!==j&&O?{scrollHeight:E,scrollTop:j,jump:k.scrollTop-j,changed:!0}:{scrollHeight:E,scrollTop:j,jump:0,changed:!0}}},{scrollHeight:0,jump:0,scrollTop:0,changed:!1}),Vr(k=>k.changed),Kn(k=>k.jump)),0);Ln(Ht(S,Kn(k=>k.atBottom)),i),Ln(Ht(i,Lc(50)),d);const C=Bt(Qc);Ln(Ht(e,Kn(({scrollTop:k})=>k),go(),Gd((k,j)=>wh(b)?{direction:k.direction,prevScrollTop:j}:{direction:jk.direction)),C),Ln(Ht(e,Lc(50),Fa(DL)),C);const _=Bt(0);return Ln(Ht(v,Vr(k=>!k),Fa(0)),_),Ln(Ht(t,Lc(100),$s(v),Vr(([k,j])=>!!j),Gd(([k,j],[E])=>[j,E],[0,0]),Kn(([k,j])=>j-k)),_),{isScrolling:v,isAtTop:u,isAtBottom:i,atBottomState:S,atTopStateChange:p,atBottomStateChange:d,scrollDirection:C,atBottomThreshold:h,atTopThreshold:g,scrollVelocity:_,lastJumpDueToItemResize:w}},Bi(Ch)),NL=Qs(([{log:e}])=>{const t=Bt(!1),n=Yc(Ht(t,Vr(r=>r),go()));return ao(t,r=>{r&&wh(e)("props updated",{},v1.DEBUG)}),{propsReady:t,didMount:n}},Bi(P_),{singleton:!0});function M_(e,t){e==0?t():requestAnimationFrame(()=>M_(e-1,t))}function $L(e,t){const n=t-1;return typeof e=="number"?e:e.index==="LAST"?n:e.index}function j0(e,t){return!!(e&&e[0]===t[0]&&e[1]===t[1])}function zL(e,t){return!!(e&&e.startIndex===t.startIndex&&e.endIndex===t.endIndex)}const Xf="top",Jf="bottom",q2="none";function K2(e,t,n){return typeof e=="number"?n===Qf&&t===Xf||n===Qc&&t===Jf?e:0:n===Qf?t===Xf?e.main:e.reverse:t===Jf?e.main:e.reverse}function Y2(e,t){return typeof e=="number"?e:e[t]||0}const LL=Qs(([{scrollTop:e,viewportHeight:t,deviation:n,headerHeight:r,fixedHeaderHeight:o}])=>{const s=hr(),i=Bt(0),u=Bt(0),d=Bt(0),p=Ml(Ht(la(fn(e),fn(t),fn(r),fn(s,j0),fn(d),fn(i),fn(o),fn(n),fn(u)),Kn(([h,g,v,[b,S],w,C,_,k,j])=>{const E=h-k,I=C+_,O=Math.max(v-E,0);let M=q2;const T=Y2(j,Xf),A=Y2(j,Jf);return b-=k,b+=v+_,S+=v+_,S-=k,b>h+I-T&&(M=Qf),Sh!=null),go(j0)),[0,0]);return{listBoundary:s,overscan:d,topListHeight:i,increaseViewportBy:u,visibleRange:p}},Bi(Ch),{singleton:!0}),BL=Qs(([{scrollVelocity:e}])=>{const t=Bt(!1),n=hr(),r=Bt(!1);return Ln(Ht(e,$s(r,t,n),Vr(([o,s])=>!!s),Kn(([o,s,i,u])=>{const{exit:d,enter:p}=s;if(i){if(d(o,u))return!1}else if(p(o,u))return!0;return i}),go()),t),ao(Ht(la(t,e,n),$s(r)),([[o,s,i],u])=>o&&u&&u.change&&u.change(s,i)),{isSeeking:t,scrollSeekConfiguration:r,scrollVelocity:e,scrollSeekRangeChanged:n}},Bi(O_),{singleton:!0});function FL(e){let t=!1,n;return()=>(t||(t=!0,n=e()),n)}const HL=Qs(([{scrollTo:e,scrollContainerState:t}])=>{const n=hr(),r=hr(),o=hr(),s=Bt(!1),i=Bt(void 0);return Ln(Ht(la(n,r),Kn(([{viewportHeight:u,scrollTop:d,scrollHeight:p},{offsetTop:h}])=>({scrollTop:Math.max(0,d-h),scrollHeight:p,viewportHeight:u}))),t),Ln(Ht(e,$s(r),Kn(([u,{offsetTop:d}])=>({...u,top:u.top+d}))),o),{useWindowScroll:s,customScrollParent:i,windowScrollContainerState:n,windowViewportRect:r,windowScrollTo:o}},Bi(Ch)),Cg="-webkit-sticky",Q2="sticky",R_=FL(()=>{if(typeof document>"u")return Q2;const e=document.createElement("div");return e.style.position=Cg,e.style.position===Cg?Cg:Q2});function WL(e,t){const n=N.useRef(null),r=N.useCallback(u=>{if(u===null||!u.offsetParent)return;const d=u.getBoundingClientRect(),p=d.width;let h,g;if(t){const v=t.getBoundingClientRect(),b=d.top-v.top;h=v.height-Math.max(0,b),g=b+t.scrollTop}else h=window.innerHeight-Math.max(0,d.top),g=d.top+window.pageYOffset;n.current={offsetTop:g,visibleHeight:h,visibleWidth:p},e(n.current)},[e,t]),{callbackRef:o,ref:s}=j_(r),i=N.useCallback(()=>{r(s.current)},[r,s]);return N.useEffect(()=>{if(t){t.addEventListener("scroll",i);const u=new ResizeObserver(i);return u.observe(t),()=>{t.removeEventListener("scroll",i),u.unobserve(t)}}else return window.addEventListener("scroll",i),window.addEventListener("resize",i),()=>{window.removeEventListener("scroll",i),window.removeEventListener("resize",i)}},[i,t]),o}N.createContext(void 0);const D_=N.createContext(void 0);function VL(e){return e}R_();const UL={height:"100%",outline:"none",overflowY:"auto",position:"relative",WebkitOverflowScrolling:"touch"},T_={width:"100%",height:"100%",position:"absolute",top:0};R_();function _i(e,t){if(typeof e!="string")return{context:t}}function GL({usePublisher:e,useEmitter:t,useEmitterValue:n}){return N.memo(function({style:s,children:i,...u}){const d=e("scrollContainerState"),p=n("ScrollerComponent"),h=e("smoothScrollTargetReached"),g=n("scrollerRef"),v=n("context"),{scrollerRef:b,scrollByCallback:S,scrollToCallback:w}=E_(d,h,p,g);return t("scrollTo",w),t("scrollBy",S),N.createElement(p,{ref:b,style:{...UL,...s},"data-test-id":"virtuoso-scroller","data-virtuoso-scroller":!0,tabIndex:0,...u,..._i(p,v)},i)})}function qL({usePublisher:e,useEmitter:t,useEmitterValue:n}){return N.memo(function({style:s,children:i,...u}){const d=e("windowScrollContainerState"),p=n("ScrollerComponent"),h=e("smoothScrollTargetReached"),g=n("totalListHeight"),v=n("deviation"),b=n("customScrollParent"),S=n("context"),{scrollerRef:w,scrollByCallback:C,scrollToCallback:_}=E_(d,h,p,xh,b);return IL(()=>(w.current=b||window,()=>{w.current=null}),[w,b]),t("windowScrollTo",_),t("scrollBy",C),N.createElement(p,{style:{position:"relative",...s,...g!==0?{height:g+v}:{}},"data-virtuoso-scroller":!0,...u,..._i(p,S)},i)})}const X2={items:[],offsetBottom:0,offsetTop:0,top:0,bottom:0,itemHeight:0,itemWidth:0},KL={items:[{index:0}],offsetBottom:0,offsetTop:0,top:0,bottom:0,itemHeight:0,itemWidth:0},{round:J2,ceil:Z2,floor:Zf,min:_g,max:Xc}=Math;function YL(e){return{...KL,items:e}}function ew(e,t,n){return Array.from({length:t-e+1}).map((r,o)=>{const s=n===null?null:n[o+e];return{index:o+e,data:s}})}function QL(e,t){return e&&e.column===t.column&&e.row===t.row}function Kd(e,t){return e&&e.width===t.width&&e.height===t.height}const XL=Qs(([{overscan:e,visibleRange:t,listBoundary:n},{scrollTop:r,viewportHeight:o,scrollBy:s,scrollTo:i,smoothScrollTargetReached:u,scrollContainerState:d,footerHeight:p,headerHeight:h},g,v,{propsReady:b,didMount:S},{windowViewportRect:w,useWindowScroll:C,customScrollParent:_,windowScrollContainerState:k,windowScrollTo:j},E])=>{const I=Bt(0),O=Bt(0),M=Bt(X2),T=Bt({height:0,width:0}),A=Bt({height:0,width:0}),z=hr(),$=hr(),ee=Bt(0),B=Bt(null),H=Bt({row:0,column:0}),G=hr(),K=hr(),R=Bt(!1),U=Bt(0),V=Bt(!0),J=Bt(!1);ao(Ht(S,$s(U),Vr(([W,re])=>!!re)),()=>{jr(V,!1),jr(O,0)}),ao(Ht(la(S,V,A,T,U,J),Vr(([W,re,pe,ne,,ge])=>W&&!re&&pe.height!==0&&ne.height!==0&&!ge)),([,,,,W])=>{jr(J,!0),M_(1,()=>{jr(z,W)}),V2(Ht(r),()=>{jr(n,[0,0]),jr(V,!0)})}),Ln(Ht(K,Vr(W=>W!=null&&W.scrollTop>0),Fa(0)),O),ao(Ht(S,$s(K),Vr(([,W])=>W!=null)),([,W])=>{W&&(jr(T,W.viewport),jr(A,W==null?void 0:W.item),jr(H,W.gap),W.scrollTop>0&&(jr(R,!0),V2(Ht(r,P0(1)),re=>{jr(R,!1)}),jr(i,{top:W.scrollTop})))}),Ln(Ht(T,Kn(({height:W})=>W)),o),Ln(Ht(la(fn(T,Kd),fn(A,Kd),fn(H,(W,re)=>W&&W.column===re.column&&W.row===re.row),fn(r)),Kn(([W,re,pe,ne])=>({viewport:W,item:re,gap:pe,scrollTop:ne}))),G),Ln(Ht(la(fn(I),t,fn(H,QL),fn(A,Kd),fn(T,Kd),fn(B),fn(O),fn(R),fn(V),fn(U)),Vr(([,,,,,,,W])=>!W),Kn(([W,[re,pe],ne,ge,ue,Ce,Re,,me,_e])=>{const{row:We,column:Le}=ne,{height:Ue,width:kt}=ge,{width:gt}=ue;if(Re===0&&(W===0||gt===0))return X2;if(kt===0){const En=$L(_e,W),ln=En===0?Math.max(Re-1,0):En;return YL(ew(En,ln,Ce))}const Pn=A_(gt,kt,Le);let Pt,yt;me?re===0&&pe===0&&Re>0?(Pt=0,yt=Re-1):(Pt=Pn*Zf((re+We)/(Ue+We)),yt=Pn*Z2((pe+We)/(Ue+We))-1,yt=_g(W-1,Xc(yt,Pn-1)),Pt=_g(yt,Xc(0,Pt))):(Pt=0,yt=-1);const be=ew(Pt,yt,Ce),{top:Te,bottom:It}=tw(ue,ne,ge,be),Ft=Z2(W/Pn),Cn=Ft*Ue+(Ft-1)*We-It;return{items:be,offsetTop:Te,offsetBottom:Cn,top:Te,bottom:It,itemHeight:Ue,itemWidth:kt}})),M),Ln(Ht(B,Vr(W=>W!==null),Kn(W=>W.length)),I),Ln(Ht(la(T,A,M,H),Vr(([W,re,{items:pe}])=>pe.length>0&&re.height!==0&&W.height!==0),Kn(([W,re,{items:pe},ne])=>{const{top:ge,bottom:ue}=tw(W,ne,re,pe);return[ge,ue]}),go(j0)),n);const ie=Bt(!1);Ln(Ht(r,$s(ie),Kn(([W,re])=>re||W!==0)),ie);const xe=Yc(Ht(fn(M),Vr(({items:W})=>W.length>0),$s(I,ie),Vr(([{items:W},re,pe])=>pe&&W[W.length-1].index===re-1),Kn(([,W])=>W-1),go())),he=Yc(Ht(fn(M),Vr(({items:W})=>W.length>0&&W[0].index===0),Fa(0),go())),ae=Yc(Ht(fn(M),$s(R),Vr(([{items:W},re])=>W.length>0&&!re),Kn(([{items:W}])=>({startIndex:W[0].index,endIndex:W[W.length-1].index})),go(zL),Lc(0)));Ln(ae,v.scrollSeekRangeChanged),Ln(Ht(z,$s(T,A,I,H),Kn(([W,re,pe,ne,ge])=>{const ue=RL(W),{align:Ce,behavior:Re,offset:me}=ue;let _e=ue.index;_e==="LAST"&&(_e=ne-1),_e=Xc(0,_e,_g(ne-1,_e));let We=I0(re,ge,pe,_e);return Ce==="end"?We=J2(We-re.height+pe.height):Ce==="center"&&(We=J2(We-re.height/2+pe.height/2)),me&&(We+=me),{top:We,behavior:Re}})),i);const Z=Ml(Ht(M,Kn(W=>W.offsetBottom+W.bottom)),0);return Ln(Ht(w,Kn(W=>({width:W.visibleWidth,height:W.visibleHeight}))),T),{data:B,totalCount:I,viewportDimensions:T,itemDimensions:A,scrollTop:r,scrollHeight:$,overscan:e,scrollBy:s,scrollTo:i,scrollToIndex:z,smoothScrollTargetReached:u,windowViewportRect:w,windowScrollTo:j,useWindowScroll:C,customScrollParent:_,windowScrollContainerState:k,deviation:ee,scrollContainerState:d,footerHeight:p,headerHeight:h,initialItemCount:O,gap:H,restoreStateFrom:K,...v,initialTopMostItemIndex:U,gridState:M,totalListHeight:Z,...g,startReached:he,endReached:xe,rangeChanged:ae,stateChanged:G,propsReady:b,stateRestoreInProgress:R,...E}},Bi(LL,Ch,O_,BL,NL,HL,P_));function tw(e,t,n,r){const{height:o}=n;if(o===void 0||r.length===0)return{top:0,bottom:0};const s=I0(e,t,n,r[0].index),i=I0(e,t,n,r[r.length-1].index)+o;return{top:s,bottom:i}}function I0(e,t,n,r){const o=A_(e.width,n.width,t.column),s=Zf(r/o),i=s*n.height+Xc(0,s-1)*t.row;return i>0?i+t.row:i}function A_(e,t,n){return Xc(1,Zf((e+n)/(Zf(t)+n)))}const JL=Qs(()=>{const e=Bt(p=>`Item ${p}`),t=Bt({}),n=Bt(null),r=Bt("virtuoso-grid-item"),o=Bt("virtuoso-grid-list"),s=Bt(VL),i=Bt("div"),u=Bt(xh),d=(p,h=null)=>Ml(Ht(t,Kn(g=>g[p]),go()),h);return{context:n,itemContent:e,components:t,computeItemKey:s,itemClassName:r,listClassName:o,headerFooterTag:i,scrollerRef:u,FooterComponent:d("Footer"),HeaderComponent:d("Header"),ListComponent:d("List","div"),ItemComponent:d("Item","div"),ScrollerComponent:d("Scroller","div"),ScrollSeekPlaceholder:d("ScrollSeekPlaceholder","div")}}),ZL=Qs(([e,t])=>({...e,...t}),Bi(XL,JL)),eB=N.memo(function(){const t=tr("gridState"),n=tr("listClassName"),r=tr("itemClassName"),o=tr("itemContent"),s=tr("computeItemKey"),i=tr("isSeeking"),u=ps("scrollHeight"),d=tr("ItemComponent"),p=tr("ListComponent"),h=tr("ScrollSeekPlaceholder"),g=tr("context"),v=ps("itemDimensions"),b=ps("gap"),S=tr("log"),w=tr("stateRestoreInProgress"),C=Sh(_=>{const k=_.parentElement.parentElement.scrollHeight;u(k);const j=_.firstChild;if(j){const{width:E,height:I}=j.getBoundingClientRect();v({width:E,height:I})}b({row:nw("row-gap",getComputedStyle(_).rowGap,S),column:nw("column-gap",getComputedStyle(_).columnGap,S)})});return w?null:N.createElement(p,{ref:C,className:n,..._i(p,g),style:{paddingTop:t.offsetTop,paddingBottom:t.offsetBottom},"data-test-id":"virtuoso-item-list"},t.items.map(_=>{const k=s(_.index,_.data,g);return i?N.createElement(h,{key:k,..._i(h,g),index:_.index,height:t.itemHeight,width:t.itemWidth}):N.createElement(d,{..._i(d,g),className:r,"data-index":_.index,key:k},o(_.index,_.data,g))}))}),tB=N.memo(function(){const t=tr("HeaderComponent"),n=ps("headerHeight"),r=tr("headerFooterTag"),o=Sh(i=>n(Yf(i,"height"))),s=tr("context");return t?N.createElement(r,{ref:o},N.createElement(t,_i(t,s))):null}),nB=N.memo(function(){const t=tr("FooterComponent"),n=ps("footerHeight"),r=tr("headerFooterTag"),o=Sh(i=>n(Yf(i,"height"))),s=tr("context");return t?N.createElement(r,{ref:o},N.createElement(t,_i(t,s))):null}),rB=({children:e})=>{const t=N.useContext(D_),n=ps("itemDimensions"),r=ps("viewportDimensions"),o=Sh(s=>{r(s.getBoundingClientRect())});return N.useEffect(()=>{t&&(r({height:t.viewportHeight,width:t.viewportWidth}),n({height:t.itemHeight,width:t.itemWidth}))},[t,r,n]),N.createElement("div",{style:T_,ref:o},e)},oB=({children:e})=>{const t=N.useContext(D_),n=ps("windowViewportRect"),r=ps("itemDimensions"),o=tr("customScrollParent"),s=WL(n,o);return N.useEffect(()=>{t&&(r({height:t.itemHeight,width:t.itemWidth}),n({offsetTop:0,visibleHeight:t.viewportHeight,visibleWidth:t.viewportWidth}))},[t,n,r]),N.createElement("div",{ref:s,style:T_},e)},sB=N.memo(function({...t}){const n=tr("useWindowScroll"),r=tr("customScrollParent"),o=r||n?lB:iB,s=r||n?oB:rB;return N.createElement(o,{...t},N.createElement(s,null,N.createElement(tB,null),N.createElement(eB,null),N.createElement(nB,null)))}),{Component:aB,usePublisher:ps,useEmitterValue:tr,useEmitter:N_}=PL(ZL,{optional:{context:"context",totalCount:"totalCount",overscan:"overscan",itemContent:"itemContent",components:"components",computeItemKey:"computeItemKey",data:"data",initialItemCount:"initialItemCount",scrollSeekConfiguration:"scrollSeekConfiguration",headerFooterTag:"headerFooterTag",listClassName:"listClassName",itemClassName:"itemClassName",useWindowScroll:"useWindowScroll",customScrollParent:"customScrollParent",scrollerRef:"scrollerRef",logLevel:"logLevel",restoreStateFrom:"restoreStateFrom",initialTopMostItemIndex:"initialTopMostItemIndex"},methods:{scrollTo:"scrollTo",scrollBy:"scrollBy",scrollToIndex:"scrollToIndex"},events:{isScrolling:"isScrolling",endReached:"endReached",startReached:"startReached",rangeChanged:"rangeChanged",atBottomStateChange:"atBottomStateChange",atTopStateChange:"atTopStateChange",stateChanged:"stateChanged"}},sB),iB=GL({usePublisher:ps,useEmitterValue:tr,useEmitter:N_}),lB=qL({usePublisher:ps,useEmitterValue:tr,useEmitter:N_});function nw(e,t,n){return t!=="normal"&&!(t!=null&&t.endsWith("px"))&&n(`${e} was not resolved to pixel value correctly`,t,v1.WARN),t==="normal"?0:parseInt(t??"0",10)}const $_=aB,cB=({image:e})=>{const t=f.useMemo(()=>{var n,r;if(XE((n=e.metadata)==null?void 0:n.model))return(r=e.metadata)==null?void 0:r.model},[e.metadata]);return a.jsxs(F,{sx:{pointerEvents:"none",flexDirection:"column",position:"absolute",top:0,insetInlineStart:0,p:2,alignItems:"flex-start",gap:2},children:[a.jsxs(Xa,{variant:"solid",colorScheme:"base",children:[e.width," × ",e.height]}),t&&a.jsx(Xa,{variant:"solid",colorScheme:"base",children:t})]})},z_=({postUploadAction:e,isDisabled:t})=>{const n=te(),r=f.useCallback(u=>{const d=u[0];d&&n(x4({file:d,image_category:"user",is_intermediate:!1,postUploadAction:e}))},[n,e]),{getRootProps:o,getInputProps:s,open:i}=Vv({accept:{"image/png":[".png"],"image/jpeg":[".jpg",".jpeg",".png"]},onDropAccepted:r,disabled:t,noDrag:!0,multiple:!1});return{getUploadButtonProps:o,getUploadInputProps:s,openUploader:i}},uB=e=>{const{data:t,disabled:n,onClick:r}=e,o=f.useRef(Ga()),{attributes:s,listeners:i,setNodeRef:u}=JE({id:o.current,disabled:n,data:t});return a.jsx(ze,{onClick:r,ref:u,position:"absolute",w:"full",h:"full",top:0,insetInlineStart:0,...s,...i})},dB=f.memo(uB),fB=()=>{const e=f.useCallback(()=>{},[]),t=f.useCallback(()=>{},[]),n=f.useCallback(()=>{},[]);return a.jsxs(a.Fragment,{children:[a.jsx(Pr,{icon:a.jsx(qc,{}),onClickCapture:e,children:"Move Selection to Board"}),a.jsx(Pr,{icon:a.jsx(g$,{}),onClickCapture:n,children:"Add Selection to Batch"}),a.jsx(Pr,{sx:{color:"error.600",_dark:{color:"error.300"}},icon:a.jsx(yo,{}),onClickCapture:t,children:"Delete Selection"})]})},y1=()=>{const e=te(),t=Ql(),{t:n}=fe(),r=f.useCallback(()=>{t({title:n("toast.parameterSet"),status:"info",duration:2500,isClosable:!0})},[n,t]),o=f.useCallback(()=>{t({title:n("toast.parameterNotSet"),status:"warning",duration:2500,isClosable:!0})},[n,t]),s=f.useCallback(()=>{t({title:n("toast.parametersSet"),status:"info",duration:2500,isClosable:!0})},[n,t]),i=f.useCallback(()=>{t({title:n("toast.parametersNotSet"),status:"warning",duration:2500,isClosable:!0})},[n,t]),u=f.useCallback((I,O)=>{if(_d(I)||kd(O)){_d(I)&&e(Vc(I)),kd(O)&&e(Uc(O)),r();return}o()},[e,r,o]),d=f.useCallback(I=>{if(!_d(I)){o();return}e(Vc(I)),r()},[e,r,o]),p=f.useCallback(I=>{if(!kd(I)){o();return}e(Uc(I)),r()},[e,r,o]),h=f.useCallback(I=>{if(!Vb(I)){o();return}e(_f(I)),r()},[e,r,o]),g=f.useCallback(I=>{if(!Ub(I)){o();return}e(kf(I)),r()},[e,r,o]),v=f.useCallback(I=>{if(!Gb(I)){o();return}e(Gg(I)),r()},[e,r,o]),b=f.useCallback(I=>{if(!qb(I)){o();return}e(qg(I)),r()},[e,r,o]),S=f.useCallback(I=>{if(!Kb(I)){o();return}e(Pf(I)),r()},[e,r,o]),w=f.useCallback(I=>{if(!Yb(I)){o();return}e(Tl(I)),r()},[e,r,o]),C=f.useCallback(I=>{if(!Qb(I)){o();return}e(Al(I)),r()},[e,r,o]),_=f.useCallback(I=>{if(!Xb(I)){o();return}e(jf(I)),r()},[e,r,o]),k=f.useCallback(async I=>{if(!ZE(I)){o();return}e(If(I.image_name)),r()},[e,r,o]),j=f.useCallback(I=>{e(If(I))},[e]),E=f.useCallback(I=>{if(!I){i();return}const{cfg_scale:O,height:M,model:T,positive_prompt:A,negative_prompt:z,scheduler:$,seed:ee,steps:B,width:H,strength:G}=I;Ub(O)&&e(kf(O)),Gb(T)&&e(Gg(T)),_d(A)&&e(Vc(A)),kd(z)&&e(Uc(z)),qb($)&&e(qg($)),Vb(ee)&&e(_f(ee)),Kb(B)&&e(Pf(B)),Yb(H)&&e(Tl(H)),Qb(M)&&e(Al(M)),Xb(G)&&e(jf(G)),s()},[i,s,e]);return{recallBothPrompts:u,recallPositivePrompt:d,recallNegativePrompt:p,recallSeed:h,recallInitialImage:k,recallCfgScale:g,recallModel:v,recallScheduler:b,recallSteps:S,recallWidth:w,recallHeight:C,recallStrength:_,recallAllParameters:E,sendToImageToImage:j}},b1=()=>{const e=Ql(),{t}=fe(),n=f.useMemo(()=>!!navigator.clipboard&&!!window.ClipboardItem,[]),r=f.useCallback(async o=>{n||e({title:t("toast.problemCopyingImage"),description:"Your browser doesn't support the Clipboard API.",status:"error",duration:2500,isClosable:!0});try{const i=await(await fetch(o)).blob();await navigator.clipboard.write([new ClipboardItem({[i.type]:i})]),e({title:t("toast.imageCopied"),status:"success",duration:2500,isClosable:!0})}catch(s){e({title:t("toast.problemCopyingImage"),description:String(s),status:"error",duration:2500,isClosable:!0})}},[n,t,e]);return{isClipboardAPIAvailable:n,copyImageToClipboard:r}},pB=e=>{const{imageDTO:t}=e,n=f.useMemo(()=>ve([Rt],({gallery:B})=>({isInBatch:B.batchImageNames.includes(t.image_name)}),it),[t.image_name]),{isInBatch:r}=L(n),o=te(),{t:s}=fe(),i=Ql(),u=br("unifiedCanvas").isFeatureEnabled,d=br("batches").isFeatureEnabled,{onClickAddToBoard:p}=f.useContext(_4),{currentData:h}=cv(t.image_name),{isClipboardAPIAvailable:g,copyImageToClipboard:v}=b1(),b=h==null?void 0:h.metadata,S=f.useCallback(()=>{t&&o(uv(t))},[o,t]),{recallBothPrompts:w,recallSeed:C,recallAllParameters:_}=y1(),[k]=e8(),j=f.useCallback(()=>{w(b==null?void 0:b.positive_prompt,b==null?void 0:b.negative_prompt)},[b==null?void 0:b.negative_prompt,b==null?void 0:b.positive_prompt,w]),E=f.useCallback(()=>{C(b==null?void 0:b.seed)},[b==null?void 0:b.seed,C]),I=f.useCallback(()=>{o(k4()),o(If(t))},[o,t]),O=f.useCallback(()=>{o(t8()),o(n8(t)),o(Kp()),o(gl("unifiedCanvas")),i({title:s("toast.sentToUnifiedCanvas"),status:"success",duration:2500,isClosable:!0})},[o,t,s,i]),M=f.useCallback(()=>{console.log(b),_(b)},[b,_]),T=f.useCallback(()=>{p(t)},[t,p]),A=f.useCallback(()=>{t.board_id&&k({board_id:t.board_id,image_name:t.image_name})},[t.board_id,t.image_name,k]),z=f.useCallback(()=>{window.open(t.image_url,"_blank")},[t.image_url]),$=f.useCallback(()=>{o(r8([t.image_name]))},[o,t.image_name]),ee=f.useCallback(()=>{v(t.image_url)},[v,t.image_url]);return a.jsxs(a.Fragment,{children:[a.jsx(Ka,{href:t.image_url,target:"_blank",children:a.jsx(Pr,{icon:a.jsx(p$,{}),onClickCapture:z,children:s("common.openInNewTab")})}),g&&a.jsx(Pr,{icon:a.jsx(rc,{}),onClickCapture:ee,children:s("parameters.copyImage")}),a.jsx(Pr,{icon:a.jsx(B5,{}),onClickCapture:j,isDisabled:(b==null?void 0:b.positive_prompt)===void 0&&(b==null?void 0:b.negative_prompt)===void 0,children:s("parameters.usePrompt")}),a.jsx(Pr,{icon:a.jsx(F5,{}),onClickCapture:E,isDisabled:(b==null?void 0:b.seed)===void 0,children:s("parameters.useSeed")}),a.jsx(Pr,{icon:a.jsx(R5,{}),onClickCapture:M,isDisabled:!b,children:s("parameters.useAll")}),a.jsx(Pr,{icon:a.jsx(m2,{}),onClickCapture:I,id:"send-to-img2img",children:s("parameters.sendToImg2Img")}),u&&a.jsx(Pr,{icon:a.jsx(m2,{}),onClickCapture:O,id:"send-to-canvas",children:s("parameters.sendToUnifiedCanvas")}),d&&a.jsx(Pr,{icon:a.jsx(qc,{}),isDisabled:r,onClickCapture:$,children:"Add to Batch"}),a.jsx(Pr,{icon:a.jsx(qc,{}),onClickCapture:T,children:t.board_id?"Change Board":"Add to Board"}),t.board_id&&a.jsx(Pr,{icon:a.jsx(qc,{}),onClickCapture:A,children:"Remove from Board"}),a.jsx(Ka,{download:!0,href:t.image_url,target:"_blank",children:a.jsx(Pr,{icon:a.jsx(Gv,{}),w:"100%",children:s("parameters.downloadImage")})}),a.jsx(Pr,{sx:{color:"error.600",_dark:{color:"error.300"}},icon:a.jsx(yo,{}),onClickCapture:S,children:s("gallery.deleteImage")})]})},L_=f.memo(pB),hB=({imageDTO:e,children:t})=>{const n=f.useMemo(()=>ve([Rt],({gallery:s})=>({selectionCount:s.selection.length}),it),[]),{selectionCount:r}=L(n),o=f.useCallback(s=>{s.preventDefault()},[]);return a.jsx(b_,{menuProps:{size:"sm",isLazy:!0},menuButtonProps:{bg:"transparent",_hover:{bg:"transparent"}},renderMenu:()=>e?a.jsx(tc,{sx:{visibility:"visible !important"},motionProps:C3,onContextMenu:o,children:r===1?a.jsx(L_,{imageDTO:e}):a.jsx(fB,{})}):null,children:t})},x1=f.memo(hB),mB=e=>{const{imageDTO:t,onClickReset:n,onError:r,onClick:o,withResetIcon:s=!1,withMetadataOverlay:i=!1,isDropDisabled:u=!1,isDragDisabled:d=!1,isUploadDisabled:p=!1,minSize:h=24,postUploadAction:g,imageSx:v,fitContainer:b=!1,droppableData:S,draggableData:w,dropLabel:C,isSelected:_=!1,thumbnail:k=!1,resetTooltip:j="Reset",resetIcon:E=a.jsx(Yv,{}),noContentFallback:I=a.jsx(Li,{icon:oc})}=e,{colorMode:O}=Ro(),{getUploadButtonProps:M,getUploadInputProps:T}=z_({postUploadAction:g,isDisabled:p}),A=ff("drop-shadow(0px 0px 0.1rem var(--invokeai-colors-base-600))","drop-shadow(0px 0px 0.1rem var(--invokeai-colors-base-800))"),z=p?{}:{cursor:"pointer",bg:ke("base.200","base.800")(O),_hover:{bg:ke("base.300","base.650")(O),color:ke("base.500","base.300")(O)}};return a.jsx(x1,{imageDTO:t,children:$=>a.jsxs(F,{ref:$,sx:{width:"full",height:"full",alignItems:"center",justifyContent:"center",position:"relative",minW:h||void 0,minH:h||void 0,userSelect:"none",cursor:d||!t?"default":"pointer"},children:[t&&a.jsxs(F,{sx:{w:"full",h:"full",position:b?"absolute":"relative",alignItems:"center",justifyContent:"center"},children:[a.jsx(bu,{src:k?t.thumbnail_url:t.image_url,fallbackStrategy:"beforeLoadOrError",fallbackSrc:t.thumbnail_url,width:t.width,height:t.height,onError:r,draggable:!1,sx:{objectFit:"contain",maxW:"full",maxH:"full",borderRadius:"base",shadow:_?"selected.light":void 0,_dark:{shadow:_?"selected.dark":void 0},...v}}),i&&a.jsx(cB,{image:t})]}),!t&&!p&&a.jsx(a.Fragment,{children:a.jsxs(F,{sx:{minH:h,w:"full",h:"full",alignItems:"center",justifyContent:"center",borderRadius:"base",transitionProperty:"common",transitionDuration:"0.1s",color:ke("base.500","base.500")(O),...z},...M(),children:[a.jsx("input",{...T()}),a.jsx(mo,{as:Au,sx:{boxSize:16}})]})}),!t&&p&&I,!u&&a.jsx(h1,{data:S,disabled:u,dropLabel:C}),t&&!d&&a.jsx(dB,{data:w,disabled:d||!t,onClick:o}),n&&s&&t&&a.jsx(je,{onClick:n,"aria-label":j,tooltip:j,icon:E,size:"sm",variant:"link",sx:{position:"absolute",top:1,insetInlineEnd:1,p:0,minW:0,svg:{transitionProperty:"common",transitionDuration:"normal",fill:"base.100",_hover:{fill:"base.50"},filter:A}}})]})})},Ja=f.memo(mB),gB=()=>a.jsx(ze,{sx:{position:"relative",height:"full",width:"full","::before":{content:"''",display:"block",pt:"100%"}},children:a.jsx(F,{sx:{position:"absolute",top:0,insetInlineStart:0,height:"full",width:"full",alignItems:"center",justifyContent:"center",borderRadius:"base",bg:"base.100",color:"base.500",_dark:{color:"base.700",bg:"base.850"}},children:a.jsx(mo,{as:u$,boxSize:16,opacity:.7})})}),vB=()=>a.jsx(t5,{sx:{position:"relative",height:"full",width:"full","::before":{content:"''",display:"block",pt:"100%"}},children:a.jsx(ze,{sx:{position:"absolute",top:0,insetInlineStart:0,height:"full",width:"full"}})}),yB=e=>ve([Rt],t=>({selectionCount:t.gallery.selection.length,selection:t.gallery.selection,isSelected:t.gallery.selection.includes(e)}),it),bB=e=>{const t=te(),{imageName:n}=e,{currentData:r,isLoading:o,isError:s,isSuccess:i}=gs(n),u=f.useMemo(()=>yB(n),[n]),{isSelected:d,selectionCount:p,selection:h}=L(u),g=f.useCallback(()=>{t(o8([n]))},[t,n]),v=f.useCallback(S=>{S.shiftKey?t(s8(n)):S.ctrlKey||S.metaKey?t(a8(n)):t(Ef(n))},[t,n]),b=f.useMemo(()=>{if(p>1)return{id:"batch",payloadType:"IMAGE_NAMES",payload:{image_names:h}};if(r)return{id:"batch",payloadType:"IMAGE_DTO",payload:{imageDTO:r}}},[r,h,p]);return o?a.jsx(vB,{}):s||!r?a.jsx(gB,{}):a.jsx(ze,{sx:{w:"full",h:"full",touchAction:"none"},children:a.jsx(x1,{imageDTO:r,children:S=>a.jsx(ze,{position:"relative",userSelect:"none",ref:S,sx:{display:"flex",justifyContent:"center",alignItems:"center",aspectRatio:"1/1"},children:a.jsx(Ja,{onClick:v,imageDTO:r,draggableData:b,isSelected:d,minSize:0,onClickReset:g,isDropDisabled:!0,imageSx:{w:"full",h:"full"},isUploadDisabled:!0,resetTooltip:"Remove from batch",withResetIcon:!0,thumbnail:!0})},n)})})},xB=f.memo(bB),B_=tt((e,t)=>a.jsx(ze,{className:"item-container",ref:t,p:1.5,children:e.children})),F_=tt((e,t)=>{const n=L(r=>r.gallery.galleryImageMinimumWidth);return a.jsx(Ei,{...e,className:"list-container",ref:t,sx:{gridTemplateColumns:`repeat(auto-fill, minmax(${n}px, 1fr));`},children:e.children})}),wB=ve([Rt],e=>({imageNames:e.gallery.batchImageNames}),it),SB=()=>{const{t:e}=fe(),t=f.useRef(null),[n,r]=f.useState(null),[o,s]=p1({defer:!0,options:{scrollbars:{visibility:"auto",autoHide:"leave",autoHideDelay:1300,theme:"os-theme-dark"},overflow:{x:"hidden"}}}),{imageNames:i}=L(wB);return f.useEffect(()=>{const{current:u}=t;return n&&u&&o({target:u,elements:{viewport:n}}),()=>{var d;return(d=s())==null?void 0:d.destroy()}},[n,o,s]),i.length?a.jsx(ze,{ref:t,"data-overlayscrollbars":"",h:"100%",children:a.jsx($_,{style:{height:"100%"},data:i,components:{Item:B_,List:F_},scrollerRef:r,itemContent:(u,d)=>a.jsx(xB,{imageName:d},d)})}):a.jsx(Li,{label:e("gallery.noImagesInGallery"),icon:oc})},CB=f.memo(SB),_B=e=>ve([Rt],({gallery:t})=>({isSelected:t.selection.includes(e),selectionCount:t.selection.length,selection:t.selection}),it),kB=e=>{const t=te(),{imageName:n}=e,{currentData:r}=gs(n),o=f.useMemo(()=>_B(n),[n]),{isSelected:s,selectionCount:i,selection:u}=L(o),d=f.useCallback(g=>{t(Ef(n))},[t,n]),p=f.useCallback(g=>{g.stopPropagation(),r&&t(uv(r))},[t,r]),h=f.useMemo(()=>{if(i>1)return{id:"gallery-image",payloadType:"IMAGE_NAMES",payload:{image_names:u}};if(r)return{id:"gallery-image",payloadType:"IMAGE_DTO",payload:{imageDTO:r}}},[r,u,i]);return r?a.jsx(ze,{sx:{w:"full",h:"full",touchAction:"none"},children:a.jsx(x1,{imageDTO:r,children:g=>a.jsx(ze,{position:"relative",userSelect:"none",ref:g,sx:{display:"flex",justifyContent:"center",alignItems:"center",aspectRatio:"1/1"},children:a.jsx(Ja,{onClick:d,imageDTO:r,draggableData:h,isSelected:s,minSize:0,onClickReset:p,imageSx:{w:"full",h:"full"},isDropDisabled:!0,isUploadDisabled:!0,thumbnail:!0})},n)})}):a.jsx(Jl,{})},PB=f.memo(kB),jB=ve([Rt,P4],(e,t)=>{const{galleryImageMinimumWidth:n,selectedBoardId:r,galleryView:o,total:s,isLoading:i}=e.gallery;return{imageNames:t.map(u=>u.image_name),total:s,selectedBoardId:r,galleryView:o,galleryImageMinimumWidth:n,isLoading:i}},it),IB=()=>{const{t:e}=fe(),t=f.useRef(null),n=f.useRef(null),[r,o]=f.useState(null),[s,i]=p1({defer:!0,options:{scrollbars:{visibility:"auto",autoHide:"leave",autoHideDelay:1300,theme:"os-theme-dark"},overflow:{x:"hidden"}}});f.useState(!1);const u=te(),{galleryImageMinimumWidth:d,imageNames:p,total:h,selectedBoardId:g,galleryView:v,isLoading:b}=L(jB),{data:S,isLoading:w}=i8({board_id:g},{skip:g==="all"}),C=f.useMemo(()=>{if(g==="all")return p;{const E=v==="images"?Jb:Zb;return((S==null?void 0:S.items)||[]).filter(O=>E.includes(O.image_category)).map(O=>O.image_name)}},[g,v,S,p]),_=f.useMemo(()=>g==="all"?h>p.length:!1,[g,p.length,h]),k=f.useMemo(()=>g==="all"?b:w,[g,b,w]),j=f.useCallback(()=>{u(j4({categories:v==="images"?Jb:Zb,is_intermediate:!1,offset:C.length,limit:l8}))},[u,C.length,v]);if(f.useEffect(()=>{const{current:E}=t;return r&&E&&s({target:E,elements:{viewport:r}}),()=>{var I;return(I=i())==null?void 0:I.destroy()}},[r,s,i]),f.useMemo(()=>{if(_)return j},[_,j]),!k&&C.length===0)return a.jsx(ze,{ref:n,sx:{w:"full",h:"full"},children:a.jsx(Li,{label:e("gallery.noImagesInGallery"),icon:oc})});if(status!=="rejected")return a.jsxs(a.Fragment,{children:[a.jsx(ze,{ref:t,"data-overlayscrollbars":"",h:"100%",children:a.jsx($_,{style:{height:"100%"},data:C,components:{Item:B_,List:F_},scrollerRef:o,itemContent:(E,I)=>a.jsx(PB,{imageName:I},I)})}),a.jsx(Zt,{onClick:j,isDisabled:!_,isLoading:status==="pending",loadingText:"Loading",flexShrink:0,children:e(_?"gallery.loadMore":"gallery.allImagesLoaded")})]})},EB=f.memo(IB),OB=ve([Rt],e=>{const{selectedBoardId:t,galleryImageMinimumWidth:n,galleryView:r,shouldAutoSwitch:o}=e.gallery,{shouldPinGallery:s}=e.ui;return{selectedBoardId:t,shouldPinGallery:s,galleryImageMinimumWidth:n,shouldAutoSwitch:o,galleryView:r}},it),MB=()=>{const e=te(),{t}=fe(),n=f.useRef(null),r=f.useRef(null),{colorMode:o}=Ro(),{selectedBoardId:s,shouldPinGallery:i,galleryImageMinimumWidth:u,shouldAutoSwitch:d,galleryView:p}=L(OB),{selectedBoard:h}=lv(void 0,{selectFromResult:({data:k})=>({selectedBoard:k==null?void 0:k.find(j=>j.board_id===s)})}),g=f.useMemo(()=>s==="batch"?"Batch":h?h.board_name:"All Images",[h,s]),{isOpen:v,onToggle:b}=Ws(),S=k=>{e(Of(k))},w=()=>{e(I4()),e(vo())},C=f.useCallback(()=>{e(ex("images"))},[e]),_=f.useCallback(()=>{e(ex("assets"))},[e]);return a.jsxs(I6,{sx:{flexDirection:"column",h:"full",w:"full",borderRadius:"base"},children:[a.jsxs(ze,{sx:{w:"full"},children:[a.jsxs(F,{ref:n,sx:{alignItems:"center",justifyContent:"space-between",gap:2},children:[a.jsxs(Yn,{isAttached:!0,children:[a.jsx(je,{tooltip:t("gallery.images"),"aria-label":t("gallery.images"),onClick:C,isChecked:p==="images",size:"sm",icon:a.jsx(oc,{})}),a.jsx(je,{tooltip:t("gallery.assets"),"aria-label":t("gallery.assets"),onClick:_,isChecked:p==="assets",size:"sm",icon:a.jsx(O$,{})})]}),a.jsxs(F,{as:Sf,onClick:b,size:"sm",variant:"ghost",sx:{w:"full",justifyContent:"center",alignItems:"center",px:2,_hover:{bg:ke("base.100","base.800")(o)}},children:[a.jsx(nt,{noOfLines:1,sx:{w:"full",color:ke("base.800","base.200")(o),fontWeight:600},children:g}),a.jsx(Xv,{sx:{transform:v?"rotate(0deg)":"rotate(180deg)",transitionProperty:"common",transitionDuration:"normal"}})]}),a.jsx(zi,{triggerComponent:a.jsx(je,{tooltip:t("gallery.gallerySettings"),"aria-label":t("gallery.gallerySettings"),size:"sm",icon:a.jsx(Qv,{})}),children:a.jsxs(F,{direction:"column",gap:2,children:[a.jsx(St,{value:u,onChange:S,min:32,max:256,hideTooltip:!0,label:t("gallery.galleryImageSize"),withReset:!0,handleReset:()=>e(Of(64))}),a.jsx(Bn,{label:t("gallery.autoSwitchNewImages"),isChecked:d,onChange:k=>e(c8(k.target.checked))})]})}),a.jsx(je,{size:"sm","aria-label":t("gallery.pinGallery"),tooltip:`${t("gallery.pinGallery")} (Shift+G)`,onClick:w,icon:i?a.jsx(E5,{}):a.jsx(O5,{})})]}),a.jsx(ze,{children:a.jsx(gL,{isOpen:v})})]}),a.jsx(F,{ref:r,direction:"column",gap:2,h:"full",w:"full",children:s==="batch"?a.jsx(CB,{}):a.jsx(EB,{})})]})},H_=f.memo(MB),RB=ve([ur,Jr,u8,Xn],(e,t,n,r)=>{const{shouldPinGallery:o,shouldShowGallery:s}=t,{galleryImageMinimumWidth:i}=n;return{activeTabName:e,isStaging:r,shouldPinGallery:o,shouldShowGallery:s,galleryImageMinimumWidth:i,isResizable:e!=="unifiedCanvas"}},{memoizeOptions:{resultEqualityCheck:Qt}}),DB=()=>{const e=te(),{shouldPinGallery:t,shouldShowGallery:n,galleryImageMinimumWidth:r}=L(RB),o=()=>{e(Kg(!1)),t&&e(vo())};Ke("esc",()=>{e(Kg(!1))},{enabled:()=>!t,preventDefault:!0},[t]);const s=32;return Ke("shift+up",()=>{if(r<256){const i=Vs(r+s,32,256);e(Of(i))}},[r]),Ke("shift+down",()=>{if(r>32){const i=Vs(r-s,32,256);e(Of(i))}},[r]),t?null:a.jsx(I5,{direction:"right",isResizable:!0,isOpen:n,onClose:o,minWidth:337,children:a.jsx(H_,{})})},TB=f.memo(DB),AB=e=>{const{label:t,isDisabled:n=!1,width:r="auto",formControlProps:o,formLabelProps:s,tooltip:i,...u}=e;return a.jsx(_n,{label:i,hasArrow:!0,placement:"top",isDisabled:!i,children:a.jsxs(Ss,{isDisabled:n,width:r,display:"flex",alignItems:"center",...o,children:[t&&a.jsx(vs,{my:1,flexGrow:1,sx:{cursor:n?"not-allowed":"pointer",...s==null?void 0:s.sx,pe:4},...s,children:t}),a.jsx(Hv,{...u})]})})},jn=f.memo(AB),NB=e=>{const{imageUsage:t}=e;return!t||!E4(t)?null:a.jsxs(a.Fragment,{children:[a.jsx(nt,{children:"This image is currently in use in the following features:"}),a.jsxs(th,{sx:{paddingInlineStart:6},children:[t.isInitialImage&&a.jsx(Io,{children:"Image to Image"}),t.isCanvasImage&&a.jsx(Io,{children:"Unified Canvas"}),t.isControlNetImage&&a.jsx(Io,{children:"ControlNet"}),t.isNodesImage&&a.jsx(Io,{children:"Node Editor"})]}),a.jsx(nt,{children:"If you delete this image, those features will immediately be reset."})]})},$B=f.memo(NB),zB=ve([Rt,d8],({system:e,config:t,imageDeletion:n},r)=>{const{shouldConfirmOnDelete:o}=e,{canRestoreDeletedImagesFromBin:s}=t,{imageToDelete:i,isModalOpen:u}=n;return{shouldConfirmOnDelete:o,canRestoreDeletedImagesFromBin:s,imageToDelete:i,imageUsage:r,isModalOpen:u}},it),LB=()=>{const e=te(),{t}=fe(),{shouldConfirmOnDelete:n,canRestoreDeletedImagesFromBin:r,imageToDelete:o,imageUsage:s,isModalOpen:i}=L(zB),u=f.useCallback(g=>e(O4(!g.target.checked)),[e]),d=f.useCallback(()=>{e(tx()),e(f8(!1))},[e]),p=f.useCallback(()=>{!o||!s||(e(tx()),e(p8({imageDTO:o,imageUsage:s})))},[e,o,s]),h=f.useRef(null);return a.jsx(Ou,{isOpen:i,onClose:d,leastDestructiveRef:h,isCentered:!0,children:a.jsx(va,{children:a.jsxs(Mu,{children:[a.jsx(ga,{fontSize:"lg",fontWeight:"bold",children:t("gallery.deleteImage")}),a.jsx(ya,{children:a.jsxs(F,{direction:"column",gap:3,children:[a.jsx($B,{imageUsage:s}),a.jsx(ni,{}),a.jsx(nt,{children:t(r?"gallery.deleteImageBin":"gallery.deleteImagePermanent")}),a.jsx(nt,{children:t("common.areYouSure")}),a.jsx(jn,{label:t("common.dontAskMeAgain"),isChecked:!n,onChange:u})]})}),a.jsxs(ma,{children:[a.jsx(Zt,{ref:h,onClick:d,children:"Cancel"}),a.jsx(Zt,{colorScheme:"error",onClick:p,ml:3,children:"Delete"})]})]})})})},BB=f.memo(LB);function rw(e){for(var t=[],n=1;n{const{isConnected:t,isProcessing:n,statusTranslationKey:r,currentIteration:o,totalIterations:s,currentStatusHasSteps:i}=e;return{isConnected:t,isProcessing:n,currentIteration:o,totalIterations:s,statusTranslationKey:r,currentStatusHasSteps:i}},it),sw={ok:"green.400",working:"yellow.400",error:"red.400"},aw={ok:"green.600",working:"yellow.500",error:"red.500"},GB=()=>{const{isConnected:e,isProcessing:t,currentIteration:n,totalIterations:r,statusTranslationKey:o}=L(UB),{t:s}=fe(),i=f.useRef(null),u=f.useMemo(()=>t?"working":e?"ok":"error",[t,e]),d=f.useMemo(()=>{if(n&&r)return` (${n}/${r})`},[n,r]),p=W_(i);return a.jsxs(F,{ref:i,h:"full",px:2,alignItems:"center",gap:5,children:[a.jsx(ws,{children:p&&a.jsx(io.div,{initial:{opacity:0},animate:{opacity:1,transition:{duration:.15}},exit:{opacity:0,transition:{delay:.8}},children:a.jsxs(nt,{sx:{fontSize:"sm",fontWeight:"600",pb:"1px",userSelect:"none",color:aw[u],_dark:{color:sw[u]}},children:[s(o),d]})},"statusText")}),a.jsx(mo,{as:i$,sx:{boxSize:"0.5rem",color:aw[u],_dark:{color:sw[u]}}})]})};function qB(e){return Ve({tag:"svg",attr:{viewBox:"0 0 24 24"},child:[{tag:"path",attr:{fill:"none",d:"M0 0h24v24H0z"}},{tag:"path",attr:{d:"M16.5 9c-.42 0-.83.04-1.24.11L1.01 3 1 10l9 2-9 2 .01 7 8.07-3.46C9.59 21.19 12.71 24 16.5 24c4.14 0 7.5-3.36 7.5-7.5S20.64 9 16.5 9zm0 13c-3.03 0-5.5-2.47-5.5-5.5s2.47-5.5 5.5-5.5 5.5 2.47 5.5 5.5-2.47 5.5-5.5 5.5z"}},{tag:"path",attr:{d:"M18.27 14.03l-1.77 1.76-1.77-1.76-.7.7 1.76 1.77-1.76 1.77.7.7 1.77-1.76 1.77 1.76.7-.7-1.76-1.77 1.76-1.77z"}}]})(e)}function KB(e){return Ve({tag:"svg",attr:{viewBox:"0 0 24 24"},child:[{tag:"path",attr:{fill:"none",d:"M0 0h24v24H0V0z"}},{tag:"path",attr:{d:"M19.14 12.94c.04-.3.06-.61.06-.94 0-.32-.02-.64-.07-.94l2.03-1.58a.49.49 0 00.12-.61l-1.92-3.32a.488.488 0 00-.59-.22l-2.39.96c-.5-.38-1.03-.7-1.62-.94l-.36-2.54a.484.484 0 00-.48-.41h-3.84c-.24 0-.43.17-.47.41l-.36 2.54c-.59.24-1.13.57-1.62.94l-2.39-.96c-.22-.08-.47 0-.59.22L2.74 8.87c-.12.21-.08.47.12.61l2.03 1.58c-.05.3-.09.63-.09.94s.02.64.07.94l-2.03 1.58a.49.49 0 00-.12.61l1.92 3.32c.12.22.37.29.59.22l2.39-.96c.5.38 1.03.7 1.62.94l.36 2.54c.05.24.24.41.48.41h3.84c.24 0 .44-.17.47-.41l.36-2.54c.59-.24 1.13-.56 1.62-.94l2.39.96c.22.08.47 0 .59-.22l1.92-3.32c.12-.22.07-.47-.12-.61l-2.01-1.58zM12 15.6c-1.98 0-3.6-1.62-3.6-3.6s1.62-3.6 3.6-3.6 3.6 1.62 3.6 3.6-1.62 3.6-3.6 3.6z"}}]})(e)}function YB(e){return Ve({tag:"svg",attr:{viewBox:"0 0 24 24"},child:[{tag:"path",attr:{fill:"none",d:"M0 0h24v24H0z"}},{tag:"path",attr:{fill:"none",d:"M0 0h24v24H0V0z"}},{tag:"path",attr:{d:"M17 16l-4-4V8.82C14.16 8.4 15 7.3 15 6c0-1.66-1.34-3-3-3S9 4.34 9 6c0 1.3.84 2.4 2 2.82V12l-4 4H3v5h5v-3.05l4-4.2 4 4.2V21h5v-5h-4z"}}]})(e)}function QB(e){return Ve({tag:"svg",attr:{viewBox:"0 0 24 24"},child:[{tag:"path",attr:{fill:"none",d:"M0 0h24v24H0z"}},{tag:"path",attr:{d:"M20 2H4c-1.1 0-2 .9-2 2v16c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zM8 20H4v-4h4v4zm0-6H4v-4h4v4zm0-6H4V4h4v4zm6 12h-4v-4h4v4zm0-6h-4v-4h4v4zm0-6h-4V4h4v4zm6 12h-4v-4h4v4zm0-6h-4v-4h4v4zm0-6h-4V4h4v4z"}}]})(e)}function XB(e){return Ve({tag:"svg",attr:{viewBox:"0 0 24 24"},child:[{tag:"path",attr:{fill:"none",d:"M0 0h24v24H0z"}},{tag:"path",attr:{d:"M22 16V4c0-1.1-.9-2-2-2H8c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2zm-11-4l2.03 2.71L16 11l4 5H8l3-4zM2 6v14c0 1.1.9 2 2 2h14v-2H4V6H2z"}}]})(e)}function JB(e){return Ve({tag:"svg",attr:{viewBox:"0 0 24 24"},child:[{tag:"path",attr:{fill:"none",d:"M0 0h24v24H0z"}},{tag:"path",attr:{d:"M12 2C6.47 2 2 6.47 2 12s4.47 10 10 10 10-4.47 10-10S17.53 2 12 2zm5 13.59L15.59 17 12 13.41 8.41 17 7 15.59 10.59 12 7 8.41 8.41 7 12 10.59 15.59 7 17 8.41 13.41 12 17 15.59z"}}]})(e)}function V_(e){return Ve({tag:"svg",attr:{viewBox:"0 0 24 24"},child:[{tag:"path",attr:{fill:"none",d:"M0 0h24v24H0V0z"}},{tag:"path",attr:{d:"M16 17.01V10h-2v7.01h-3L15 21l4-3.99h-3zM9 3L5 6.99h3V14h2V6.99h3L9 3zm7 14.01V10h-2v7.01h-3L15 21l4-3.99h-3zM9 3L5 6.99h3V14h2V6.99h3L9 3z"}}]})(e)}const ZB=()=>{const{colorMode:e,toggleColorMode:t}=Ro(),{t:n}=fe();return a.jsx(je,{"aria-label":n(e==="dark"?"common.lightMode":"common.darkMode"),tooltip:n(e==="dark"?"common.lightMode":"common.darkMode"),size:"sm",icon:e==="dark"?a.jsx(R$,{fontSize:19}):a.jsx(P$,{fontSize:18}),onClick:t,variant:"link"})};function eF(e){const{title:t,hotkey:n,description:r}=e;return a.jsxs(Ei,{sx:{gridTemplateColumns:"auto max-content",justifyContent:"space-between",alignItems:"center"},children:[a.jsxs(Ei,{children:[a.jsx(nt,{fontWeight:600,children:t}),r&&a.jsx(nt,{sx:{fontSize:"sm"},variant:"subtext",children:r})]}),a.jsx(ze,{sx:{fontSize:"sm",fontWeight:600,px:2,py:1},children:n})]})}function tF({children:e}){const{isOpen:t,onOpen:n,onClose:r}=Ws(),{t:o}=fe(),s=[{title:o("hotkeys.invoke.title"),desc:o("hotkeys.invoke.desc"),hotkey:"Ctrl+Enter"},{title:o("hotkeys.cancel.title"),desc:o("hotkeys.cancel.desc"),hotkey:"Shift+X"},{title:o("hotkeys.focusPrompt.title"),desc:o("hotkeys.focusPrompt.desc"),hotkey:"Alt+A"},{title:o("hotkeys.toggleOptions.title"),desc:o("hotkeys.toggleOptions.desc"),hotkey:"O"},{title:o("hotkeys.pinOptions.title"),desc:o("hotkeys.pinOptions.desc"),hotkey:"Shift+O"},{title:o("hotkeys.toggleGallery.title"),desc:o("hotkeys.toggleGallery.desc"),hotkey:"G"},{title:o("hotkeys.maximizeWorkSpace.title"),desc:o("hotkeys.maximizeWorkSpace.desc"),hotkey:"F"},{title:o("hotkeys.changeTabs.title"),desc:o("hotkeys.changeTabs.desc"),hotkey:"1-5"}],i=[{title:o("hotkeys.setPrompt.title"),desc:o("hotkeys.setPrompt.desc"),hotkey:"P"},{title:o("hotkeys.setSeed.title"),desc:o("hotkeys.setSeed.desc"),hotkey:"S"},{title:o("hotkeys.setParameters.title"),desc:o("hotkeys.setParameters.desc"),hotkey:"A"},{title:o("hotkeys.upscale.title"),desc:o("hotkeys.upscale.desc"),hotkey:"Shift+U"},{title:o("hotkeys.showInfo.title"),desc:o("hotkeys.showInfo.desc"),hotkey:"I"},{title:o("hotkeys.sendToImageToImage.title"),desc:o("hotkeys.sendToImageToImage.desc"),hotkey:"Shift+I"},{title:o("hotkeys.deleteImage.title"),desc:o("hotkeys.deleteImage.desc"),hotkey:"Del"},{title:o("hotkeys.closePanels.title"),desc:o("hotkeys.closePanels.desc"),hotkey:"Esc"}],u=[{title:o("hotkeys.previousImage.title"),desc:o("hotkeys.previousImage.desc"),hotkey:"Arrow Left"},{title:o("hotkeys.nextImage.title"),desc:o("hotkeys.nextImage.desc"),hotkey:"Arrow Right"},{title:o("hotkeys.toggleGalleryPin.title"),desc:o("hotkeys.toggleGalleryPin.desc"),hotkey:"Shift+G"},{title:o("hotkeys.increaseGalleryThumbSize.title"),desc:o("hotkeys.increaseGalleryThumbSize.desc"),hotkey:"Shift+Up"},{title:o("hotkeys.decreaseGalleryThumbSize.title"),desc:o("hotkeys.decreaseGalleryThumbSize.desc"),hotkey:"Shift+Down"}],d=[{title:o("hotkeys.selectBrush.title"),desc:o("hotkeys.selectBrush.desc"),hotkey:"B"},{title:o("hotkeys.selectEraser.title"),desc:o("hotkeys.selectEraser.desc"),hotkey:"E"},{title:o("hotkeys.decreaseBrushSize.title"),desc:o("hotkeys.decreaseBrushSize.desc"),hotkey:"["},{title:o("hotkeys.increaseBrushSize.title"),desc:o("hotkeys.increaseBrushSize.desc"),hotkey:"]"},{title:o("hotkeys.decreaseBrushOpacity.title"),desc:o("hotkeys.decreaseBrushOpacity.desc"),hotkey:"Shift + ["},{title:o("hotkeys.increaseBrushOpacity.title"),desc:o("hotkeys.increaseBrushOpacity.desc"),hotkey:"Shift + ]"},{title:o("hotkeys.moveTool.title"),desc:o("hotkeys.moveTool.desc"),hotkey:"V"},{title:o("hotkeys.fillBoundingBox.title"),desc:o("hotkeys.fillBoundingBox.desc"),hotkey:"Shift + F"},{title:o("hotkeys.eraseBoundingBox.title"),desc:o("hotkeys.eraseBoundingBox.desc"),hotkey:"Delete / Backspace"},{title:o("hotkeys.colorPicker.title"),desc:o("hotkeys.colorPicker.desc"),hotkey:"C"},{title:o("hotkeys.toggleSnap.title"),desc:o("hotkeys.toggleSnap.desc"),hotkey:"N"},{title:o("hotkeys.quickToggleMove.title"),desc:o("hotkeys.quickToggleMove.desc"),hotkey:"Hold Space"},{title:o("hotkeys.toggleLayer.title"),desc:o("hotkeys.toggleLayer.desc"),hotkey:"Q"},{title:o("hotkeys.clearMask.title"),desc:o("hotkeys.clearMask.desc"),hotkey:"Shift+C"},{title:o("hotkeys.hideMask.title"),desc:o("hotkeys.hideMask.desc"),hotkey:"H"},{title:o("hotkeys.showHideBoundingBox.title"),desc:o("hotkeys.showHideBoundingBox.desc"),hotkey:"Shift+H"},{title:o("hotkeys.mergeVisible.title"),desc:o("hotkeys.mergeVisible.desc"),hotkey:"Shift+M"},{title:o("hotkeys.saveToGallery.title"),desc:o("hotkeys.saveToGallery.desc"),hotkey:"Shift+S"},{title:o("hotkeys.copyToClipboard.title"),desc:o("hotkeys.copyToClipboard.desc"),hotkey:"Ctrl+C"},{title:o("hotkeys.downloadImage.title"),desc:o("hotkeys.downloadImage.desc"),hotkey:"Shift+D"},{title:o("hotkeys.undoStroke.title"),desc:o("hotkeys.undoStroke.desc"),hotkey:"Ctrl+Z"},{title:o("hotkeys.redoStroke.title"),desc:o("hotkeys.redoStroke.desc"),hotkey:"Ctrl+Shift+Z, Ctrl+Y"},{title:o("hotkeys.resetView.title"),desc:o("hotkeys.resetView.desc"),hotkey:"R"},{title:o("hotkeys.previousStagingImage.title"),desc:o("hotkeys.previousStagingImage.desc"),hotkey:"Arrow Left"},{title:o("hotkeys.nextStagingImage.title"),desc:o("hotkeys.nextStagingImage.desc"),hotkey:"Arrow Right"},{title:o("hotkeys.acceptStagingImage.title"),desc:o("hotkeys.acceptStagingImage.desc"),hotkey:"Enter"}],p=h=>a.jsx(F,{flexDir:"column",gap:4,children:h.map((g,v)=>a.jsxs(F,{flexDir:"column",px:2,gap:4,children:[a.jsx(eF,{title:g.title,description:g.desc,hotkey:g.hotkey}),v{const{data:t}=h8(),n=f.useRef(null),r=W_(n);return a.jsxs(F,{alignItems:"center",gap:3,ps:1,ref:n,children:[a.jsx(bu,{src:m8,alt:"invoke-ai-logo",sx:{w:"32px",h:"32px",minW:"32px",minH:"32px",userSelect:"none"}}),a.jsxs(F,{sx:{gap:3,alignItems:"center"},children:[a.jsxs(nt,{sx:{fontSize:"xl",userSelect:"none"},children:["invoke ",a.jsx("strong",{children:"ai"})]}),a.jsx(ws,{children:e&&r&&t&&a.jsx(io.div,{initial:{opacity:0},animate:{opacity:1,transition:{duration:.15}},exit:{opacity:0,transition:{delay:.8}},children:a.jsx(nt,{sx:{fontWeight:600,marginTop:1,color:"base.300",fontSize:14},variant:"subtext",children:t.version})},"statusText")})]})]})};function nF(e){return Ve({tag:"svg",attr:{viewBox:"0 0 512 512"},child:[{tag:"path",attr:{d:"M245.09 327.74v-37.32c57.07 0 84.51 13.47 108.58 38.68 5.4 5.65 15 1.32 14.29-6.43-5.45-61.45-34.14-117.09-122.87-117.09v-37.32a8.32 8.32 0 00-14.05-6L146.58 242a8.2 8.2 0 000 11.94L231 333.71a8.32 8.32 0 0014.09-5.97z"}},{tag:"path",attr:{fill:"none",strokeMiterlimit:"10",strokeWidth:"32",d:"M256 64C150 64 64 150 64 256s86 192 192 192 192-86 192-192S362 64 256 64z"}}]})(e)}function rF(e){return Ve({tag:"svg",attr:{viewBox:"0 0 512 512"},child:[{tag:"path",attr:{d:"M478.33 433.6l-90-218a22 22 0 00-40.67 0l-90 218a22 22 0 1040.67 16.79L316.66 406h102.67l18.33 44.39A22 22 0 00458 464a22 22 0 0020.32-30.4zM334.83 362L368 281.65 401.17 362zm-66.99-19.08a22 22 0 00-4.89-30.7c-.2-.15-15-11.13-36.49-34.73 39.65-53.68 62.11-114.75 71.27-143.49H330a22 22 0 000-44H214V70a22 22 0 00-44 0v20H54a22 22 0 000 44h197.25c-9.52 26.95-27.05 69.5-53.79 108.36-31.41-41.68-43.08-68.65-43.17-68.87a22 22 0 00-40.58 17c.58 1.38 14.55 34.23 52.86 83.93.92 1.19 1.83 2.35 2.74 3.51-39.24 44.35-77.74 71.86-93.85 80.74a22 22 0 1021.07 38.63c2.16-1.18 48.6-26.89 101.63-85.59 22.52 24.08 38 35.44 38.93 36.1a22 22 0 0030.75-4.9z"}}]})(e)}const oF={ar:vr.t("common.langArabic",{lng:"ar"}),nl:vr.t("common.langDutch",{lng:"nl"}),en:vr.t("common.langEnglish",{lng:"en"}),fr:vr.t("common.langFrench",{lng:"fr"}),de:vr.t("common.langGerman",{lng:"de"}),he:vr.t("common.langHebrew",{lng:"he"}),it:vr.t("common.langItalian",{lng:"it"}),ja:vr.t("common.langJapanese",{lng:"ja"}),ko:vr.t("common.langKorean",{lng:"ko"}),pl:vr.t("common.langPolish",{lng:"pl"}),pt_BR:vr.t("common.langBrPortuguese",{lng:"pt_BR"}),pt:vr.t("common.langPortuguese",{lng:"pt"}),ru:vr.t("common.langRussian",{lng:"ru"}),zh_CN:vr.t("common.langSimplifiedChinese",{lng:"zh_CN"}),es:vr.t("common.langSpanish",{lng:"es"}),uk:vr.t("common.langUkranian",{lng:"ua"})};function sF(){const{t:e}=fe(),t=te(),n=L(M4);return a.jsxs(Iu,{closeOnSelect:!1,children:[a.jsx(_n,{label:e("common.languagePickerLabel"),hasArrow:!0,children:a.jsx(Eu,{as:qa,icon:a.jsx(rF,{}),variant:"link","aria-label":e("common.languagePickerLabel"),fontSize:22,minWidth:8})}),a.jsx(tc,{children:a.jsx(Nv,{value:n,children:Cs(oF,(r,o)=>a.jsx(ru,{value:o,onClick:()=>t(g8(o)),children:r},o))})})]})}function aF(e){const t=f.createContext(null);return[({children:o,value:s})=>N.createElement(t.Provider,{value:s},o),()=>{const o=f.useContext(t);if(o===null)throw new Error(e);return o}]}function G_(e){return Array.isArray(e)?e:[e]}const iF=()=>{};function lF(e,t={active:!0}){return typeof e!="function"||!t.active?t.onKeyDown||iF:n=>{var r;n.key==="Escape"&&(e(n),(r=t.onTrigger)==null||r.call(t))}}function q_({data:e}){const t=[],n=[],r=e.reduce((o,s,i)=>(s.group?o[s.group]?o[s.group].push(i):o[s.group]=[i]:n.push(i),o),{});return Object.keys(r).forEach(o=>{t.push(...r[o].map(s=>e[s]))}),t.push(...n.map(o=>e[o])),t}function K_(e){return Array.isArray(e)||e===null?!1:typeof e=="object"?e.type!==N.Fragment:!1}function Y_(e){var t,n,r="";if(typeof e=="string"||typeof e=="number")r+=e;else if(typeof e=="object")if(Array.isArray(e))for(t=0;tr===t[o]).indexOf(!1)>=0)&&(n.current={v:e(),prevDeps:[...t]}),n.current.v}const dF=v8({key:"mantine",prepend:!0});function fF(){return _3()||dF}var pF=Object.defineProperty,iw=Object.getOwnPropertySymbols,hF=Object.prototype.hasOwnProperty,mF=Object.prototype.propertyIsEnumerable,lw=(e,t,n)=>t in e?pF(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,gF=(e,t)=>{for(var n in t||(t={}))hF.call(t,n)&&lw(e,n,t[n]);if(iw)for(var n of iw(t))mF.call(t,n)&&lw(e,n,t[n]);return e};const kg="ref";function vF(e){let t;if(e.length!==1)return{args:e,ref:t};const[n]=e;if(!(n instanceof Object))return{args:e,ref:t};if(!(kg in n))return{args:e,ref:t};t=n[kg];const r=gF({},n);return delete r[kg],{args:[r],ref:t}}const{cssFactory:yF}=(()=>{function e(n,r,o){const s=[],i=x8(n,s,o);return s.length<2?o:i+r(s)}function t(n){const{cache:r}=n,o=(...i)=>{const{ref:u,args:d}=vF(i),p=y8(d,r.registered);return b8(r,p,!1),`${r.key}-${p.name}${u===void 0?"":` ${u}`}`};return{css:o,cx:(...i)=>e(r.registered,o,Q_(i))}}return{cssFactory:t}})();function X_(){const e=fF();return uF(()=>yF({cache:e}),[e])}function bF({cx:e,classes:t,context:n,classNames:r,name:o,cache:s}){const i=n.reduce((u,d)=>(Object.keys(d.classNames).forEach(p=>{typeof u[p]!="string"?u[p]=`${d.classNames[p]}`:u[p]=`${u[p]} ${d.classNames[p]}`}),u),{});return Object.keys(t).reduce((u,d)=>(u[d]=e(t[d],i[d],r!=null&&r[d],Array.isArray(o)?o.filter(Boolean).map(p=>`${(s==null?void 0:s.key)||"mantine"}-${p}-${d}`).join(" "):o?`${(s==null?void 0:s.key)||"mantine"}-${o}-${d}`:null),u),{})}var xF=Object.defineProperty,cw=Object.getOwnPropertySymbols,wF=Object.prototype.hasOwnProperty,SF=Object.prototype.propertyIsEnumerable,uw=(e,t,n)=>t in e?xF(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,Pg=(e,t)=>{for(var n in t||(t={}))wF.call(t,n)&&uw(e,n,t[n]);if(cw)for(var n of cw(t))SF.call(t,n)&&uw(e,n,t[n]);return e};function E0(e,t){return t&&Object.keys(t).forEach(n=>{e[n]?e[n]=Pg(Pg({},e[n]),t[n]):e[n]=Pg({},t[n])}),e}function dw(e,t,n,r){const o=s=>typeof s=="function"?s(t,n||{},r):s||{};return Array.isArray(e)?e.map(s=>o(s.styles)).reduce((s,i)=>E0(s,i),{}):o(e)}function CF({ctx:e,theme:t,params:n,variant:r,size:o}){return e.reduce((s,i)=>(i.variants&&r in i.variants&&E0(s,i.variants[r](t,n,{variant:r,size:o})),i.sizes&&o in i.sizes&&E0(s,i.sizes[o](t,n,{variant:r,size:o})),s),{})}function Zr(e){const t=typeof e=="function"?e:()=>e;function n(r,o){const s=Ca(),i=VO(o==null?void 0:o.name),u=_3(),d={variant:o==null?void 0:o.variant,size:o==null?void 0:o.size},{css:p,cx:h}=X_(),g=t(s,r,d),v=dw(o==null?void 0:o.styles,s,r,d),b=dw(i,s,r,d),S=CF({ctx:i,theme:s,params:r,variant:o==null?void 0:o.variant,size:o==null?void 0:o.size}),w=Object.fromEntries(Object.keys(g).map(C=>{const _=h({[p(g[C])]:!(o!=null&&o.unstyled)},p(S[C]),p(b[C]),p(v[C]));return[C,_]}));return{classes:bF({cx:h,classes:w,context:i,classNames:o==null?void 0:o.classNames,name:o==null?void 0:o.name,cache:u}),cx:h,theme:s}}return n}function fw(e){return`___ref-${e||""}`}var _F=Object.defineProperty,kF=Object.defineProperties,PF=Object.getOwnPropertyDescriptors,pw=Object.getOwnPropertySymbols,jF=Object.prototype.hasOwnProperty,IF=Object.prototype.propertyIsEnumerable,hw=(e,t,n)=>t in e?_F(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,Ic=(e,t)=>{for(var n in t||(t={}))jF.call(t,n)&&hw(e,n,t[n]);if(pw)for(var n of pw(t))IF.call(t,n)&&hw(e,n,t[n]);return e},Ec=(e,t)=>kF(e,PF(t));const Oc={in:{opacity:1,transform:"scale(1)"},out:{opacity:0,transform:`scale(.9) translateY(${$e(10)})`},transitionProperty:"transform, opacity"},Yd={fade:{in:{opacity:1},out:{opacity:0},transitionProperty:"opacity"},scale:{in:{opacity:1,transform:"scale(1)"},out:{opacity:0,transform:"scale(0)"},common:{transformOrigin:"top"},transitionProperty:"transform, opacity"},"scale-y":{in:{opacity:1,transform:"scaleY(1)"},out:{opacity:0,transform:"scaleY(0)"},common:{transformOrigin:"top"},transitionProperty:"transform, opacity"},"scale-x":{in:{opacity:1,transform:"scaleX(1)"},out:{opacity:0,transform:"scaleX(0)"},common:{transformOrigin:"left"},transitionProperty:"transform, opacity"},"skew-up":{in:{opacity:1,transform:"translateY(0) skew(0deg, 0deg)"},out:{opacity:0,transform:`translateY(-${$e(20)}) skew(-10deg, -5deg)`},common:{transformOrigin:"top"},transitionProperty:"transform, opacity"},"skew-down":{in:{opacity:1,transform:"translateY(0) skew(0deg, 0deg)"},out:{opacity:0,transform:`translateY(${$e(20)}) skew(-10deg, -5deg)`},common:{transformOrigin:"bottom"},transitionProperty:"transform, opacity"},"rotate-left":{in:{opacity:1,transform:"translateY(0) rotate(0deg)"},out:{opacity:0,transform:`translateY(${$e(20)}) rotate(-5deg)`},common:{transformOrigin:"bottom"},transitionProperty:"transform, opacity"},"rotate-right":{in:{opacity:1,transform:"translateY(0) rotate(0deg)"},out:{opacity:0,transform:`translateY(${$e(20)}) rotate(5deg)`},common:{transformOrigin:"top"},transitionProperty:"transform, opacity"},"slide-down":{in:{opacity:1,transform:"translateY(0)"},out:{opacity:0,transform:"translateY(-100%)"},common:{transformOrigin:"top"},transitionProperty:"transform, opacity"},"slide-up":{in:{opacity:1,transform:"translateY(0)"},out:{opacity:0,transform:"translateY(100%)"},common:{transformOrigin:"bottom"},transitionProperty:"transform, opacity"},"slide-left":{in:{opacity:1,transform:"translateX(0)"},out:{opacity:0,transform:"translateX(100%)"},common:{transformOrigin:"left"},transitionProperty:"transform, opacity"},"slide-right":{in:{opacity:1,transform:"translateX(0)"},out:{opacity:0,transform:"translateX(-100%)"},common:{transformOrigin:"right"},transitionProperty:"transform, opacity"},pop:Ec(Ic({},Oc),{common:{transformOrigin:"center center"}}),"pop-bottom-left":Ec(Ic({},Oc),{common:{transformOrigin:"bottom left"}}),"pop-bottom-right":Ec(Ic({},Oc),{common:{transformOrigin:"bottom right"}}),"pop-top-left":Ec(Ic({},Oc),{common:{transformOrigin:"top left"}}),"pop-top-right":Ec(Ic({},Oc),{common:{transformOrigin:"top right"}})},mw=["mousedown","touchstart"];function EF(e,t,n){const r=f.useRef();return f.useEffect(()=>{const o=s=>{const{target:i}=s??{};if(Array.isArray(n)){const u=(i==null?void 0:i.hasAttribute("data-ignore-outside-clicks"))||!document.body.contains(i)&&i.tagName!=="HTML";n.every(p=>!!p&&!s.composedPath().includes(p))&&!u&&e()}else r.current&&!r.current.contains(i)&&e()};return(t||mw).forEach(s=>document.addEventListener(s,o)),()=>{(t||mw).forEach(s=>document.removeEventListener(s,o))}},[r,e,n]),r}function OF(e,t){try{return e.addEventListener("change",t),()=>e.removeEventListener("change",t)}catch{return e.addListener(t),()=>e.removeListener(t)}}function MF(e,t){return typeof t=="boolean"?t:typeof window<"u"&&"matchMedia"in window?window.matchMedia(e).matches:!1}function RF(e,t,{getInitialValueInEffect:n}={getInitialValueInEffect:!0}){const[r,o]=f.useState(n?t:MF(e,t)),s=f.useRef();return f.useEffect(()=>{if("matchMedia"in window)return s.current=window.matchMedia(e),o(s.current.matches),OF(s.current,i=>o(i.matches))},[e]),r}const J_=typeof document<"u"?f.useLayoutEffect:f.useEffect;function hs(e,t){const n=f.useRef(!1);f.useEffect(()=>()=>{n.current=!1},[]),f.useEffect(()=>{if(n.current)return e();n.current=!0},t)}function DF({opened:e,shouldReturnFocus:t=!0}){const n=f.useRef(),r=()=>{var o;n.current&&"focus"in n.current&&typeof n.current.focus=="function"&&((o=n.current)==null||o.focus({preventScroll:!0}))};return hs(()=>{let o=-1;const s=i=>{i.key==="Tab"&&window.clearTimeout(o)};return document.addEventListener("keydown",s),e?n.current=document.activeElement:t&&(o=window.setTimeout(r,10)),()=>{window.clearTimeout(o),document.removeEventListener("keydown",s)}},[e,t]),r}const TF=/input|select|textarea|button|object/,Z_="a, input, select, textarea, button, object, [tabindex]";function AF(e){return e.style.display==="none"}function NF(e){if(e.getAttribute("aria-hidden")||e.getAttribute("hidden")||e.getAttribute("type")==="hidden")return!1;let n=e;for(;n&&!(n===document.body||n.nodeType===11);){if(AF(n))return!1;n=n.parentNode}return!0}function ek(e){let t=e.getAttribute("tabindex");return t===null&&(t=void 0),parseInt(t,10)}function O0(e){const t=e.nodeName.toLowerCase(),n=!Number.isNaN(ek(e));return(TF.test(t)&&!e.disabled||e instanceof HTMLAnchorElement&&e.href||n)&&NF(e)}function tk(e){const t=ek(e);return(Number.isNaN(t)||t>=0)&&O0(e)}function $F(e){return Array.from(e.querySelectorAll(Z_)).filter(tk)}function zF(e,t){const n=$F(e);if(!n.length){t.preventDefault();return}const r=n[t.shiftKey?0:n.length-1],o=e.getRootNode();if(!(r===o.activeElement||e===o.activeElement))return;t.preventDefault();const i=n[t.shiftKey?n.length-1:0];i&&i.focus()}function S1(){return`mantine-${Math.random().toString(36).slice(2,11)}`}function LF(e,t="body > :not(script)"){const n=S1(),r=Array.from(document.querySelectorAll(t)).map(o=>{var s;if((s=o==null?void 0:o.shadowRoot)!=null&&s.contains(e)||o.contains(e))return;const i=o.getAttribute("aria-hidden"),u=o.getAttribute("data-hidden"),d=o.getAttribute("data-focus-id");return o.setAttribute("data-focus-id",n),i===null||i==="false"?o.setAttribute("aria-hidden","true"):!u&&!d&&o.setAttribute("data-hidden",i),{node:o,ariaHidden:u||null}});return()=>{r.forEach(o=>{!o||n!==o.node.getAttribute("data-focus-id")||(o.ariaHidden===null?o.node.removeAttribute("aria-hidden"):o.node.setAttribute("aria-hidden",o.ariaHidden),o.node.removeAttribute("data-focus-id"),o.node.removeAttribute("data-hidden"))})}}function BF(e=!0){const t=f.useRef(),n=f.useRef(null),r=s=>{let i=s.querySelector("[data-autofocus]");if(!i){const u=Array.from(s.querySelectorAll(Z_));i=u.find(tk)||u.find(O0)||null,!i&&O0(s)&&(i=s)}i&&i.focus({preventScroll:!0})},o=f.useCallback(s=>{if(e){if(s===null){n.current&&(n.current(),n.current=null);return}n.current=LF(s),t.current!==s&&(s?(setTimeout(()=>{s.getRootNode()&&r(s)}),t.current=s):t.current=null)}},[e]);return f.useEffect(()=>{if(!e)return;t.current&&setTimeout(()=>r(t.current));const s=i=>{i.key==="Tab"&&t.current&&zF(t.current,i)};return document.addEventListener("keydown",s),()=>{document.removeEventListener("keydown",s),n.current&&n.current()}},[e]),o}const FF=N["useId".toString()]||(()=>{});function HF(){const e=FF();return e?`mantine-${e.replace(/:/g,"")}`:""}function C1(e){const t=HF(),[n,r]=f.useState(t);return J_(()=>{r(S1())},[]),typeof e=="string"?e:typeof window>"u"?t:n}function gw(e,t,n){f.useEffect(()=>(window.addEventListener(e,t,n),()=>window.removeEventListener(e,t,n)),[e,t])}function nk(e,t){typeof e=="function"?e(t):typeof e=="object"&&e!==null&&"current"in e&&(e.current=t)}function WF(...e){return t=>{e.forEach(n=>nk(n,t))}}function zu(...e){return f.useCallback(WF(...e),e)}function uu({value:e,defaultValue:t,finalValue:n,onChange:r=()=>{}}){const[o,s]=f.useState(t!==void 0?t:n),i=u=>{s(u),r==null||r(u)};return e!==void 0?[e,r,!0]:[o,i,!1]}function rk(e,t){return RF("(prefers-reduced-motion: reduce)",e,t)}const VF=e=>e<.5?2*e*e:-1+(4-2*e)*e,UF=({axis:e,target:t,parent:n,alignment:r,offset:o,isList:s})=>{if(!t||!n&&typeof document>"u")return 0;const i=!!n,d=(n||document.body).getBoundingClientRect(),p=t.getBoundingClientRect(),h=g=>p[g]-d[g];if(e==="y"){const g=h("top");if(g===0)return 0;if(r==="start"){const b=g-o;return b<=p.height*(s?0:1)||!s?b:0}const v=i?d.height:window.innerHeight;if(r==="end"){const b=g+o-v+p.height;return b>=-p.height*(s?0:1)||!s?b:0}return r==="center"?g-v/2+p.height/2:0}if(e==="x"){const g=h("left");if(g===0)return 0;if(r==="start"){const b=g-o;return b<=p.width||!s?b:0}const v=i?d.width:window.innerWidth;if(r==="end"){const b=g+o-v+p.width;return b>=-p.width||!s?b:0}return r==="center"?g-v/2+p.width/2:0}return 0},GF=({axis:e,parent:t})=>{if(!t&&typeof document>"u")return 0;const n=e==="y"?"scrollTop":"scrollLeft";if(t)return t[n];const{body:r,documentElement:o}=document;return r[n]+o[n]},qF=({axis:e,parent:t,distance:n})=>{if(!t&&typeof document>"u")return;const r=e==="y"?"scrollTop":"scrollLeft";if(t)t[r]=n;else{const{body:o,documentElement:s}=document;o[r]=n,s[r]=n}};function ok({duration:e=1250,axis:t="y",onScrollFinish:n,easing:r=VF,offset:o=0,cancelable:s=!0,isList:i=!1}={}){const u=f.useRef(0),d=f.useRef(0),p=f.useRef(!1),h=f.useRef(null),g=f.useRef(null),v=rk(),b=()=>{u.current&&cancelAnimationFrame(u.current)},S=f.useCallback(({alignment:C="start"}={})=>{var _;p.current=!1,u.current&&b();const k=(_=GF({parent:h.current,axis:t}))!=null?_:0,j=UF({parent:h.current,target:g.current,axis:t,alignment:C,offset:o,isList:i})-(h.current?0:k);function E(){d.current===0&&(d.current=performance.now());const O=performance.now()-d.current,M=v||e===0?1:O/e,T=k+j*r(M);qF({parent:h.current,axis:t,distance:T}),!p.current&&M<1?u.current=requestAnimationFrame(E):(typeof n=="function"&&n(),d.current=0,u.current=0,b())}E()},[t,e,r,i,o,n,v]),w=()=>{s&&(p.current=!0)};return gw("wheel",w,{passive:!0}),gw("touchmove",w,{passive:!0}),f.useEffect(()=>b,[]),{scrollableRef:h,targetRef:g,scrollIntoView:S,cancel:b}}var vw=Object.getOwnPropertySymbols,KF=Object.prototype.hasOwnProperty,YF=Object.prototype.propertyIsEnumerable,QF=(e,t)=>{var n={};for(var r in e)KF.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(e!=null&&vw)for(var r of vw(e))t.indexOf(r)<0&&YF.call(e,r)&&(n[r]=e[r]);return n};function _h(e){const t=e,{m:n,mx:r,my:o,mt:s,mb:i,ml:u,mr:d,p,px:h,py:g,pt:v,pb:b,pl:S,pr:w,bg:C,c:_,opacity:k,ff:j,fz:E,fw:I,lts:O,ta:M,lh:T,fs:A,tt:z,td:$,w:ee,miw:B,maw:H,h:G,mih:K,mah:R,bgsz:U,bgp:V,bgr:J,bga:ie,pos:xe,top:he,left:ae,bottom:Z,right:W,inset:re,display:pe}=t,ne=QF(t,["m","mx","my","mt","mb","ml","mr","p","px","py","pt","pb","pl","pr","bg","c","opacity","ff","fz","fw","lts","ta","lh","fs","tt","td","w","miw","maw","h","mih","mah","bgsz","bgp","bgr","bga","pos","top","left","bottom","right","inset","display"]);return{systemStyles:UO({m:n,mx:r,my:o,mt:s,mb:i,ml:u,mr:d,p,px:h,py:g,pt:v,pb:b,pl:S,pr:w,bg:C,c:_,opacity:k,ff:j,fz:E,fw:I,lts:O,ta:M,lh:T,fs:A,tt:z,td:$,w:ee,miw:B,maw:H,h:G,mih:K,mah:R,bgsz:U,bgp:V,bgr:J,bga:ie,pos:xe,top:he,left:ae,bottom:Z,right:W,inset:re,display:pe}),rest:ne}}function XF(e,t){const n=Object.keys(e).filter(r=>r!=="base").sort((r,o)=>kx(At({size:r,sizes:t.breakpoints}))-kx(At({size:o,sizes:t.breakpoints})));return"base"in e?["base",...n]:n}function JF({value:e,theme:t,getValue:n,property:r}){if(e==null)return;if(typeof e=="object")return XF(e,t).reduce((i,u)=>{if(u==="base"&&e.base!==void 0){const p=n(e.base,t);return Array.isArray(r)?(r.forEach(h=>{i[h]=p}),i):(i[r]=p,i)}const d=n(e[u],t);return Array.isArray(r)?(i[t.fn.largerThan(u)]={},r.forEach(p=>{i[t.fn.largerThan(u)][p]=d}),i):(i[t.fn.largerThan(u)]={[r]:d},i)},{});const o=n(e,t);return Array.isArray(r)?r.reduce((s,i)=>(s[i]=o,s),{}):{[r]:o}}function ZF(e,t){return e==="dimmed"?t.colorScheme==="dark"?t.colors.dark[2]:t.colors.gray[6]:t.fn.variant({variant:"filled",color:e,primaryFallback:!1}).background}function eH(e){return $e(e)}function tH(e){return e}function nH(e,t){return At({size:e,sizes:t.fontSizes})}const rH=["-xs","-sm","-md","-lg","-xl"];function oH(e,t){return rH.includes(e)?`calc(${At({size:e.replace("-",""),sizes:t.spacing})} * -1)`:At({size:e,sizes:t.spacing})}const sH={identity:tH,color:ZF,size:eH,fontSize:nH,spacing:oH},aH={m:{type:"spacing",property:"margin"},mt:{type:"spacing",property:"marginTop"},mb:{type:"spacing",property:"marginBottom"},ml:{type:"spacing",property:"marginLeft"},mr:{type:"spacing",property:"marginRight"},mx:{type:"spacing",property:["marginRight","marginLeft"]},my:{type:"spacing",property:["marginTop","marginBottom"]},p:{type:"spacing",property:"padding"},pt:{type:"spacing",property:"paddingTop"},pb:{type:"spacing",property:"paddingBottom"},pl:{type:"spacing",property:"paddingLeft"},pr:{type:"spacing",property:"paddingRight"},px:{type:"spacing",property:["paddingRight","paddingLeft"]},py:{type:"spacing",property:["paddingTop","paddingBottom"]},bg:{type:"color",property:"background"},c:{type:"color",property:"color"},opacity:{type:"identity",property:"opacity"},ff:{type:"identity",property:"fontFamily"},fz:{type:"fontSize",property:"fontSize"},fw:{type:"identity",property:"fontWeight"},lts:{type:"size",property:"letterSpacing"},ta:{type:"identity",property:"textAlign"},lh:{type:"identity",property:"lineHeight"},fs:{type:"identity",property:"fontStyle"},tt:{type:"identity",property:"textTransform"},td:{type:"identity",property:"textDecoration"},w:{type:"spacing",property:"width"},miw:{type:"spacing",property:"minWidth"},maw:{type:"spacing",property:"maxWidth"},h:{type:"spacing",property:"height"},mih:{type:"spacing",property:"minHeight"},mah:{type:"spacing",property:"maxHeight"},bgsz:{type:"size",property:"backgroundSize"},bgp:{type:"identity",property:"backgroundPosition"},bgr:{type:"identity",property:"backgroundRepeat"},bga:{type:"identity",property:"backgroundAttachment"},pos:{type:"identity",property:"position"},top:{type:"identity",property:"top"},left:{type:"size",property:"left"},bottom:{type:"size",property:"bottom"},right:{type:"size",property:"right"},inset:{type:"size",property:"inset"},display:{type:"identity",property:"display"}};var iH=Object.defineProperty,yw=Object.getOwnPropertySymbols,lH=Object.prototype.hasOwnProperty,cH=Object.prototype.propertyIsEnumerable,bw=(e,t,n)=>t in e?iH(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,xw=(e,t)=>{for(var n in t||(t={}))lH.call(t,n)&&bw(e,n,t[n]);if(yw)for(var n of yw(t))cH.call(t,n)&&bw(e,n,t[n]);return e};function ww(e,t,n=aH){return Object.keys(n).reduce((o,s)=>(s in e&&e[s]!==void 0&&o.push(JF({value:e[s],getValue:sH[n[s].type],property:n[s].property,theme:t})),o),[]).reduce((o,s)=>(Object.keys(s).forEach(i=>{typeof s[i]=="object"&&s[i]!==null&&i in o?o[i]=xw(xw({},o[i]),s[i]):o[i]=s[i]}),o),{})}function Sw(e,t){return typeof e=="function"?e(t):e}function uH(e,t,n){const r=Ca(),{css:o,cx:s}=X_();return Array.isArray(e)?s(n,o(ww(t,r)),e.map(i=>o(Sw(i,r)))):s(n,o(Sw(e,r)),o(ww(t,r)))}var dH=Object.defineProperty,ep=Object.getOwnPropertySymbols,sk=Object.prototype.hasOwnProperty,ak=Object.prototype.propertyIsEnumerable,Cw=(e,t,n)=>t in e?dH(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,fH=(e,t)=>{for(var n in t||(t={}))sk.call(t,n)&&Cw(e,n,t[n]);if(ep)for(var n of ep(t))ak.call(t,n)&&Cw(e,n,t[n]);return e},pH=(e,t)=>{var n={};for(var r in e)sk.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(e!=null&&ep)for(var r of ep(e))t.indexOf(r)<0&&ak.call(e,r)&&(n[r]=e[r]);return n};const ik=f.forwardRef((e,t)=>{var n=e,{className:r,component:o,style:s,sx:i}=n,u=pH(n,["className","component","style","sx"]);const{systemStyles:d,rest:p}=_h(u),h=o||"div";return N.createElement(h,fH({ref:t,className:uH(i,d,r),style:s},p))});ik.displayName="@mantine/core/Box";const bo=ik;var hH=Object.defineProperty,mH=Object.defineProperties,gH=Object.getOwnPropertyDescriptors,_w=Object.getOwnPropertySymbols,vH=Object.prototype.hasOwnProperty,yH=Object.prototype.propertyIsEnumerable,kw=(e,t,n)=>t in e?hH(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,Pw=(e,t)=>{for(var n in t||(t={}))vH.call(t,n)&&kw(e,n,t[n]);if(_w)for(var n of _w(t))yH.call(t,n)&&kw(e,n,t[n]);return e},bH=(e,t)=>mH(e,gH(t)),xH=Zr(e=>({root:bH(Pw(Pw({},e.fn.focusStyles()),e.fn.fontStyles()),{cursor:"pointer",border:0,padding:0,appearance:"none",fontSize:e.fontSizes.md,backgroundColor:"transparent",textAlign:"left",color:e.colorScheme==="dark"?e.colors.dark[0]:e.black,textDecoration:"none",boxSizing:"border-box"})}));const wH=xH;var SH=Object.defineProperty,tp=Object.getOwnPropertySymbols,lk=Object.prototype.hasOwnProperty,ck=Object.prototype.propertyIsEnumerable,jw=(e,t,n)=>t in e?SH(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,CH=(e,t)=>{for(var n in t||(t={}))lk.call(t,n)&&jw(e,n,t[n]);if(tp)for(var n of tp(t))ck.call(t,n)&&jw(e,n,t[n]);return e},_H=(e,t)=>{var n={};for(var r in e)lk.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(e!=null&&tp)for(var r of tp(e))t.indexOf(r)<0&&ck.call(e,r)&&(n[r]=e[r]);return n};const uk=f.forwardRef((e,t)=>{const n=mr("UnstyledButton",{},e),{className:r,component:o="button",unstyled:s,variant:i}=n,u=_H(n,["className","component","unstyled","variant"]),{classes:d,cx:p}=wH(null,{name:"UnstyledButton",unstyled:s,variant:i});return N.createElement(bo,CH({component:o,ref:t,className:p(d.root,r),type:o==="button"?"button":void 0},u))});uk.displayName="@mantine/core/UnstyledButton";const kH=uk;var PH=Object.defineProperty,jH=Object.defineProperties,IH=Object.getOwnPropertyDescriptors,Iw=Object.getOwnPropertySymbols,EH=Object.prototype.hasOwnProperty,OH=Object.prototype.propertyIsEnumerable,Ew=(e,t,n)=>t in e?PH(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,M0=(e,t)=>{for(var n in t||(t={}))EH.call(t,n)&&Ew(e,n,t[n]);if(Iw)for(var n of Iw(t))OH.call(t,n)&&Ew(e,n,t[n]);return e},Ow=(e,t)=>jH(e,IH(t));const MH=["subtle","filled","outline","light","default","transparent","gradient"],Qd={xs:$e(18),sm:$e(22),md:$e(28),lg:$e(34),xl:$e(44)};function RH({variant:e,theme:t,color:n,gradient:r}){const o=t.fn.variant({color:n,variant:e,gradient:r});return e==="gradient"?{border:0,backgroundImage:o.background,color:o.color,"&:hover":t.fn.hover({backgroundSize:"200%"})}:MH.includes(e)?M0({border:`${$e(1)} solid ${o.border}`,backgroundColor:o.background,color:o.color},t.fn.hover({backgroundColor:o.hover})):null}var DH=Zr((e,{radius:t,color:n,gradient:r},{variant:o,size:s})=>({root:Ow(M0({position:"relative",borderRadius:e.fn.radius(t),padding:0,lineHeight:1,display:"flex",alignItems:"center",justifyContent:"center",height:At({size:s,sizes:Qd}),minHeight:At({size:s,sizes:Qd}),width:At({size:s,sizes:Qd}),minWidth:At({size:s,sizes:Qd})},RH({variant:o,theme:e,color:n,gradient:r})),{"&:active":e.activeStyles,"& [data-action-icon-loader]":{maxWidth:"70%"},"&:disabled, &[data-disabled]":{color:e.colors.gray[e.colorScheme==="dark"?6:4],cursor:"not-allowed",backgroundColor:o==="transparent"?void 0:e.fn.themeColor("gray",e.colorScheme==="dark"?8:1),borderColor:o==="transparent"?void 0:e.fn.themeColor("gray",e.colorScheme==="dark"?8:1),backgroundImage:"none",pointerEvents:"none","&:active":{transform:"none"}},"&[data-loading]":{pointerEvents:"none","&::before":Ow(M0({content:'""'},e.fn.cover($e(-1))),{backgroundColor:e.colorScheme==="dark"?e.fn.rgba(e.colors.dark[7],.5):"rgba(255, 255, 255, .5)",borderRadius:e.fn.radius(t),cursor:"not-allowed"})}})}));const TH=DH;var AH=Object.defineProperty,np=Object.getOwnPropertySymbols,dk=Object.prototype.hasOwnProperty,fk=Object.prototype.propertyIsEnumerable,Mw=(e,t,n)=>t in e?AH(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,Rw=(e,t)=>{for(var n in t||(t={}))dk.call(t,n)&&Mw(e,n,t[n]);if(np)for(var n of np(t))fk.call(t,n)&&Mw(e,n,t[n]);return e},Dw=(e,t)=>{var n={};for(var r in e)dk.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(e!=null&&np)for(var r of np(e))t.indexOf(r)<0&&fk.call(e,r)&&(n[r]=e[r]);return n};function NH(e){var t=e,{size:n,color:r}=t,o=Dw(t,["size","color"]);const s=o,{style:i}=s,u=Dw(s,["style"]);return N.createElement("svg",Rw({viewBox:"0 0 135 140",xmlns:"http://www.w3.org/2000/svg",fill:r,style:Rw({width:n},i)},u),N.createElement("rect",{y:"10",width:"15",height:"120",rx:"6"},N.createElement("animate",{attributeName:"height",begin:"0.5s",dur:"1s",values:"120;110;100;90;80;70;60;50;40;140;120",calcMode:"linear",repeatCount:"indefinite"}),N.createElement("animate",{attributeName:"y",begin:"0.5s",dur:"1s",values:"10;15;20;25;30;35;40;45;50;0;10",calcMode:"linear",repeatCount:"indefinite"})),N.createElement("rect",{x:"30",y:"10",width:"15",height:"120",rx:"6"},N.createElement("animate",{attributeName:"height",begin:"0.25s",dur:"1s",values:"120;110;100;90;80;70;60;50;40;140;120",calcMode:"linear",repeatCount:"indefinite"}),N.createElement("animate",{attributeName:"y",begin:"0.25s",dur:"1s",values:"10;15;20;25;30;35;40;45;50;0;10",calcMode:"linear",repeatCount:"indefinite"})),N.createElement("rect",{x:"60",width:"15",height:"140",rx:"6"},N.createElement("animate",{attributeName:"height",begin:"0s",dur:"1s",values:"120;110;100;90;80;70;60;50;40;140;120",calcMode:"linear",repeatCount:"indefinite"}),N.createElement("animate",{attributeName:"y",begin:"0s",dur:"1s",values:"10;15;20;25;30;35;40;45;50;0;10",calcMode:"linear",repeatCount:"indefinite"})),N.createElement("rect",{x:"90",y:"10",width:"15",height:"120",rx:"6"},N.createElement("animate",{attributeName:"height",begin:"0.25s",dur:"1s",values:"120;110;100;90;80;70;60;50;40;140;120",calcMode:"linear",repeatCount:"indefinite"}),N.createElement("animate",{attributeName:"y",begin:"0.25s",dur:"1s",values:"10;15;20;25;30;35;40;45;50;0;10",calcMode:"linear",repeatCount:"indefinite"})),N.createElement("rect",{x:"120",y:"10",width:"15",height:"120",rx:"6"},N.createElement("animate",{attributeName:"height",begin:"0.5s",dur:"1s",values:"120;110;100;90;80;70;60;50;40;140;120",calcMode:"linear",repeatCount:"indefinite"}),N.createElement("animate",{attributeName:"y",begin:"0.5s",dur:"1s",values:"10;15;20;25;30;35;40;45;50;0;10",calcMode:"linear",repeatCount:"indefinite"})))}var $H=Object.defineProperty,rp=Object.getOwnPropertySymbols,pk=Object.prototype.hasOwnProperty,hk=Object.prototype.propertyIsEnumerable,Tw=(e,t,n)=>t in e?$H(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,Aw=(e,t)=>{for(var n in t||(t={}))pk.call(t,n)&&Tw(e,n,t[n]);if(rp)for(var n of rp(t))hk.call(t,n)&&Tw(e,n,t[n]);return e},Nw=(e,t)=>{var n={};for(var r in e)pk.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(e!=null&&rp)for(var r of rp(e))t.indexOf(r)<0&&hk.call(e,r)&&(n[r]=e[r]);return n};function zH(e){var t=e,{size:n,color:r}=t,o=Nw(t,["size","color"]);const s=o,{style:i}=s,u=Nw(s,["style"]);return N.createElement("svg",Aw({viewBox:"0 0 38 38",xmlns:"http://www.w3.org/2000/svg",stroke:r,style:Aw({width:n,height:n},i)},u),N.createElement("g",{fill:"none",fillRule:"evenodd"},N.createElement("g",{transform:"translate(2.5 2.5)",strokeWidth:"5"},N.createElement("circle",{strokeOpacity:".5",cx:"16",cy:"16",r:"16"}),N.createElement("path",{d:"M32 16c0-9.94-8.06-16-16-16"},N.createElement("animateTransform",{attributeName:"transform",type:"rotate",from:"0 16 16",to:"360 16 16",dur:"1s",repeatCount:"indefinite"})))))}var LH=Object.defineProperty,op=Object.getOwnPropertySymbols,mk=Object.prototype.hasOwnProperty,gk=Object.prototype.propertyIsEnumerable,$w=(e,t,n)=>t in e?LH(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,zw=(e,t)=>{for(var n in t||(t={}))mk.call(t,n)&&$w(e,n,t[n]);if(op)for(var n of op(t))gk.call(t,n)&&$w(e,n,t[n]);return e},Lw=(e,t)=>{var n={};for(var r in e)mk.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(e!=null&&op)for(var r of op(e))t.indexOf(r)<0&&gk.call(e,r)&&(n[r]=e[r]);return n};function BH(e){var t=e,{size:n,color:r}=t,o=Lw(t,["size","color"]);const s=o,{style:i}=s,u=Lw(s,["style"]);return N.createElement("svg",zw({viewBox:"0 0 120 30",xmlns:"http://www.w3.org/2000/svg",fill:r,style:zw({width:n},i)},u),N.createElement("circle",{cx:"15",cy:"15",r:"15"},N.createElement("animate",{attributeName:"r",from:"15",to:"15",begin:"0s",dur:"0.8s",values:"15;9;15",calcMode:"linear",repeatCount:"indefinite"}),N.createElement("animate",{attributeName:"fill-opacity",from:"1",to:"1",begin:"0s",dur:"0.8s",values:"1;.5;1",calcMode:"linear",repeatCount:"indefinite"})),N.createElement("circle",{cx:"60",cy:"15",r:"9",fillOpacity:"0.3"},N.createElement("animate",{attributeName:"r",from:"9",to:"9",begin:"0s",dur:"0.8s",values:"9;15;9",calcMode:"linear",repeatCount:"indefinite"}),N.createElement("animate",{attributeName:"fill-opacity",from:"0.5",to:"0.5",begin:"0s",dur:"0.8s",values:".5;1;.5",calcMode:"linear",repeatCount:"indefinite"})),N.createElement("circle",{cx:"105",cy:"15",r:"15"},N.createElement("animate",{attributeName:"r",from:"15",to:"15",begin:"0s",dur:"0.8s",values:"15;9;15",calcMode:"linear",repeatCount:"indefinite"}),N.createElement("animate",{attributeName:"fill-opacity",from:"1",to:"1",begin:"0s",dur:"0.8s",values:"1;.5;1",calcMode:"linear",repeatCount:"indefinite"})))}var FH=Object.defineProperty,sp=Object.getOwnPropertySymbols,vk=Object.prototype.hasOwnProperty,yk=Object.prototype.propertyIsEnumerable,Bw=(e,t,n)=>t in e?FH(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,HH=(e,t)=>{for(var n in t||(t={}))vk.call(t,n)&&Bw(e,n,t[n]);if(sp)for(var n of sp(t))yk.call(t,n)&&Bw(e,n,t[n]);return e},WH=(e,t)=>{var n={};for(var r in e)vk.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(e!=null&&sp)for(var r of sp(e))t.indexOf(r)<0&&yk.call(e,r)&&(n[r]=e[r]);return n};const jg={bars:NH,oval:zH,dots:BH},VH={xs:$e(18),sm:$e(22),md:$e(36),lg:$e(44),xl:$e(58)},UH={size:"md"};function bk(e){const t=mr("Loader",UH,e),{size:n,color:r,variant:o}=t,s=WH(t,["size","color","variant"]),i=Ca(),u=o in jg?o:i.loader;return N.createElement(bo,HH({role:"presentation",component:jg[u]||jg.bars,size:At({size:n,sizes:VH}),color:i.fn.variant({variant:"filled",primaryFallback:!1,color:r||i.primaryColor}).background},s))}bk.displayName="@mantine/core/Loader";var GH=Object.defineProperty,ap=Object.getOwnPropertySymbols,xk=Object.prototype.hasOwnProperty,wk=Object.prototype.propertyIsEnumerable,Fw=(e,t,n)=>t in e?GH(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,Hw=(e,t)=>{for(var n in t||(t={}))xk.call(t,n)&&Fw(e,n,t[n]);if(ap)for(var n of ap(t))wk.call(t,n)&&Fw(e,n,t[n]);return e},qH=(e,t)=>{var n={};for(var r in e)xk.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(e!=null&&ap)for(var r of ap(e))t.indexOf(r)<0&&wk.call(e,r)&&(n[r]=e[r]);return n};const KH={color:"gray",size:"md",variant:"subtle"},Sk=f.forwardRef((e,t)=>{const n=mr("ActionIcon",KH,e),{className:r,color:o,children:s,radius:i,size:u,variant:d,gradient:p,disabled:h,loaderProps:g,loading:v,unstyled:b,__staticSelector:S}=n,w=qH(n,["className","color","children","radius","size","variant","gradient","disabled","loaderProps","loading","unstyled","__staticSelector"]),{classes:C,cx:_,theme:k}=TH({radius:i,color:o,gradient:p},{name:["ActionIcon",S],unstyled:b,size:u,variant:d}),j=N.createElement(bk,Hw({color:k.fn.variant({color:o,variant:d}).color,size:"100%","data-action-icon-loader":!0},g));return N.createElement(kH,Hw({className:_(C.root,r),ref:t,disabled:h,"data-disabled":h||void 0,"data-loading":v||void 0,unstyled:b},w),v?j:s)});Sk.displayName="@mantine/core/ActionIcon";const YH=Sk;var QH=Object.defineProperty,XH=Object.defineProperties,JH=Object.getOwnPropertyDescriptors,ip=Object.getOwnPropertySymbols,Ck=Object.prototype.hasOwnProperty,_k=Object.prototype.propertyIsEnumerable,Ww=(e,t,n)=>t in e?QH(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,ZH=(e,t)=>{for(var n in t||(t={}))Ck.call(t,n)&&Ww(e,n,t[n]);if(ip)for(var n of ip(t))_k.call(t,n)&&Ww(e,n,t[n]);return e},eW=(e,t)=>XH(e,JH(t)),tW=(e,t)=>{var n={};for(var r in e)Ck.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(e!=null&&ip)for(var r of ip(e))t.indexOf(r)<0&&_k.call(e,r)&&(n[r]=e[r]);return n};function kk(e){const t=mr("Portal",{},e),{children:n,target:r,className:o,innerRef:s}=t,i=tW(t,["children","target","className","innerRef"]),u=Ca(),[d,p]=f.useState(!1),h=f.useRef();return J_(()=>(p(!0),h.current=r?typeof r=="string"?document.querySelector(r):r:document.createElement("div"),r||document.body.appendChild(h.current),()=>{!r&&document.body.removeChild(h.current)}),[r]),d?Xl.createPortal(N.createElement("div",eW(ZH({className:o,dir:u.dir},i),{ref:s}),n),h.current):null}kk.displayName="@mantine/core/Portal";var nW=Object.defineProperty,lp=Object.getOwnPropertySymbols,Pk=Object.prototype.hasOwnProperty,jk=Object.prototype.propertyIsEnumerable,Vw=(e,t,n)=>t in e?nW(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,rW=(e,t)=>{for(var n in t||(t={}))Pk.call(t,n)&&Vw(e,n,t[n]);if(lp)for(var n of lp(t))jk.call(t,n)&&Vw(e,n,t[n]);return e},oW=(e,t)=>{var n={};for(var r in e)Pk.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(e!=null&&lp)for(var r of lp(e))t.indexOf(r)<0&&jk.call(e,r)&&(n[r]=e[r]);return n};function Ik(e){var t=e,{withinPortal:n=!0,children:r}=t,o=oW(t,["withinPortal","children"]);return n?N.createElement(kk,rW({},o),r):N.createElement(N.Fragment,null,r)}Ik.displayName="@mantine/core/OptionalPortal";var sW=Object.defineProperty,cp=Object.getOwnPropertySymbols,Ek=Object.prototype.hasOwnProperty,Ok=Object.prototype.propertyIsEnumerable,Uw=(e,t,n)=>t in e?sW(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,Gw=(e,t)=>{for(var n in t||(t={}))Ek.call(t,n)&&Uw(e,n,t[n]);if(cp)for(var n of cp(t))Ok.call(t,n)&&Uw(e,n,t[n]);return e},aW=(e,t)=>{var n={};for(var r in e)Ek.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(e!=null&&cp)for(var r of cp(e))t.indexOf(r)<0&&Ok.call(e,r)&&(n[r]=e[r]);return n};function Mk(e){const t=e,{width:n,height:r,style:o}=t,s=aW(t,["width","height","style"]);return N.createElement("svg",Gw({viewBox:"0 0 15 15",fill:"none",xmlns:"http://www.w3.org/2000/svg",style:Gw({width:n,height:r},o)},s),N.createElement("path",{d:"M11.7816 4.03157C12.0062 3.80702 12.0062 3.44295 11.7816 3.2184C11.5571 2.99385 11.193 2.99385 10.9685 3.2184L7.50005 6.68682L4.03164 3.2184C3.80708 2.99385 3.44301 2.99385 3.21846 3.2184C2.99391 3.44295 2.99391 3.80702 3.21846 4.03157L6.68688 7.49999L3.21846 10.9684C2.99391 11.193 2.99391 11.557 3.21846 11.7816C3.44301 12.0061 3.80708 12.0061 4.03164 11.7816L7.50005 8.31316L10.9685 11.7816C11.193 12.0061 11.5571 12.0061 11.7816 11.7816C12.0062 11.557 12.0062 11.193 11.7816 10.9684L8.31322 7.49999L11.7816 4.03157Z",fill:"currentColor",fillRule:"evenodd",clipRule:"evenodd"}))}Mk.displayName="@mantine/core/CloseIcon";var iW=Object.defineProperty,up=Object.getOwnPropertySymbols,Rk=Object.prototype.hasOwnProperty,Dk=Object.prototype.propertyIsEnumerable,qw=(e,t,n)=>t in e?iW(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,lW=(e,t)=>{for(var n in t||(t={}))Rk.call(t,n)&&qw(e,n,t[n]);if(up)for(var n of up(t))Dk.call(t,n)&&qw(e,n,t[n]);return e},cW=(e,t)=>{var n={};for(var r in e)Rk.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(e!=null&&up)for(var r of up(e))t.indexOf(r)<0&&Dk.call(e,r)&&(n[r]=e[r]);return n};const uW={xs:$e(12),sm:$e(16),md:$e(20),lg:$e(28),xl:$e(34)},dW={size:"sm"},Tk=f.forwardRef((e,t)=>{const n=mr("CloseButton",dW,e),{iconSize:r,size:o,children:s}=n,i=cW(n,["iconSize","size","children"]),u=$e(r||uW[o]);return N.createElement(YH,lW({ref:t,__staticSelector:"CloseButton",size:o},i),s||N.createElement(Mk,{width:u,height:u}))});Tk.displayName="@mantine/core/CloseButton";const Ak=Tk;var fW=Object.defineProperty,pW=Object.defineProperties,hW=Object.getOwnPropertyDescriptors,Kw=Object.getOwnPropertySymbols,mW=Object.prototype.hasOwnProperty,gW=Object.prototype.propertyIsEnumerable,Yw=(e,t,n)=>t in e?fW(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,Xd=(e,t)=>{for(var n in t||(t={}))mW.call(t,n)&&Yw(e,n,t[n]);if(Kw)for(var n of Kw(t))gW.call(t,n)&&Yw(e,n,t[n]);return e},vW=(e,t)=>pW(e,hW(t));function yW({underline:e,strikethrough:t}){const n=[];return e&&n.push("underline"),t&&n.push("line-through"),n.length>0?n.join(" "):"none"}function bW({theme:e,color:t}){return t==="dimmed"?e.fn.dimmed():typeof t=="string"&&(t in e.colors||t.split(".")[0]in e.colors)?e.fn.variant({variant:"filled",color:t}).background:t||"inherit"}function xW(e){return typeof e=="number"?{overflow:"hidden",textOverflow:"ellipsis",display:"-webkit-box",WebkitLineClamp:e,WebkitBoxOrient:"vertical"}:null}function wW({theme:e,truncate:t}){return t==="start"?{overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap",direction:e.dir==="ltr"?"rtl":"ltr",textAlign:e.dir==="ltr"?"right":"left"}:t?{overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"}:null}var SW=Zr((e,{color:t,lineClamp:n,truncate:r,inline:o,inherit:s,underline:i,gradient:u,weight:d,transform:p,align:h,strikethrough:g,italic:v},{size:b})=>{const S=e.fn.variant({variant:"gradient",gradient:u});return{root:vW(Xd(Xd(Xd(Xd({},e.fn.fontStyles()),e.fn.focusStyles()),xW(n)),wW({theme:e,truncate:r})),{color:bW({color:t,theme:e}),fontFamily:s?"inherit":e.fontFamily,fontSize:s||b===void 0?"inherit":At({size:b,sizes:e.fontSizes}),lineHeight:s?"inherit":o?1:e.lineHeight,textDecoration:yW({underline:i,strikethrough:g}),WebkitTapHighlightColor:"transparent",fontWeight:s?"inherit":d,textTransform:p,textAlign:h,fontStyle:v?"italic":void 0}),gradient:{backgroundImage:S.background,WebkitBackgroundClip:"text",WebkitTextFillColor:"transparent"}}});const CW=SW;var _W=Object.defineProperty,dp=Object.getOwnPropertySymbols,Nk=Object.prototype.hasOwnProperty,$k=Object.prototype.propertyIsEnumerable,Qw=(e,t,n)=>t in e?_W(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,kW=(e,t)=>{for(var n in t||(t={}))Nk.call(t,n)&&Qw(e,n,t[n]);if(dp)for(var n of dp(t))$k.call(t,n)&&Qw(e,n,t[n]);return e},PW=(e,t)=>{var n={};for(var r in e)Nk.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(e!=null&&dp)for(var r of dp(e))t.indexOf(r)<0&&$k.call(e,r)&&(n[r]=e[r]);return n};const jW={variant:"text"},zk=f.forwardRef((e,t)=>{const n=mr("Text",jW,e),{className:r,size:o,weight:s,transform:i,color:u,align:d,variant:p,lineClamp:h,truncate:g,gradient:v,inline:b,inherit:S,underline:w,strikethrough:C,italic:_,classNames:k,styles:j,unstyled:E,span:I,__staticSelector:O}=n,M=PW(n,["className","size","weight","transform","color","align","variant","lineClamp","truncate","gradient","inline","inherit","underline","strikethrough","italic","classNames","styles","unstyled","span","__staticSelector"]),{classes:T,cx:A}=CW({color:u,lineClamp:h,truncate:g,inline:b,inherit:S,underline:w,strikethrough:C,italic:_,weight:s,transform:i,align:d,gradient:v},{unstyled:E,name:O||"Text",variant:p,size:o});return N.createElement(bo,kW({ref:t,className:A(T.root,{[T.gradient]:p==="gradient"},r),component:I?"span":"div"},M))});zk.displayName="@mantine/core/Text";const Nl=zk,Jd={xs:$e(1),sm:$e(2),md:$e(3),lg:$e(4),xl:$e(5)};function Zd(e,t){const n=e.fn.variant({variant:"outline",color:t}).border;return typeof t=="string"&&(t in e.colors||t.split(".")[0]in e.colors)?n:t===void 0?e.colorScheme==="dark"?e.colors.dark[4]:e.colors.gray[4]:t}var IW=Zr((e,{color:t},{size:n,variant:r})=>({root:{},withLabel:{borderTop:"0 !important"},left:{"&::before":{display:"none"}},right:{"&::after":{display:"none"}},label:{display:"flex",alignItems:"center","&::before":{content:'""',flex:1,height:$e(1),borderTop:`${At({size:n,sizes:Jd})} ${r} ${Zd(e,t)}`,marginRight:e.spacing.xs},"&::after":{content:'""',flex:1,borderTop:`${At({size:n,sizes:Jd})} ${r} ${Zd(e,t)}`,marginLeft:e.spacing.xs}},labelDefaultStyles:{color:t==="dark"?e.colors.dark[1]:e.fn.themeColor(t,e.colorScheme==="dark"?5:e.fn.primaryShade(),!1)},horizontal:{border:0,borderTopWidth:$e(At({size:n,sizes:Jd})),borderTopColor:Zd(e,t),borderTopStyle:r,margin:0},vertical:{border:0,alignSelf:"stretch",height:"auto",borderLeftWidth:$e(At({size:n,sizes:Jd})),borderLeftColor:Zd(e,t),borderLeftStyle:r}}));const EW=IW;var OW=Object.defineProperty,MW=Object.defineProperties,RW=Object.getOwnPropertyDescriptors,fp=Object.getOwnPropertySymbols,Lk=Object.prototype.hasOwnProperty,Bk=Object.prototype.propertyIsEnumerable,Xw=(e,t,n)=>t in e?OW(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,Jw=(e,t)=>{for(var n in t||(t={}))Lk.call(t,n)&&Xw(e,n,t[n]);if(fp)for(var n of fp(t))Bk.call(t,n)&&Xw(e,n,t[n]);return e},DW=(e,t)=>MW(e,RW(t)),TW=(e,t)=>{var n={};for(var r in e)Lk.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(e!=null&&fp)for(var r of fp(e))t.indexOf(r)<0&&Bk.call(e,r)&&(n[r]=e[r]);return n};const AW={orientation:"horizontal",size:"xs",labelPosition:"left",variant:"solid"},R0=f.forwardRef((e,t)=>{const n=mr("Divider",AW,e),{className:r,color:o,orientation:s,size:i,label:u,labelPosition:d,labelProps:p,variant:h,styles:g,classNames:v,unstyled:b}=n,S=TW(n,["className","color","orientation","size","label","labelPosition","labelProps","variant","styles","classNames","unstyled"]),{classes:w,cx:C}=EW({color:o},{classNames:v,styles:g,unstyled:b,name:"Divider",variant:h,size:i}),_=s==="vertical",k=s==="horizontal",j=!!u&&k,E=!(p!=null&&p.color);return N.createElement(bo,Jw({ref:t,className:C(w.root,{[w.vertical]:_,[w.horizontal]:k,[w.withLabel]:j},r),role:"separator"},S),j&&N.createElement(Nl,DW(Jw({},p),{size:(p==null?void 0:p.size)||"xs",mt:$e(2),className:C(w.label,w[d],{[w.labelDefaultStyles]:E})}),u))});R0.displayName="@mantine/core/Divider";var NW=Object.defineProperty,$W=Object.defineProperties,zW=Object.getOwnPropertyDescriptors,Zw=Object.getOwnPropertySymbols,LW=Object.prototype.hasOwnProperty,BW=Object.prototype.propertyIsEnumerable,eS=(e,t,n)=>t in e?NW(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,tS=(e,t)=>{for(var n in t||(t={}))LW.call(t,n)&&eS(e,n,t[n]);if(Zw)for(var n of Zw(t))BW.call(t,n)&&eS(e,n,t[n]);return e},FW=(e,t)=>$W(e,zW(t)),HW=Zr((e,t,{size:n})=>({item:FW(tS({},e.fn.fontStyles()),{boxSizing:"border-box",wordBreak:"break-all",textAlign:"left",width:"100%",padding:`calc(${At({size:n,sizes:e.spacing})} / 1.5) ${At({size:n,sizes:e.spacing})}`,cursor:"pointer",fontSize:At({size:n,sizes:e.fontSizes}),color:e.colorScheme==="dark"?e.colors.dark[0]:e.black,borderRadius:e.fn.radius(),"&[data-hovered]":{backgroundColor:e.colorScheme==="dark"?e.colors.dark[4]:e.colors.gray[1]},"&[data-selected]":tS({backgroundColor:e.fn.variant({variant:"filled"}).background,color:e.fn.variant({variant:"filled"}).color},e.fn.hover({backgroundColor:e.fn.variant({variant:"filled"}).hover})),"&[data-disabled]":{cursor:"default",color:e.colors.dark[2]}}),nothingFound:{boxSizing:"border-box",color:e.colors.gray[6],paddingTop:`calc(${At({size:n,sizes:e.spacing})} / 2)`,paddingBottom:`calc(${At({size:n,sizes:e.spacing})} / 2)`,textAlign:"center"},separator:{boxSizing:"border-box",textAlign:"left",width:"100%",padding:`calc(${At({size:n,sizes:e.spacing})} / 1.5) ${At({size:n,sizes:e.spacing})}`},separatorLabel:{color:e.colorScheme==="dark"?e.colors.dark[3]:e.colors.gray[5]}}));const WW=HW;var VW=Object.defineProperty,nS=Object.getOwnPropertySymbols,UW=Object.prototype.hasOwnProperty,GW=Object.prototype.propertyIsEnumerable,rS=(e,t,n)=>t in e?VW(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,qW=(e,t)=>{for(var n in t||(t={}))UW.call(t,n)&&rS(e,n,t[n]);if(nS)for(var n of nS(t))GW.call(t,n)&&rS(e,n,t[n]);return e};function _1({data:e,hovered:t,classNames:n,styles:r,isItemSelected:o,uuid:s,__staticSelector:i,onItemHover:u,onItemSelect:d,itemsRefs:p,itemComponent:h,size:g,nothingFound:v,creatable:b,createLabel:S,unstyled:w,variant:C}){const{classes:_}=WW(null,{classNames:n,styles:r,unstyled:w,name:i,variant:C,size:g}),k=[],j=[];let E=null;const I=(M,T)=>{const A=typeof o=="function"?o(M.value):!1;return N.createElement(h,qW({key:M.value,className:_.item,"data-disabled":M.disabled||void 0,"data-hovered":!M.disabled&&t===T||void 0,"data-selected":!M.disabled&&A||void 0,selected:A,onMouseEnter:()=>u(T),id:`${s}-${T}`,role:"option",tabIndex:-1,"aria-selected":t===T,ref:z=>{p&&p.current&&(p.current[M.value]=z)},onMouseDown:M.disabled?null:z=>{z.preventDefault(),d(M)},disabled:M.disabled,variant:C},M))};let O=null;if(e.forEach((M,T)=>{M.creatable?E=T:M.group?(O!==M.group&&(O=M.group,j.push(N.createElement("div",{className:_.separator,key:`__mantine-divider-${T}`},N.createElement(R0,{classNames:{label:_.separatorLabel},label:M.group})))),j.push(I(M,T))):k.push(I(M,T))}),b){const M=e[E];k.push(N.createElement("div",{key:S1(),className:_.item,"data-hovered":t===E||void 0,onMouseEnter:()=>u(E),onMouseDown:T=>{T.preventDefault(),d(M)},tabIndex:-1,ref:T=>{p&&p.current&&(p.current[M.value]=T)}},S))}return j.length>0&&k.length>0&&k.unshift(N.createElement("div",{className:_.separator,key:"empty-group-separator"},N.createElement(R0,null))),j.length>0||k.length>0?N.createElement(N.Fragment,null,j,k):N.createElement(Nl,{size:g,unstyled:w,className:_.nothingFound},v)}_1.displayName="@mantine/core/SelectItems";var KW=Object.defineProperty,pp=Object.getOwnPropertySymbols,Fk=Object.prototype.hasOwnProperty,Hk=Object.prototype.propertyIsEnumerable,oS=(e,t,n)=>t in e?KW(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,YW=(e,t)=>{for(var n in t||(t={}))Fk.call(t,n)&&oS(e,n,t[n]);if(pp)for(var n of pp(t))Hk.call(t,n)&&oS(e,n,t[n]);return e},QW=(e,t)=>{var n={};for(var r in e)Fk.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(e!=null&&pp)for(var r of pp(e))t.indexOf(r)<0&&Hk.call(e,r)&&(n[r]=e[r]);return n};const k1=f.forwardRef((e,t)=>{var n=e,{label:r,value:o}=n,s=QW(n,["label","value"]);return N.createElement("div",YW({ref:t},s),r||o)});k1.displayName="@mantine/core/DefaultItem";function XW(e,t){typeof e=="function"?e(t):e!=null&&(e.current=t)}function Wk(...e){return t=>e.forEach(n=>XW(n,t))}function Fi(...e){return f.useCallback(Wk(...e),e)}const Vk=f.forwardRef((e,t)=>{const{children:n,...r}=e,o=f.Children.toArray(n),s=o.find(ZW);if(s){const i=s.props.children,u=o.map(d=>d===s?f.Children.count(i)>1?f.Children.only(null):f.isValidElement(i)?i.props.children:null:d);return f.createElement(D0,Qn({},r,{ref:t}),f.isValidElement(i)?f.cloneElement(i,void 0,u):null)}return f.createElement(D0,Qn({},r,{ref:t}),n)});Vk.displayName="Slot";const D0=f.forwardRef((e,t)=>{const{children:n,...r}=e;return f.isValidElement(n)?f.cloneElement(n,{...eV(r,n.props),ref:Wk(t,n.ref)}):f.Children.count(n)>1?f.Children.only(null):null});D0.displayName="SlotClone";const JW=({children:e})=>f.createElement(f.Fragment,null,e);function ZW(e){return f.isValidElement(e)&&e.type===JW}function eV(e,t){const n={...t};for(const r in t){const o=e[r],s=t[r];/^on[A-Z]/.test(r)?o&&s?n[r]=(...u)=>{s(...u),o(...u)}:o&&(n[r]=o):r==="style"?n[r]={...o,...s}:r==="className"&&(n[r]=[o,s].filter(Boolean).join(" "))}return{...e,...n}}const tV=["a","button","div","h2","h3","img","label","li","nav","ol","p","span","svg","ul"],Lu=tV.reduce((e,t)=>{const n=f.forwardRef((r,o)=>{const{asChild:s,...i}=r,u=s?Vk:t;return f.useEffect(()=>{window[Symbol.for("radix-ui")]=!0},[]),f.createElement(u,Qn({},i,{ref:o}))});return n.displayName=`Primitive.${t}`,{...e,[t]:n}},{}),T0=globalThis!=null&&globalThis.document?f.useLayoutEffect:()=>{};function nV(e,t){return f.useReducer((n,r)=>{const o=t[n][r];return o??n},e)}const Bu=e=>{const{present:t,children:n}=e,r=rV(t),o=typeof n=="function"?n({present:r.isPresent}):f.Children.only(n),s=Fi(r.ref,o.ref);return typeof n=="function"||r.isPresent?f.cloneElement(o,{ref:s}):null};Bu.displayName="Presence";function rV(e){const[t,n]=f.useState(),r=f.useRef({}),o=f.useRef(e),s=f.useRef("none"),i=e?"mounted":"unmounted",[u,d]=nV(i,{mounted:{UNMOUNT:"unmounted",ANIMATION_OUT:"unmountSuspended"},unmountSuspended:{MOUNT:"mounted",ANIMATION_END:"unmounted"},unmounted:{MOUNT:"mounted"}});return f.useEffect(()=>{const p=ef(r.current);s.current=u==="mounted"?p:"none"},[u]),T0(()=>{const p=r.current,h=o.current;if(h!==e){const v=s.current,b=ef(p);e?d("MOUNT"):b==="none"||(p==null?void 0:p.display)==="none"?d("UNMOUNT"):d(h&&v!==b?"ANIMATION_OUT":"UNMOUNT"),o.current=e}},[e,d]),T0(()=>{if(t){const p=g=>{const b=ef(r.current).includes(g.animationName);g.target===t&&b&&Xl.flushSync(()=>d("ANIMATION_END"))},h=g=>{g.target===t&&(s.current=ef(r.current))};return t.addEventListener("animationstart",h),t.addEventListener("animationcancel",p),t.addEventListener("animationend",p),()=>{t.removeEventListener("animationstart",h),t.removeEventListener("animationcancel",p),t.removeEventListener("animationend",p)}}else d("ANIMATION_END")},[t,d]),{isPresent:["mounted","unmountSuspended"].includes(u),ref:f.useCallback(p=>{p&&(r.current=getComputedStyle(p)),n(p)},[])}}function ef(e){return(e==null?void 0:e.animationName)||"none"}function oV(e,t=[]){let n=[];function r(s,i){const u=f.createContext(i),d=n.length;n=[...n,i];function p(g){const{scope:v,children:b,...S}=g,w=(v==null?void 0:v[e][d])||u,C=f.useMemo(()=>S,Object.values(S));return f.createElement(w.Provider,{value:C},b)}function h(g,v){const b=(v==null?void 0:v[e][d])||u,S=f.useContext(b);if(S)return S;if(i!==void 0)return i;throw new Error(`\`${g}\` must be used within \`${s}\``)}return p.displayName=s+"Provider",[p,h]}const o=()=>{const s=n.map(i=>f.createContext(i));return function(u){const d=(u==null?void 0:u[e])||s;return f.useMemo(()=>({[`__scope${e}`]:{...u,[e]:d}}),[u,d])}};return o.scopeName=e,[r,sV(o,...t)]}function sV(...e){const t=e[0];if(e.length===1)return t;const n=()=>{const r=e.map(o=>({useScope:o(),scopeName:o.scopeName}));return function(s){const i=r.reduce((u,{useScope:d,scopeName:p})=>{const g=d(s)[`__scope${p}`];return{...u,...g}},{});return f.useMemo(()=>({[`__scope${t.scopeName}`]:i}),[i])}};return n.scopeName=t.scopeName,n}function yi(e){const t=f.useRef(e);return f.useEffect(()=>{t.current=e}),f.useMemo(()=>(...n)=>{var r;return(r=t.current)===null||r===void 0?void 0:r.call(t,...n)},[])}const aV=f.createContext(void 0);function iV(e){const t=f.useContext(aV);return e||t||"ltr"}function lV(e,[t,n]){return Math.min(n,Math.max(t,e))}function ki(e,t,{checkForDefaultPrevented:n=!0}={}){return function(o){if(e==null||e(o),n===!1||!o.defaultPrevented)return t==null?void 0:t(o)}}function cV(e,t){return f.useReducer((n,r)=>{const o=t[n][r];return o??n},e)}const Uk="ScrollArea",[Gk,Voe]=oV(Uk),[uV,Zo]=Gk(Uk),dV=f.forwardRef((e,t)=>{const{__scopeScrollArea:n,type:r="hover",dir:o,scrollHideDelay:s=600,...i}=e,[u,d]=f.useState(null),[p,h]=f.useState(null),[g,v]=f.useState(null),[b,S]=f.useState(null),[w,C]=f.useState(null),[_,k]=f.useState(0),[j,E]=f.useState(0),[I,O]=f.useState(!1),[M,T]=f.useState(!1),A=Fi(t,$=>d($)),z=iV(o);return f.createElement(uV,{scope:n,type:r,dir:z,scrollHideDelay:s,scrollArea:u,viewport:p,onViewportChange:h,content:g,onContentChange:v,scrollbarX:b,onScrollbarXChange:S,scrollbarXEnabled:I,onScrollbarXEnabledChange:O,scrollbarY:w,onScrollbarYChange:C,scrollbarYEnabled:M,onScrollbarYEnabledChange:T,onCornerWidthChange:k,onCornerHeightChange:E},f.createElement(Lu.div,Qn({dir:z},i,{ref:A,style:{position:"relative","--radix-scroll-area-corner-width":_+"px","--radix-scroll-area-corner-height":j+"px",...e.style}})))}),fV="ScrollAreaViewport",pV=f.forwardRef((e,t)=>{const{__scopeScrollArea:n,children:r,...o}=e,s=Zo(fV,n),i=f.useRef(null),u=Fi(t,i,s.onViewportChange);return f.createElement(f.Fragment,null,f.createElement("style",{dangerouslySetInnerHTML:{__html:"[data-radix-scroll-area-viewport]{scrollbar-width:none;-ms-overflow-style:none;-webkit-overflow-scrolling:touch;}[data-radix-scroll-area-viewport]::-webkit-scrollbar{display:none}"}}),f.createElement(Lu.div,Qn({"data-radix-scroll-area-viewport":""},o,{ref:u,style:{overflowX:s.scrollbarXEnabled?"scroll":"hidden",overflowY:s.scrollbarYEnabled?"scroll":"hidden",...e.style}}),f.createElement("div",{ref:s.onContentChange,style:{minWidth:"100%",display:"table"}},r)))}),ka="ScrollAreaScrollbar",hV=f.forwardRef((e,t)=>{const{forceMount:n,...r}=e,o=Zo(ka,e.__scopeScrollArea),{onScrollbarXEnabledChange:s,onScrollbarYEnabledChange:i}=o,u=e.orientation==="horizontal";return f.useEffect(()=>(u?s(!0):i(!0),()=>{u?s(!1):i(!1)}),[u,s,i]),o.type==="hover"?f.createElement(mV,Qn({},r,{ref:t,forceMount:n})):o.type==="scroll"?f.createElement(gV,Qn({},r,{ref:t,forceMount:n})):o.type==="auto"?f.createElement(qk,Qn({},r,{ref:t,forceMount:n})):o.type==="always"?f.createElement(P1,Qn({},r,{ref:t})):null}),mV=f.forwardRef((e,t)=>{const{forceMount:n,...r}=e,o=Zo(ka,e.__scopeScrollArea),[s,i]=f.useState(!1);return f.useEffect(()=>{const u=o.scrollArea;let d=0;if(u){const p=()=>{window.clearTimeout(d),i(!0)},h=()=>{d=window.setTimeout(()=>i(!1),o.scrollHideDelay)};return u.addEventListener("pointerenter",p),u.addEventListener("pointerleave",h),()=>{window.clearTimeout(d),u.removeEventListener("pointerenter",p),u.removeEventListener("pointerleave",h)}}},[o.scrollArea,o.scrollHideDelay]),f.createElement(Bu,{present:n||s},f.createElement(qk,Qn({"data-state":s?"visible":"hidden"},r,{ref:t})))}),gV=f.forwardRef((e,t)=>{const{forceMount:n,...r}=e,o=Zo(ka,e.__scopeScrollArea),s=e.orientation==="horizontal",i=Ph(()=>d("SCROLL_END"),100),[u,d]=cV("hidden",{hidden:{SCROLL:"scrolling"},scrolling:{SCROLL_END:"idle",POINTER_ENTER:"interacting"},interacting:{SCROLL:"interacting",POINTER_LEAVE:"idle"},idle:{HIDE:"hidden",SCROLL:"scrolling",POINTER_ENTER:"interacting"}});return f.useEffect(()=>{if(u==="idle"){const p=window.setTimeout(()=>d("HIDE"),o.scrollHideDelay);return()=>window.clearTimeout(p)}},[u,o.scrollHideDelay,d]),f.useEffect(()=>{const p=o.viewport,h=s?"scrollLeft":"scrollTop";if(p){let g=p[h];const v=()=>{const b=p[h];g!==b&&(d("SCROLL"),i()),g=b};return p.addEventListener("scroll",v),()=>p.removeEventListener("scroll",v)}},[o.viewport,s,d,i]),f.createElement(Bu,{present:n||u!=="hidden"},f.createElement(P1,Qn({"data-state":u==="hidden"?"hidden":"visible"},r,{ref:t,onPointerEnter:ki(e.onPointerEnter,()=>d("POINTER_ENTER")),onPointerLeave:ki(e.onPointerLeave,()=>d("POINTER_LEAVE"))})))}),qk=f.forwardRef((e,t)=>{const n=Zo(ka,e.__scopeScrollArea),{forceMount:r,...o}=e,[s,i]=f.useState(!1),u=e.orientation==="horizontal",d=Ph(()=>{if(n.viewport){const p=n.viewport.offsetWidth{const{orientation:n="vertical",...r}=e,o=Zo(ka,e.__scopeScrollArea),s=f.useRef(null),i=f.useRef(0),[u,d]=f.useState({content:0,viewport:0,scrollbar:{size:0,paddingStart:0,paddingEnd:0}}),p=Xk(u.viewport,u.content),h={...r,sizes:u,onSizesChange:d,hasThumb:p>0&&p<1,onThumbChange:v=>s.current=v,onThumbPointerUp:()=>i.current=0,onThumbPointerDown:v=>i.current=v};function g(v,b){return _V(v,i.current,u,b)}return n==="horizontal"?f.createElement(vV,Qn({},h,{ref:t,onThumbPositionChange:()=>{if(o.viewport&&s.current){const v=o.viewport.scrollLeft,b=sS(v,u,o.dir);s.current.style.transform=`translate3d(${b}px, 0, 0)`}},onWheelScroll:v=>{o.viewport&&(o.viewport.scrollLeft=v)},onDragScroll:v=>{o.viewport&&(o.viewport.scrollLeft=g(v,o.dir))}})):n==="vertical"?f.createElement(yV,Qn({},h,{ref:t,onThumbPositionChange:()=>{if(o.viewport&&s.current){const v=o.viewport.scrollTop,b=sS(v,u);s.current.style.transform=`translate3d(0, ${b}px, 0)`}},onWheelScroll:v=>{o.viewport&&(o.viewport.scrollTop=v)},onDragScroll:v=>{o.viewport&&(o.viewport.scrollTop=g(v))}})):null}),vV=f.forwardRef((e,t)=>{const{sizes:n,onSizesChange:r,...o}=e,s=Zo(ka,e.__scopeScrollArea),[i,u]=f.useState(),d=f.useRef(null),p=Fi(t,d,s.onScrollbarXChange);return f.useEffect(()=>{d.current&&u(getComputedStyle(d.current))},[d]),f.createElement(Yk,Qn({"data-orientation":"horizontal"},o,{ref:p,sizes:n,style:{bottom:0,left:s.dir==="rtl"?"var(--radix-scroll-area-corner-width)":0,right:s.dir==="ltr"?"var(--radix-scroll-area-corner-width)":0,"--radix-scroll-area-thumb-width":kh(n)+"px",...e.style},onThumbPointerDown:h=>e.onThumbPointerDown(h.x),onDragScroll:h=>e.onDragScroll(h.x),onWheelScroll:(h,g)=>{if(s.viewport){const v=s.viewport.scrollLeft+h.deltaX;e.onWheelScroll(v),Zk(v,g)&&h.preventDefault()}},onResize:()=>{d.current&&s.viewport&&i&&r({content:s.viewport.scrollWidth,viewport:s.viewport.offsetWidth,scrollbar:{size:d.current.clientWidth,paddingStart:hp(i.paddingLeft),paddingEnd:hp(i.paddingRight)}})}}))}),yV=f.forwardRef((e,t)=>{const{sizes:n,onSizesChange:r,...o}=e,s=Zo(ka,e.__scopeScrollArea),[i,u]=f.useState(),d=f.useRef(null),p=Fi(t,d,s.onScrollbarYChange);return f.useEffect(()=>{d.current&&u(getComputedStyle(d.current))},[d]),f.createElement(Yk,Qn({"data-orientation":"vertical"},o,{ref:p,sizes:n,style:{top:0,right:s.dir==="ltr"?0:void 0,left:s.dir==="rtl"?0:void 0,bottom:"var(--radix-scroll-area-corner-height)","--radix-scroll-area-thumb-height":kh(n)+"px",...e.style},onThumbPointerDown:h=>e.onThumbPointerDown(h.y),onDragScroll:h=>e.onDragScroll(h.y),onWheelScroll:(h,g)=>{if(s.viewport){const v=s.viewport.scrollTop+h.deltaY;e.onWheelScroll(v),Zk(v,g)&&h.preventDefault()}},onResize:()=>{d.current&&s.viewport&&i&&r({content:s.viewport.scrollHeight,viewport:s.viewport.offsetHeight,scrollbar:{size:d.current.clientHeight,paddingStart:hp(i.paddingTop),paddingEnd:hp(i.paddingBottom)}})}}))}),[bV,Kk]=Gk(ka),Yk=f.forwardRef((e,t)=>{const{__scopeScrollArea:n,sizes:r,hasThumb:o,onThumbChange:s,onThumbPointerUp:i,onThumbPointerDown:u,onThumbPositionChange:d,onDragScroll:p,onWheelScroll:h,onResize:g,...v}=e,b=Zo(ka,n),[S,w]=f.useState(null),C=Fi(t,A=>w(A)),_=f.useRef(null),k=f.useRef(""),j=b.viewport,E=r.content-r.viewport,I=yi(h),O=yi(d),M=Ph(g,10);function T(A){if(_.current){const z=A.clientX-_.current.left,$=A.clientY-_.current.top;p({x:z,y:$})}}return f.useEffect(()=>{const A=z=>{const $=z.target;(S==null?void 0:S.contains($))&&I(z,E)};return document.addEventListener("wheel",A,{passive:!1}),()=>document.removeEventListener("wheel",A,{passive:!1})},[j,S,E,I]),f.useEffect(O,[r,O]),$l(S,M),$l(b.content,M),f.createElement(bV,{scope:n,scrollbar:S,hasThumb:o,onThumbChange:yi(s),onThumbPointerUp:yi(i),onThumbPositionChange:O,onThumbPointerDown:yi(u)},f.createElement(Lu.div,Qn({},v,{ref:C,style:{position:"absolute",...v.style},onPointerDown:ki(e.onPointerDown,A=>{A.button===0&&(A.target.setPointerCapture(A.pointerId),_.current=S.getBoundingClientRect(),k.current=document.body.style.webkitUserSelect,document.body.style.webkitUserSelect="none",T(A))}),onPointerMove:ki(e.onPointerMove,T),onPointerUp:ki(e.onPointerUp,A=>{const z=A.target;z.hasPointerCapture(A.pointerId)&&z.releasePointerCapture(A.pointerId),document.body.style.webkitUserSelect=k.current,_.current=null})})))}),A0="ScrollAreaThumb",xV=f.forwardRef((e,t)=>{const{forceMount:n,...r}=e,o=Kk(A0,e.__scopeScrollArea);return f.createElement(Bu,{present:n||o.hasThumb},f.createElement(wV,Qn({ref:t},r)))}),wV=f.forwardRef((e,t)=>{const{__scopeScrollArea:n,style:r,...o}=e,s=Zo(A0,n),i=Kk(A0,n),{onThumbPositionChange:u}=i,d=Fi(t,g=>i.onThumbChange(g)),p=f.useRef(),h=Ph(()=>{p.current&&(p.current(),p.current=void 0)},100);return f.useEffect(()=>{const g=s.viewport;if(g){const v=()=>{if(h(),!p.current){const b=kV(g,u);p.current=b,u()}};return u(),g.addEventListener("scroll",v),()=>g.removeEventListener("scroll",v)}},[s.viewport,h,u]),f.createElement(Lu.div,Qn({"data-state":i.hasThumb?"visible":"hidden"},o,{ref:d,style:{width:"var(--radix-scroll-area-thumb-width)",height:"var(--radix-scroll-area-thumb-height)",...r},onPointerDownCapture:ki(e.onPointerDownCapture,g=>{const b=g.target.getBoundingClientRect(),S=g.clientX-b.left,w=g.clientY-b.top;i.onThumbPointerDown({x:S,y:w})}),onPointerUp:ki(e.onPointerUp,i.onThumbPointerUp)}))}),Qk="ScrollAreaCorner",SV=f.forwardRef((e,t)=>{const n=Zo(Qk,e.__scopeScrollArea),r=!!(n.scrollbarX&&n.scrollbarY);return n.type!=="scroll"&&r?f.createElement(CV,Qn({},e,{ref:t})):null}),CV=f.forwardRef((e,t)=>{const{__scopeScrollArea:n,...r}=e,o=Zo(Qk,n),[s,i]=f.useState(0),[u,d]=f.useState(0),p=!!(s&&u);return $l(o.scrollbarX,()=>{var h;const g=((h=o.scrollbarX)===null||h===void 0?void 0:h.offsetHeight)||0;o.onCornerHeightChange(g),d(g)}),$l(o.scrollbarY,()=>{var h;const g=((h=o.scrollbarY)===null||h===void 0?void 0:h.offsetWidth)||0;o.onCornerWidthChange(g),i(g)}),p?f.createElement(Lu.div,Qn({},r,{ref:t,style:{width:s,height:u,position:"absolute",right:o.dir==="ltr"?0:void 0,left:o.dir==="rtl"?0:void 0,bottom:0,...e.style}})):null});function hp(e){return e?parseInt(e,10):0}function Xk(e,t){const n=e/t;return isNaN(n)?0:n}function kh(e){const t=Xk(e.viewport,e.content),n=e.scrollbar.paddingStart+e.scrollbar.paddingEnd,r=(e.scrollbar.size-n)*t;return Math.max(r,18)}function _V(e,t,n,r="ltr"){const o=kh(n),s=o/2,i=t||s,u=o-i,d=n.scrollbar.paddingStart+i,p=n.scrollbar.size-n.scrollbar.paddingEnd-u,h=n.content-n.viewport,g=r==="ltr"?[0,h]:[h*-1,0];return Jk([d,p],g)(e)}function sS(e,t,n="ltr"){const r=kh(t),o=t.scrollbar.paddingStart+t.scrollbar.paddingEnd,s=t.scrollbar.size-o,i=t.content-t.viewport,u=s-r,d=n==="ltr"?[0,i]:[i*-1,0],p=lV(e,d);return Jk([0,i],[0,u])(p)}function Jk(e,t){return n=>{if(e[0]===e[1]||t[0]===t[1])return t[0];const r=(t[1]-t[0])/(e[1]-e[0]);return t[0]+r*(n-e[0])}}function Zk(e,t){return e>0&&e{})=>{let n={left:e.scrollLeft,top:e.scrollTop},r=0;return function o(){const s={left:e.scrollLeft,top:e.scrollTop},i=n.left!==s.left,u=n.top!==s.top;(i||u)&&t(),n=s,r=window.requestAnimationFrame(o)}(),()=>window.cancelAnimationFrame(r)};function Ph(e,t){const n=yi(e),r=f.useRef(0);return f.useEffect(()=>()=>window.clearTimeout(r.current),[]),f.useCallback(()=>{window.clearTimeout(r.current),r.current=window.setTimeout(n,t)},[n,t])}function $l(e,t){const n=yi(t);T0(()=>{let r=0;if(e){const o=new ResizeObserver(()=>{cancelAnimationFrame(r),r=window.requestAnimationFrame(n)});return o.observe(e),()=>{window.cancelAnimationFrame(r),o.unobserve(e)}}},[e,n])}const PV=dV,jV=pV,aS=hV,iS=xV,IV=SV;var EV=Zr((e,{scrollbarSize:t,offsetScrollbars:n,scrollbarHovered:r,hidden:o})=>({root:{overflow:"hidden"},viewport:{width:"100%",height:"100%",paddingRight:n?$e(t):void 0,paddingBottom:n?$e(t):void 0},scrollbar:{display:o?"none":"flex",userSelect:"none",touchAction:"none",boxSizing:"border-box",padding:`calc(${$e(t)} / 5)`,transition:"background-color 150ms ease, opacity 150ms ease","&:hover":{backgroundColor:e.colorScheme==="dark"?e.colors.dark[8]:e.colors.gray[0],[`& .${fw("thumb")}`]:{backgroundColor:e.colorScheme==="dark"?e.fn.rgba(e.white,.5):e.fn.rgba(e.black,.5)}},'&[data-orientation="vertical"]':{width:$e(t)},'&[data-orientation="horizontal"]':{flexDirection:"column",height:$e(t)},'&[data-state="hidden"]':{display:"none",opacity:0}},thumb:{ref:fw("thumb"),flex:1,backgroundColor:e.colorScheme==="dark"?e.fn.rgba(e.white,.4):e.fn.rgba(e.black,.4),borderRadius:$e(t),position:"relative",transition:"background-color 150ms ease",display:o?"none":void 0,overflow:"hidden","&::before":{content:'""',position:"absolute",top:"50%",left:"50%",transform:"translate(-50%, -50%)",width:"100%",height:"100%",minWidth:$e(44),minHeight:$e(44)}},corner:{backgroundColor:e.colorScheme==="dark"?e.colors.dark[6]:e.colors.gray[0],transition:"opacity 150ms ease",opacity:r?1:0,display:o?"none":void 0}}));const OV=EV;var MV=Object.defineProperty,RV=Object.defineProperties,DV=Object.getOwnPropertyDescriptors,mp=Object.getOwnPropertySymbols,eP=Object.prototype.hasOwnProperty,tP=Object.prototype.propertyIsEnumerable,lS=(e,t,n)=>t in e?MV(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,N0=(e,t)=>{for(var n in t||(t={}))eP.call(t,n)&&lS(e,n,t[n]);if(mp)for(var n of mp(t))tP.call(t,n)&&lS(e,n,t[n]);return e},nP=(e,t)=>RV(e,DV(t)),rP=(e,t)=>{var n={};for(var r in e)eP.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(e!=null&&mp)for(var r of mp(e))t.indexOf(r)<0&&tP.call(e,r)&&(n[r]=e[r]);return n};const oP={scrollbarSize:12,scrollHideDelay:1e3,type:"hover",offsetScrollbars:!1},jh=f.forwardRef((e,t)=>{const n=mr("ScrollArea",oP,e),{children:r,className:o,classNames:s,styles:i,scrollbarSize:u,scrollHideDelay:d,type:p,dir:h,offsetScrollbars:g,viewportRef:v,onScrollPositionChange:b,unstyled:S,variant:w,viewportProps:C}=n,_=rP(n,["children","className","classNames","styles","scrollbarSize","scrollHideDelay","type","dir","offsetScrollbars","viewportRef","onScrollPositionChange","unstyled","variant","viewportProps"]),[k,j]=f.useState(!1),E=Ca(),{classes:I,cx:O}=OV({scrollbarSize:u,offsetScrollbars:g,scrollbarHovered:k,hidden:p==="never"},{name:"ScrollArea",classNames:s,styles:i,unstyled:S,variant:w});return N.createElement(PV,{type:p==="never"?"always":p,scrollHideDelay:d,dir:h||E.dir,ref:t,asChild:!0},N.createElement(bo,N0({className:O(I.root,o)},_),N.createElement(jV,nP(N0({},C),{className:I.viewport,ref:v,onScroll:typeof b=="function"?({currentTarget:M})=>b({x:M.scrollLeft,y:M.scrollTop}):void 0}),r),N.createElement(aS,{orientation:"horizontal",className:I.scrollbar,forceMount:!0,onMouseEnter:()=>j(!0),onMouseLeave:()=>j(!1)},N.createElement(iS,{className:I.thumb})),N.createElement(aS,{orientation:"vertical",className:I.scrollbar,forceMount:!0,onMouseEnter:()=>j(!0),onMouseLeave:()=>j(!1)},N.createElement(iS,{className:I.thumb})),N.createElement(IV,{className:I.corner})))}),sP=f.forwardRef((e,t)=>{const n=mr("ScrollAreaAutosize",oP,e),{children:r,classNames:o,styles:s,scrollbarSize:i,scrollHideDelay:u,type:d,dir:p,offsetScrollbars:h,viewportRef:g,onScrollPositionChange:v,unstyled:b,sx:S,variant:w,viewportProps:C}=n,_=rP(n,["children","classNames","styles","scrollbarSize","scrollHideDelay","type","dir","offsetScrollbars","viewportRef","onScrollPositionChange","unstyled","sx","variant","viewportProps"]);return N.createElement(bo,nP(N0({},_),{ref:t,sx:[{display:"flex"},...G_(S)]}),N.createElement(bo,{sx:{display:"flex",flexDirection:"column",flex:1}},N.createElement(jh,{classNames:o,styles:s,scrollHideDelay:u,scrollbarSize:i,type:d,dir:p,offsetScrollbars:h,viewportRef:g,onScrollPositionChange:v,unstyled:b,variant:w,viewportProps:C},r)))});sP.displayName="@mantine/core/ScrollAreaAutosize";jh.displayName="@mantine/core/ScrollArea";jh.Autosize=sP;const aP=jh;var TV=Object.defineProperty,AV=Object.defineProperties,NV=Object.getOwnPropertyDescriptors,gp=Object.getOwnPropertySymbols,iP=Object.prototype.hasOwnProperty,lP=Object.prototype.propertyIsEnumerable,cS=(e,t,n)=>t in e?TV(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,uS=(e,t)=>{for(var n in t||(t={}))iP.call(t,n)&&cS(e,n,t[n]);if(gp)for(var n of gp(t))lP.call(t,n)&&cS(e,n,t[n]);return e},$V=(e,t)=>AV(e,NV(t)),zV=(e,t)=>{var n={};for(var r in e)iP.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(e!=null&&gp)for(var r of gp(e))t.indexOf(r)<0&&lP.call(e,r)&&(n[r]=e[r]);return n};const Ih=f.forwardRef((e,t)=>{var n=e,{style:r}=n,o=zV(n,["style"]);return N.createElement(aP,$V(uS({},o),{style:uS({width:"100%"},r),viewportProps:{tabIndex:-1},viewportRef:t}),o.children)});Ih.displayName="@mantine/core/SelectScrollArea";var LV=Zr(()=>({dropdown:{},itemsWrapper:{padding:$e(4),display:"flex",width:"100%",boxSizing:"border-box"}}));const BV=LV;function ac(e){return e.split("-")[1]}function j1(e){return e==="y"?"height":"width"}function ms(e){return e.split("-")[0]}function si(e){return["top","bottom"].includes(ms(e))?"x":"y"}function dS(e,t,n){let{reference:r,floating:o}=e;const s=r.x+r.width/2-o.width/2,i=r.y+r.height/2-o.height/2,u=si(t),d=j1(u),p=r[d]/2-o[d]/2,h=u==="x";let g;switch(ms(t)){case"top":g={x:s,y:r.y-o.height};break;case"bottom":g={x:s,y:r.y+r.height};break;case"right":g={x:r.x+r.width,y:i};break;case"left":g={x:r.x-o.width,y:i};break;default:g={x:r.x,y:r.y}}switch(ac(t)){case"start":g[u]-=p*(n&&h?-1:1);break;case"end":g[u]+=p*(n&&h?-1:1)}return g}const FV=async(e,t,n)=>{const{placement:r="bottom",strategy:o="absolute",middleware:s=[],platform:i}=n,u=s.filter(Boolean),d=await(i.isRTL==null?void 0:i.isRTL(t));let p=await i.getElementRects({reference:e,floating:t,strategy:o}),{x:h,y:g}=dS(p,r,d),v=r,b={},S=0;for(let w=0;w({name:"arrow",options:e,async fn(t){const{x:n,y:r,placement:o,rects:s,platform:i,elements:u}=t,{element:d,padding:p=0}=xa(e,t)||{};if(d==null)return{};const h=I1(p),g={x:n,y:r},v=si(o),b=j1(v),S=await i.getDimensions(d),w=v==="y",C=w?"top":"left",_=w?"bottom":"right",k=w?"clientHeight":"clientWidth",j=s.reference[b]+s.reference[v]-g[v]-s.floating[b],E=g[v]-s.reference[v],I=await(i.getOffsetParent==null?void 0:i.getOffsetParent(d));let O=I?I[k]:0;O&&await(i.isElement==null?void 0:i.isElement(I))||(O=u.floating[k]||s.floating[b]);const M=j/2-E/2,T=O/2-S[b]/2-1,A=Za(h[C],T),z=Za(h[_],T),$=A,ee=O-S[b]-z,B=O/2-S[b]/2+M,H=$0($,B,ee),G=ac(o)!=null&&B!=H&&s.reference[b]/2-(B<$?A:z)-S[b]/2<0?B<$?$-B:ee-B:0;return{[v]:g[v]-G,data:{[v]:H,centerOffset:B-H+G}}}}),HV=["top","right","bottom","left"];HV.reduce((e,t)=>e.concat(t,t+"-start",t+"-end"),[]);const WV={left:"right",right:"left",bottom:"top",top:"bottom"};function vp(e){return e.replace(/left|right|bottom|top/g,t=>WV[t])}function VV(e,t,n){n===void 0&&(n=!1);const r=ac(e),o=si(e),s=j1(o);let i=o==="x"?r===(n?"end":"start")?"right":"left":r==="start"?"bottom":"top";return t.reference[s]>t.floating[s]&&(i=vp(i)),{main:i,cross:vp(i)}}const UV={start:"end",end:"start"};function Ig(e){return e.replace(/start|end/g,t=>UV[t])}const GV=function(e){return e===void 0&&(e={}),{name:"flip",options:e,async fn(t){var n;const{placement:r,middlewareData:o,rects:s,initialPlacement:i,platform:u,elements:d}=t,{mainAxis:p=!0,crossAxis:h=!0,fallbackPlacements:g,fallbackStrategy:v="bestFit",fallbackAxisSideDirection:b="none",flipAlignment:S=!0,...w}=xa(e,t),C=ms(r),_=ms(i)===i,k=await(u.isRTL==null?void 0:u.isRTL(d.floating)),j=g||(_||!S?[vp(i)]:function($){const ee=vp($);return[Ig($),ee,Ig(ee)]}(i));g||b==="none"||j.push(...function($,ee,B,H){const G=ac($);let K=function(R,U,V){const J=["left","right"],ie=["right","left"],xe=["top","bottom"],he=["bottom","top"];switch(R){case"top":case"bottom":return V?U?ie:J:U?J:ie;case"left":case"right":return U?xe:he;default:return[]}}(ms($),B==="start",H);return G&&(K=K.map(R=>R+"-"+G),ee&&(K=K.concat(K.map(Ig)))),K}(i,S,b,k));const E=[i,...j],I=await E1(t,w),O=[];let M=((n=o.flip)==null?void 0:n.overflows)||[];if(p&&O.push(I[C]),h){const{main:$,cross:ee}=VV(r,s,k);O.push(I[$],I[ee])}if(M=[...M,{placement:r,overflows:O}],!O.every($=>$<=0)){var T,A;const $=(((T=o.flip)==null?void 0:T.index)||0)+1,ee=E[$];if(ee)return{data:{index:$,overflows:M},reset:{placement:ee}};let B=(A=M.filter(H=>H.overflows[0]<=0).sort((H,G)=>H.overflows[1]-G.overflows[1])[0])==null?void 0:A.placement;if(!B)switch(v){case"bestFit":{var z;const H=(z=M.map(G=>[G.placement,G.overflows.filter(K=>K>0).reduce((K,R)=>K+R,0)]).sort((G,K)=>G[1]-K[1])[0])==null?void 0:z[0];H&&(B=H);break}case"initialPlacement":B=i}if(r!==B)return{reset:{placement:B}}}return{}}}};function pS(e){const t=Za(...e.map(r=>r.left)),n=Za(...e.map(r=>r.top));return{x:t,y:n,width:zs(...e.map(r=>r.right))-t,height:zs(...e.map(r=>r.bottom))-n}}const qV=function(e){return e===void 0&&(e={}),{name:"inline",options:e,async fn(t){const{placement:n,elements:r,rects:o,platform:s,strategy:i}=t,{padding:u=2,x:d,y:p}=xa(e,t),h=Array.from(await(s.getClientRects==null?void 0:s.getClientRects(r.reference))||[]),g=function(w){const C=w.slice().sort((j,E)=>j.y-E.y),_=[];let k=null;for(let j=0;jk.height/2?_.push([E]):_[_.length-1].push(E),k=E}return _.map(j=>zl(pS(j)))}(h),v=zl(pS(h)),b=I1(u),S=await s.getElementRects({reference:{getBoundingClientRect:function(){if(g.length===2&&g[0].left>g[1].right&&d!=null&&p!=null)return g.find(w=>d>w.left-b.left&&dw.top-b.top&&p=2){if(si(n)==="x"){const I=g[0],O=g[g.length-1],M=ms(n)==="top",T=I.top,A=O.bottom,z=M?I.left:O.left,$=M?I.right:O.right;return{top:T,bottom:A,left:z,right:$,width:$-z,height:A-T,x:z,y:T}}const w=ms(n)==="left",C=zs(...g.map(I=>I.right)),_=Za(...g.map(I=>I.left)),k=g.filter(I=>w?I.left===_:I.right===C),j=k[0].top,E=k[k.length-1].bottom;return{top:j,bottom:E,left:_,right:C,width:C-_,height:E-j,x:_,y:j}}return v}},floating:r.floating,strategy:i});return o.reference.x!==S.reference.x||o.reference.y!==S.reference.y||o.reference.width!==S.reference.width||o.reference.height!==S.reference.height?{reset:{rects:S}}:{}}}},KV=function(e){return e===void 0&&(e=0),{name:"offset",options:e,async fn(t){const{x:n,y:r}=t,o=await async function(s,i){const{placement:u,platform:d,elements:p}=s,h=await(d.isRTL==null?void 0:d.isRTL(p.floating)),g=ms(u),v=ac(u),b=si(u)==="x",S=["left","top"].includes(g)?-1:1,w=h&&b?-1:1,C=xa(i,s);let{mainAxis:_,crossAxis:k,alignmentAxis:j}=typeof C=="number"?{mainAxis:C,crossAxis:0,alignmentAxis:null}:{mainAxis:0,crossAxis:0,alignmentAxis:null,...C};return v&&typeof j=="number"&&(k=v==="end"?-1*j:j),b?{x:k*w,y:_*S}:{x:_*S,y:k*w}}(t,e);return{x:n+o.x,y:r+o.y,data:o}}}};function cP(e){return e==="x"?"y":"x"}const YV=function(e){return e===void 0&&(e={}),{name:"shift",options:e,async fn(t){const{x:n,y:r,placement:o}=t,{mainAxis:s=!0,crossAxis:i=!1,limiter:u={fn:C=>{let{x:_,y:k}=C;return{x:_,y:k}}},...d}=xa(e,t),p={x:n,y:r},h=await E1(t,d),g=si(ms(o)),v=cP(g);let b=p[g],S=p[v];if(s){const C=g==="y"?"bottom":"right";b=$0(b+h[g==="y"?"top":"left"],b,b-h[C])}if(i){const C=v==="y"?"bottom":"right";S=$0(S+h[v==="y"?"top":"left"],S,S-h[C])}const w=u.fn({...t,[g]:b,[v]:S});return{...w,data:{x:w.x-n,y:w.y-r}}}}},QV=function(e){return e===void 0&&(e={}),{options:e,fn(t){const{x:n,y:r,placement:o,rects:s,middlewareData:i}=t,{offset:u=0,mainAxis:d=!0,crossAxis:p=!0}=xa(e,t),h={x:n,y:r},g=si(o),v=cP(g);let b=h[g],S=h[v];const w=xa(u,t),C=typeof w=="number"?{mainAxis:w,crossAxis:0}:{mainAxis:0,crossAxis:0,...w};if(d){const j=g==="y"?"height":"width",E=s.reference[g]-s.floating[j]+C.mainAxis,I=s.reference[g]+s.reference[j]-C.mainAxis;bI&&(b=I)}if(p){var _,k;const j=g==="y"?"width":"height",E=["top","left"].includes(ms(o)),I=s.reference[v]-s.floating[j]+(E&&((_=i.offset)==null?void 0:_[v])||0)+(E?0:C.crossAxis),O=s.reference[v]+s.reference[j]+(E?0:((k=i.offset)==null?void 0:k[v])||0)-(E?C.crossAxis:0);SO&&(S=O)}return{[g]:b,[v]:S}}}},XV=function(e){return e===void 0&&(e={}),{name:"size",options:e,async fn(t){const{placement:n,rects:r,platform:o,elements:s}=t,{apply:i=()=>{},...u}=xa(e,t),d=await E1(t,u),p=ms(n),h=ac(n),g=si(n)==="x",{width:v,height:b}=r.floating;let S,w;p==="top"||p==="bottom"?(S=p,w=h===(await(o.isRTL==null?void 0:o.isRTL(s.floating))?"start":"end")?"left":"right"):(w=p,S=h==="end"?"top":"bottom");const C=b-d[S],_=v-d[w],k=!t.middlewareData.shift;let j=C,E=_;if(g){const O=v-d.left-d.right;E=h||k?Za(_,O):O}else{const O=b-d.top-d.bottom;j=h||k?Za(C,O):O}if(k&&!h){const O=zs(d.left,0),M=zs(d.right,0),T=zs(d.top,0),A=zs(d.bottom,0);g?E=v-2*(O!==0||M!==0?O+M:zs(d.left,d.right)):j=b-2*(T!==0||A!==0?T+A:zs(d.top,d.bottom))}await i({...t,availableWidth:E,availableHeight:j});const I=await o.getDimensions(s.floating);return v!==I.width||b!==I.height?{reset:{rects:!0}}:{}}}};function Eo(e){var t;return(e==null||(t=e.ownerDocument)==null?void 0:t.defaultView)||window}function Gs(e){return Eo(e).getComputedStyle(e)}function uP(e){return e instanceof Eo(e).Node}function ei(e){return uP(e)?(e.nodeName||"").toLowerCase():"#document"}function xs(e){return e instanceof HTMLElement||e instanceof Eo(e).HTMLElement}function hS(e){return typeof ShadowRoot<"u"&&(e instanceof Eo(e).ShadowRoot||e instanceof ShadowRoot)}function du(e){const{overflow:t,overflowX:n,overflowY:r,display:o}=Gs(e);return/auto|scroll|overlay|hidden|clip/.test(t+r+n)&&!["inline","contents"].includes(o)}function JV(e){return["table","td","th"].includes(ei(e))}function z0(e){const t=O1(),n=Gs(e);return n.transform!=="none"||n.perspective!=="none"||!!n.containerType&&n.containerType!=="normal"||!t&&!!n.backdropFilter&&n.backdropFilter!=="none"||!t&&!!n.filter&&n.filter!=="none"||["transform","perspective","filter"].some(r=>(n.willChange||"").includes(r))||["paint","layout","strict","content"].some(r=>(n.contain||"").includes(r))}function O1(){return!(typeof CSS>"u"||!CSS.supports)&&CSS.supports("-webkit-backdrop-filter","none")}function Eh(e){return["html","body","#document"].includes(ei(e))}const L0=Math.min,Rl=Math.max,yp=Math.round,tf=Math.floor,ti=e=>({x:e,y:e});function dP(e){const t=Gs(e);let n=parseFloat(t.width)||0,r=parseFloat(t.height)||0;const o=xs(e),s=o?e.offsetWidth:n,i=o?e.offsetHeight:r,u=yp(n)!==s||yp(r)!==i;return u&&(n=s,r=i),{width:n,height:r,$:u}}function da(e){return e instanceof Element||e instanceof Eo(e).Element}function M1(e){return da(e)?e:e.contextElement}function Dl(e){const t=M1(e);if(!xs(t))return ti(1);const n=t.getBoundingClientRect(),{width:r,height:o,$:s}=dP(t);let i=(s?yp(n.width):n.width)/r,u=(s?yp(n.height):n.height)/o;return i&&Number.isFinite(i)||(i=1),u&&Number.isFinite(u)||(u=1),{x:i,y:u}}const ZV=ti(0);function fP(e){const t=Eo(e);return O1()&&t.visualViewport?{x:t.visualViewport.offsetLeft,y:t.visualViewport.offsetTop}:ZV}function Di(e,t,n,r){t===void 0&&(t=!1),n===void 0&&(n=!1);const o=e.getBoundingClientRect(),s=M1(e);let i=ti(1);t&&(r?da(r)&&(i=Dl(r)):i=Dl(e));const u=function(v,b,S){return b===void 0&&(b=!1),!(!S||b&&S!==Eo(v))&&b}(s,n,r)?fP(s):ti(0);let d=(o.left+u.x)/i.x,p=(o.top+u.y)/i.y,h=o.width/i.x,g=o.height/i.y;if(s){const v=Eo(s),b=r&&da(r)?Eo(r):r;let S=v.frameElement;for(;S&&r&&b!==v;){const w=Dl(S),C=S.getBoundingClientRect(),_=getComputedStyle(S),k=C.left+(S.clientLeft+parseFloat(_.paddingLeft))*w.x,j=C.top+(S.clientTop+parseFloat(_.paddingTop))*w.y;d*=w.x,p*=w.y,h*=w.x,g*=w.y,d+=k,p+=j,S=Eo(S).frameElement}}return zl({width:h,height:g,x:d,y:p})}function Oh(e){return da(e)?{scrollLeft:e.scrollLeft,scrollTop:e.scrollTop}:{scrollLeft:e.pageXOffset,scrollTop:e.pageYOffset}}function fa(e){var t;return(t=(uP(e)?e.ownerDocument:e.document)||window.document)==null?void 0:t.documentElement}function pP(e){return Di(fa(e)).left+Oh(e).scrollLeft}function Ll(e){if(ei(e)==="html")return e;const t=e.assignedSlot||e.parentNode||hS(e)&&e.host||fa(e);return hS(t)?t.host:t}function hP(e){const t=Ll(e);return Eh(t)?e.ownerDocument?e.ownerDocument.body:e.body:xs(t)&&du(t)?t:hP(t)}function bp(e,t){var n;t===void 0&&(t=[]);const r=hP(e),o=r===((n=e.ownerDocument)==null?void 0:n.body),s=Eo(r);return o?t.concat(s,s.visualViewport||[],du(r)?r:[]):t.concat(r,bp(r))}function mS(e,t,n){let r;if(t==="viewport")r=function(o,s){const i=Eo(o),u=fa(o),d=i.visualViewport;let p=u.clientWidth,h=u.clientHeight,g=0,v=0;if(d){p=d.width,h=d.height;const b=O1();(!b||b&&s==="fixed")&&(g=d.offsetLeft,v=d.offsetTop)}return{width:p,height:h,x:g,y:v}}(e,n);else if(t==="document")r=function(o){const s=fa(o),i=Oh(o),u=o.ownerDocument.body,d=Rl(s.scrollWidth,s.clientWidth,u.scrollWidth,u.clientWidth),p=Rl(s.scrollHeight,s.clientHeight,u.scrollHeight,u.clientHeight);let h=-i.scrollLeft+pP(o);const g=-i.scrollTop;return Gs(u).direction==="rtl"&&(h+=Rl(s.clientWidth,u.clientWidth)-d),{width:d,height:p,x:h,y:g}}(fa(e));else if(da(t))r=function(o,s){const i=Di(o,!0,s==="fixed"),u=i.top+o.clientTop,d=i.left+o.clientLeft,p=xs(o)?Dl(o):ti(1);return{width:o.clientWidth*p.x,height:o.clientHeight*p.y,x:d*p.x,y:u*p.y}}(t,n);else{const o=fP(e);r={...t,x:t.x-o.x,y:t.y-o.y}}return zl(r)}function mP(e,t){const n=Ll(e);return!(n===t||!da(n)||Eh(n))&&(Gs(n).position==="fixed"||mP(n,t))}function eU(e,t,n){const r=xs(t),o=fa(t),s=n==="fixed",i=Di(e,!0,s,t);let u={scrollLeft:0,scrollTop:0};const d=ti(0);if(r||!r&&!s)if((ei(t)!=="body"||du(o))&&(u=Oh(t)),xs(t)){const p=Di(t,!0,s,t);d.x=p.x+t.clientLeft,d.y=p.y+t.clientTop}else o&&(d.x=pP(o));return{x:i.left+u.scrollLeft-d.x,y:i.top+u.scrollTop-d.y,width:i.width,height:i.height}}function gS(e,t){return xs(e)&&Gs(e).position!=="fixed"?t?t(e):e.offsetParent:null}function vS(e,t){const n=Eo(e);if(!xs(e))return n;let r=gS(e,t);for(;r&&JV(r)&&Gs(r).position==="static";)r=gS(r,t);return r&&(ei(r)==="html"||ei(r)==="body"&&Gs(r).position==="static"&&!z0(r))?n:r||function(o){let s=Ll(o);for(;xs(s)&&!Eh(s);){if(z0(s))return s;s=Ll(s)}return null}(e)||n}const tU={convertOffsetParentRelativeRectToViewportRelativeRect:function(e){let{rect:t,offsetParent:n,strategy:r}=e;const o=xs(n),s=fa(n);if(n===s)return t;let i={scrollLeft:0,scrollTop:0},u=ti(1);const d=ti(0);if((o||!o&&r!=="fixed")&&((ei(n)!=="body"||du(s))&&(i=Oh(n)),xs(n))){const p=Di(n);u=Dl(n),d.x=p.x+n.clientLeft,d.y=p.y+n.clientTop}return{width:t.width*u.x,height:t.height*u.y,x:t.x*u.x-i.scrollLeft*u.x+d.x,y:t.y*u.y-i.scrollTop*u.y+d.y}},getDocumentElement:fa,getClippingRect:function(e){let{element:t,boundary:n,rootBoundary:r,strategy:o}=e;const s=[...n==="clippingAncestors"?function(d,p){const h=p.get(d);if(h)return h;let g=bp(d).filter(w=>da(w)&&ei(w)!=="body"),v=null;const b=Gs(d).position==="fixed";let S=b?Ll(d):d;for(;da(S)&&!Eh(S);){const w=Gs(S),C=z0(S);C||w.position!=="fixed"||(v=null),(b?!C&&!v:!C&&w.position==="static"&&v&&["absolute","fixed"].includes(v.position)||du(S)&&!C&&mP(d,S))?g=g.filter(_=>_!==S):v=w,S=Ll(S)}return p.set(d,g),g}(t,this._c):[].concat(n),r],i=s[0],u=s.reduce((d,p)=>{const h=mS(t,p,o);return d.top=Rl(h.top,d.top),d.right=L0(h.right,d.right),d.bottom=L0(h.bottom,d.bottom),d.left=Rl(h.left,d.left),d},mS(t,i,o));return{width:u.right-u.left,height:u.bottom-u.top,x:u.left,y:u.top}},getOffsetParent:vS,getElementRects:async function(e){let{reference:t,floating:n,strategy:r}=e;const o=this.getOffsetParent||vS,s=this.getDimensions;return{reference:eU(t,await o(n),r),floating:{x:0,y:0,...await s(n)}}},getClientRects:function(e){return Array.from(e.getClientRects())},getDimensions:function(e){return dP(e)},getScale:Dl,isElement:da,isRTL:function(e){return getComputedStyle(e).direction==="rtl"}};function nU(e,t,n,r){r===void 0&&(r={});const{ancestorScroll:o=!0,ancestorResize:s=!0,elementResize:i=typeof ResizeObserver=="function",layoutShift:u=typeof IntersectionObserver=="function",animationFrame:d=!1}=r,p=M1(e),h=o||s?[...p?bp(p):[],...bp(t)]:[];h.forEach(C=>{o&&C.addEventListener("scroll",n,{passive:!0}),s&&C.addEventListener("resize",n)});const g=p&&u?function(C,_){let k,j=null;const E=fa(C);function I(){clearTimeout(k),j&&j.disconnect(),j=null}return function O(M,T){M===void 0&&(M=!1),T===void 0&&(T=1),I();const{left:A,top:z,width:$,height:ee}=C.getBoundingClientRect();if(M||_(),!$||!ee)return;const B={rootMargin:-tf(z)+"px "+-tf(E.clientWidth-(A+$))+"px "+-tf(E.clientHeight-(z+ee))+"px "+-tf(A)+"px",threshold:Rl(0,L0(1,T))||1};let H=!0;function G(K){const R=K[0].intersectionRatio;if(R!==T){if(!H)return O();R?O(!1,R):k=setTimeout(()=>{O(!1,1e-7)},100)}H=!1}try{j=new IntersectionObserver(G,{...B,root:E.ownerDocument})}catch{j=new IntersectionObserver(G,B)}j.observe(C)}(!0),I}(p,n):null;let v,b=-1,S=null;i&&(S=new ResizeObserver(C=>{let[_]=C;_&&_.target===p&&S&&(S.unobserve(t),cancelAnimationFrame(b),b=requestAnimationFrame(()=>{S&&S.observe(t)})),n()}),p&&!d&&S.observe(p),S.observe(t));let w=d?Di(e):null;return d&&function C(){const _=Di(e);!w||_.x===w.x&&_.y===w.y&&_.width===w.width&&_.height===w.height||n(),w=_,v=requestAnimationFrame(C)}(),n(),()=>{h.forEach(C=>{o&&C.removeEventListener("scroll",n),s&&C.removeEventListener("resize",n)}),g&&g(),S&&S.disconnect(),S=null,d&&cancelAnimationFrame(v)}}const rU=(e,t,n)=>{const r=new Map,o={platform:tU,...n},s={...o.platform,_c:r};return FV(e,t,{...o,platform:s})},oU=e=>{const{element:t,padding:n}=e;function r(o){return Object.prototype.hasOwnProperty.call(o,"current")}return{name:"arrow",options:e,fn(o){return r(t)?t.current!=null?fS({element:t.current,padding:n}).fn(o):{}:t?fS({element:t,padding:n}).fn(o):{}}}};var bf=typeof document<"u"?f.useLayoutEffect:f.useEffect;function xp(e,t){if(e===t)return!0;if(typeof e!=typeof t)return!1;if(typeof e=="function"&&e.toString()===t.toString())return!0;let n,r,o;if(e&&t&&typeof e=="object"){if(Array.isArray(e)){if(n=e.length,n!=t.length)return!1;for(r=n;r--!==0;)if(!xp(e[r],t[r]))return!1;return!0}if(o=Object.keys(e),n=o.length,n!==Object.keys(t).length)return!1;for(r=n;r--!==0;)if(!Object.prototype.hasOwnProperty.call(t,o[r]))return!1;for(r=n;r--!==0;){const s=o[r];if(!(s==="_owner"&&e.$$typeof)&&!xp(e[s],t[s]))return!1}return!0}return e!==e&&t!==t}function yS(e){const t=f.useRef(e);return bf(()=>{t.current=e}),t}function sU(e){e===void 0&&(e={});const{placement:t="bottom",strategy:n="absolute",middleware:r=[],platform:o,whileElementsMounted:s,open:i}=e,[u,d]=f.useState({x:null,y:null,strategy:n,placement:t,middlewareData:{},isPositioned:!1}),[p,h]=f.useState(r);xp(p,r)||h(r);const g=f.useRef(null),v=f.useRef(null),b=f.useRef(u),S=yS(s),w=yS(o),[C,_]=f.useState(null),[k,j]=f.useState(null),E=f.useCallback(z=>{g.current!==z&&(g.current=z,_(z))},[]),I=f.useCallback(z=>{v.current!==z&&(v.current=z,j(z))},[]),O=f.useCallback(()=>{if(!g.current||!v.current)return;const z={placement:t,strategy:n,middleware:p};w.current&&(z.platform=w.current),rU(g.current,v.current,z).then($=>{const ee={...$,isPositioned:!0};M.current&&!xp(b.current,ee)&&(b.current=ee,Xl.flushSync(()=>{d(ee)}))})},[p,t,n,w]);bf(()=>{i===!1&&b.current.isPositioned&&(b.current.isPositioned=!1,d(z=>({...z,isPositioned:!1})))},[i]);const M=f.useRef(!1);bf(()=>(M.current=!0,()=>{M.current=!1}),[]),bf(()=>{if(C&&k){if(S.current)return S.current(C,k,O);O()}},[C,k,O,S]);const T=f.useMemo(()=>({reference:g,floating:v,setReference:E,setFloating:I}),[E,I]),A=f.useMemo(()=>({reference:C,floating:k}),[C,k]);return f.useMemo(()=>({...u,update:O,refs:T,elements:A,reference:E,floating:I}),[u,O,T,A,E,I])}var aU=typeof document<"u"?f.useLayoutEffect:f.useEffect;function iU(){const e=new Map;return{emit(t,n){var r;(r=e.get(t))==null||r.forEach(o=>o(n))},on(t,n){e.set(t,[...e.get(t)||[],n])},off(t,n){e.set(t,(e.get(t)||[]).filter(r=>r!==n))}}}const lU=f.createContext(null),cU=()=>f.useContext(lU);function uU(e){return(e==null?void 0:e.ownerDocument)||document}function dU(e){return uU(e).defaultView||window}function nf(e){return e?e instanceof dU(e).Element:!1}const fU=dv["useInsertionEffect".toString()],pU=fU||(e=>e());function hU(e){const t=f.useRef(()=>{});return pU(()=>{t.current=e}),f.useCallback(function(){for(var n=arguments.length,r=new Array(n),o=0;oiU())[0],[p,h]=f.useState(null),g=f.useCallback(_=>{const k=nf(_)?{getBoundingClientRect:()=>_.getBoundingClientRect(),contextElement:_}:_;o.refs.setReference(k)},[o.refs]),v=f.useCallback(_=>{(nf(_)||_===null)&&(i.current=_,h(_)),(nf(o.refs.reference.current)||o.refs.reference.current===null||_!==null&&!nf(_))&&o.refs.setReference(_)},[o.refs]),b=f.useMemo(()=>({...o.refs,setReference:v,setPositionReference:g,domReference:i}),[o.refs,v,g]),S=f.useMemo(()=>({...o.elements,domReference:p}),[o.elements,p]),w=hU(n),C=f.useMemo(()=>({...o,refs:b,elements:S,dataRef:u,nodeId:r,events:d,open:t,onOpenChange:w}),[o,r,d,t,w,b,S]);return aU(()=>{const _=s==null?void 0:s.nodesRef.current.find(k=>k.id===r);_&&(_.context=C)}),f.useMemo(()=>({...o,context:C,refs:b,reference:v,positionReference:g}),[o,b,C,v,g])}function gU({opened:e,floating:t,position:n,positionDependencies:r}){const[o,s]=f.useState(0);f.useEffect(()=>{if(t.refs.reference.current&&t.refs.floating.current)return nU(t.refs.reference.current,t.refs.floating.current,t.update)},[t.refs.reference.current,t.refs.floating.current,e,o,n]),hs(()=>{t.update()},r),hs(()=>{s(i=>i+1)},[e])}function vU(e){const t=[KV(e.offset)];return e.middlewares.shift&&t.push(YV({limiter:QV()})),e.middlewares.flip&&t.push(GV()),e.middlewares.inline&&t.push(qV()),t.push(oU({element:e.arrowRef,padding:e.arrowOffset})),t}function yU(e){const[t,n]=uu({value:e.opened,defaultValue:e.defaultOpened,finalValue:!1,onChange:e.onChange}),r=()=>{var i;(i=e.onClose)==null||i.call(e),n(!1)},o=()=>{var i,u;t?((i=e.onClose)==null||i.call(e),n(!1)):((u=e.onOpen)==null||u.call(e),n(!0))},s=mU({placement:e.position,middleware:[...vU(e),...e.width==="target"?[XV({apply({rects:i}){var u,d;Object.assign((d=(u=s.refs.floating.current)==null?void 0:u.style)!=null?d:{},{width:`${i.reference.width}px`})}})]:[]]});return gU({opened:e.opened,position:e.position,positionDependencies:e.positionDependencies,floating:s}),hs(()=>{var i;(i=e.onPositionChange)==null||i.call(e,s.placement)},[s.placement]),hs(()=>{var i,u;e.opened?(u=e.onOpen)==null||u.call(e):(i=e.onClose)==null||i.call(e)},[e.opened]),{floating:s,controlled:typeof e.opened=="boolean",opened:t,onClose:r,onToggle:o}}const gP={context:"Popover component was not found in the tree",children:"Popover.Target component children should be an element or a component that accepts ref. Fragments, strings, numbers and other primitive values are not supported"},[bU,vP]=aF(gP.context);var xU=Object.defineProperty,wU=Object.defineProperties,SU=Object.getOwnPropertyDescriptors,wp=Object.getOwnPropertySymbols,yP=Object.prototype.hasOwnProperty,bP=Object.prototype.propertyIsEnumerable,bS=(e,t,n)=>t in e?xU(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,rf=(e,t)=>{for(var n in t||(t={}))yP.call(t,n)&&bS(e,n,t[n]);if(wp)for(var n of wp(t))bP.call(t,n)&&bS(e,n,t[n]);return e},CU=(e,t)=>wU(e,SU(t)),_U=(e,t)=>{var n={};for(var r in e)yP.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(e!=null&&wp)for(var r of wp(e))t.indexOf(r)<0&&bP.call(e,r)&&(n[r]=e[r]);return n};const kU={refProp:"ref",popupType:"dialog"},xP=f.forwardRef((e,t)=>{const n=mr("PopoverTarget",kU,e),{children:r,refProp:o,popupType:s}=n,i=_U(n,["children","refProp","popupType"]);if(!K_(r))throw new Error(gP.children);const u=i,d=vP(),p=zu(d.reference,r.ref,t),h=d.withRoles?{"aria-haspopup":s,"aria-expanded":d.opened,"aria-controls":d.getDropdownId(),id:d.getTargetId()}:{};return f.cloneElement(r,rf(CU(rf(rf(rf({},u),h),d.targetProps),{className:Q_(d.targetProps.className,u.className,r.props.className),[o]:p}),d.controlled?null:{onClick:d.onToggle}))});xP.displayName="@mantine/core/PopoverTarget";var PU=Zr((e,{radius:t,shadow:n})=>({dropdown:{position:"absolute",backgroundColor:e.white,background:e.colorScheme==="dark"?e.colors.dark[6]:e.white,border:`${$e(1)} solid ${e.colorScheme==="dark"?e.colors.dark[4]:e.colors.gray[2]}`,padding:`${e.spacing.sm} ${e.spacing.md}`,boxShadow:e.shadows[n]||n||"none",borderRadius:e.fn.radius(t),"&:focus":{outline:0}},arrow:{backgroundColor:"inherit",border:`${$e(1)} solid ${e.colorScheme==="dark"?e.colors.dark[4]:e.colors.gray[2]}`,zIndex:1}}));const jU=PU;var IU=Object.defineProperty,xS=Object.getOwnPropertySymbols,EU=Object.prototype.hasOwnProperty,OU=Object.prototype.propertyIsEnumerable,wS=(e,t,n)=>t in e?IU(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,dl=(e,t)=>{for(var n in t||(t={}))EU.call(t,n)&&wS(e,n,t[n]);if(xS)for(var n of xS(t))OU.call(t,n)&&wS(e,n,t[n]);return e};const SS={entering:"in",entered:"in",exiting:"out",exited:"out","pre-exiting":"out","pre-entering":"out"};function MU({transition:e,state:t,duration:n,timingFunction:r}){const o={transitionDuration:`${n}ms`,transitionTimingFunction:r};return typeof e=="string"?e in Yd?dl(dl(dl({transitionProperty:Yd[e].transitionProperty},o),Yd[e].common),Yd[e][SS[t]]):null:dl(dl(dl({transitionProperty:e.transitionProperty},o),e.common),e[SS[t]])}function RU({duration:e,exitDuration:t,timingFunction:n,mounted:r,onEnter:o,onExit:s,onEntered:i,onExited:u}){const d=Ca(),p=rk(),h=d.respectReducedMotion?p:!1,[g,v]=f.useState(h?0:e),[b,S]=f.useState(r?"entered":"exited"),w=f.useRef(-1),C=_=>{const k=_?o:s,j=_?i:u;S(_?"pre-entering":"pre-exiting"),window.clearTimeout(w.current);const E=h?0:_?e:t;if(v(E),E===0)typeof k=="function"&&k(),typeof j=="function"&&j(),S(_?"entered":"exited");else{const I=window.setTimeout(()=>{typeof k=="function"&&k(),S(_?"entering":"exiting")},10);w.current=window.setTimeout(()=>{window.clearTimeout(I),typeof j=="function"&&j(),S(_?"entered":"exited")},E)}};return hs(()=>{C(r)},[r]),f.useEffect(()=>()=>window.clearTimeout(w.current),[]),{transitionDuration:g,transitionStatus:b,transitionTimingFunction:n||d.transitionTimingFunction}}function wP({keepMounted:e,transition:t,duration:n=250,exitDuration:r=n,mounted:o,children:s,timingFunction:i,onExit:u,onEntered:d,onEnter:p,onExited:h}){const{transitionDuration:g,transitionStatus:v,transitionTimingFunction:b}=RU({mounted:o,exitDuration:r,duration:n,timingFunction:i,onExit:u,onEntered:d,onEnter:p,onExited:h});return g===0?o?N.createElement(N.Fragment,null,s({})):e?s({display:"none"}):null:v==="exited"?e?s({display:"none"}):null:N.createElement(N.Fragment,null,s(MU({transition:t,duration:g,state:v,timingFunction:b})))}wP.displayName="@mantine/core/Transition";function SP({children:e,active:t=!0,refProp:n="ref"}){const r=BF(t),o=zu(r,e==null?void 0:e.ref);return K_(e)?f.cloneElement(e,{[n]:o}):e}SP.displayName="@mantine/core/FocusTrap";var DU=Object.defineProperty,TU=Object.defineProperties,AU=Object.getOwnPropertyDescriptors,CS=Object.getOwnPropertySymbols,NU=Object.prototype.hasOwnProperty,$U=Object.prototype.propertyIsEnumerable,_S=(e,t,n)=>t in e?DU(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,Aa=(e,t)=>{for(var n in t||(t={}))NU.call(t,n)&&_S(e,n,t[n]);if(CS)for(var n of CS(t))$U.call(t,n)&&_S(e,n,t[n]);return e},of=(e,t)=>TU(e,AU(t));function kS(e,t,n,r){return e==="center"||r==="center"?{top:t}:e==="end"?{bottom:n}:e==="start"?{top:n}:{}}function PS(e,t,n,r,o){return e==="center"||r==="center"?{left:t}:e==="end"?{[o==="ltr"?"right":"left"]:n}:e==="start"?{[o==="ltr"?"left":"right"]:n}:{}}const zU={bottom:"borderTopLeftRadius",left:"borderTopRightRadius",right:"borderBottomLeftRadius",top:"borderBottomRightRadius"};function LU({position:e,arrowSize:t,arrowOffset:n,arrowRadius:r,arrowPosition:o,arrowX:s,arrowY:i,dir:u}){const[d,p="center"]=e.split("-"),h={width:$e(t),height:$e(t),transform:"rotate(45deg)",position:"absolute",[zU[d]]:$e(r)},g=$e(-t/2);return d==="left"?of(Aa(Aa({},h),kS(p,i,n,o)),{right:g,borderLeftColor:"transparent",borderBottomColor:"transparent"}):d==="right"?of(Aa(Aa({},h),kS(p,i,n,o)),{left:g,borderRightColor:"transparent",borderTopColor:"transparent"}):d==="top"?of(Aa(Aa({},h),PS(p,s,n,o,u)),{bottom:g,borderTopColor:"transparent",borderLeftColor:"transparent"}):d==="bottom"?of(Aa(Aa({},h),PS(p,s,n,o,u)),{top:g,borderBottomColor:"transparent",borderRightColor:"transparent"}):{}}var BU=Object.defineProperty,FU=Object.defineProperties,HU=Object.getOwnPropertyDescriptors,Sp=Object.getOwnPropertySymbols,CP=Object.prototype.hasOwnProperty,_P=Object.prototype.propertyIsEnumerable,jS=(e,t,n)=>t in e?BU(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,WU=(e,t)=>{for(var n in t||(t={}))CP.call(t,n)&&jS(e,n,t[n]);if(Sp)for(var n of Sp(t))_P.call(t,n)&&jS(e,n,t[n]);return e},VU=(e,t)=>FU(e,HU(t)),UU=(e,t)=>{var n={};for(var r in e)CP.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(e!=null&&Sp)for(var r of Sp(e))t.indexOf(r)<0&&_P.call(e,r)&&(n[r]=e[r]);return n};const kP=f.forwardRef((e,t)=>{var n=e,{position:r,arrowSize:o,arrowOffset:s,arrowRadius:i,arrowPosition:u,visible:d,arrowX:p,arrowY:h}=n,g=UU(n,["position","arrowSize","arrowOffset","arrowRadius","arrowPosition","visible","arrowX","arrowY"]);const v=Ca();return d?N.createElement("div",VU(WU({},g),{ref:t,style:LU({position:r,arrowSize:o,arrowOffset:s,arrowRadius:i,arrowPosition:u,dir:v.dir,arrowX:p,arrowY:h})})):null});kP.displayName="@mantine/core/FloatingArrow";var GU=Object.defineProperty,qU=Object.defineProperties,KU=Object.getOwnPropertyDescriptors,Cp=Object.getOwnPropertySymbols,PP=Object.prototype.hasOwnProperty,jP=Object.prototype.propertyIsEnumerable,IS=(e,t,n)=>t in e?GU(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,fl=(e,t)=>{for(var n in t||(t={}))PP.call(t,n)&&IS(e,n,t[n]);if(Cp)for(var n of Cp(t))jP.call(t,n)&&IS(e,n,t[n]);return e},sf=(e,t)=>qU(e,KU(t)),YU=(e,t)=>{var n={};for(var r in e)PP.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(e!=null&&Cp)for(var r of Cp(e))t.indexOf(r)<0&&jP.call(e,r)&&(n[r]=e[r]);return n};const QU={};function IP(e){var t;const n=mr("PopoverDropdown",QU,e),{style:r,className:o,children:s,onKeyDownCapture:i}=n,u=YU(n,["style","className","children","onKeyDownCapture"]),d=vP(),{classes:p,cx:h}=jU({radius:d.radius,shadow:d.shadow},{name:d.__staticSelector,classNames:d.classNames,styles:d.styles,unstyled:d.unstyled,variant:d.variant}),g=DF({opened:d.opened,shouldReturnFocus:d.returnFocus}),v=d.withRoles?{"aria-labelledby":d.getTargetId(),id:d.getDropdownId(),role:"dialog"}:{};return d.disabled?null:N.createElement(Ik,sf(fl({},d.portalProps),{withinPortal:d.withinPortal}),N.createElement(wP,sf(fl({mounted:d.opened},d.transitionProps),{transition:d.transitionProps.transition||"fade",duration:(t=d.transitionProps.duration)!=null?t:150,keepMounted:d.keepMounted,exitDuration:typeof d.transitionProps.exitDuration=="number"?d.transitionProps.exitDuration:d.transitionProps.duration}),b=>{var S,w;return N.createElement(SP,{active:d.trapFocus},N.createElement(bo,fl(sf(fl({},v),{tabIndex:-1,ref:d.floating,style:sf(fl(fl({},r),b),{zIndex:d.zIndex,top:(S=d.y)!=null?S:0,left:(w=d.x)!=null?w:0,width:d.width==="target"?void 0:$e(d.width)}),className:h(p.dropdown,o),onKeyDownCapture:lF(d.onClose,{active:d.closeOnEscape,onTrigger:g,onKeyDown:i}),"data-position":d.placement}),u),s,N.createElement(kP,{ref:d.arrowRef,arrowX:d.arrowX,arrowY:d.arrowY,visible:d.withArrow,position:d.placement,arrowSize:d.arrowSize,arrowRadius:d.arrowRadius,arrowOffset:d.arrowOffset,arrowPosition:d.arrowPosition,className:p.arrow})))}))}IP.displayName="@mantine/core/PopoverDropdown";function XU(e,t){if(e==="rtl"&&(t.includes("right")||t.includes("left"))){const[n,r]=t.split("-"),o=n==="right"?"left":"right";return r===void 0?o:`${o}-${r}`}return t}var ES=Object.getOwnPropertySymbols,JU=Object.prototype.hasOwnProperty,ZU=Object.prototype.propertyIsEnumerable,eG=(e,t)=>{var n={};for(var r in e)JU.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(e!=null&&ES)for(var r of ES(e))t.indexOf(r)<0&&ZU.call(e,r)&&(n[r]=e[r]);return n};const tG={position:"bottom",offset:8,positionDependencies:[],transitionProps:{transition:"fade",duration:150},middlewares:{flip:!0,shift:!0,inline:!1},arrowSize:7,arrowOffset:5,arrowRadius:0,arrowPosition:"side",closeOnClickOutside:!0,withinPortal:!1,closeOnEscape:!0,trapFocus:!1,withRoles:!0,returnFocus:!1,clickOutsideEvents:["mousedown","touchstart"],zIndex:w1("popover"),__staticSelector:"Popover",width:"max-content"};function ic(e){var t,n,r,o,s,i;const u=f.useRef(null),d=mr("Popover",tG,e),{children:p,position:h,offset:g,onPositionChange:v,positionDependencies:b,opened:S,transitionProps:w,width:C,middlewares:_,withArrow:k,arrowSize:j,arrowOffset:E,arrowRadius:I,arrowPosition:O,unstyled:M,classNames:T,styles:A,closeOnClickOutside:z,withinPortal:$,portalProps:ee,closeOnEscape:B,clickOutsideEvents:H,trapFocus:G,onClose:K,onOpen:R,onChange:U,zIndex:V,radius:J,shadow:ie,id:xe,defaultOpened:he,__staticSelector:ae,withRoles:Z,disabled:W,returnFocus:re,variant:pe,keepMounted:ne}=d,ge=eG(d,["children","position","offset","onPositionChange","positionDependencies","opened","transitionProps","width","middlewares","withArrow","arrowSize","arrowOffset","arrowRadius","arrowPosition","unstyled","classNames","styles","closeOnClickOutside","withinPortal","portalProps","closeOnEscape","clickOutsideEvents","trapFocus","onClose","onOpen","onChange","zIndex","radius","shadow","id","defaultOpened","__staticSelector","withRoles","disabled","returnFocus","variant","keepMounted"]),[ue,Ce]=f.useState(null),[Re,me]=f.useState(null),_e=C1(xe),We=Ca(),Le=yU({middlewares:_,width:C,position:XU(We.dir,h),offset:typeof g=="number"?g+(k?j/2:0):g,arrowRef:u,arrowOffset:E,onPositionChange:v,positionDependencies:b,opened:S,defaultOpened:he,onChange:U,onOpen:R,onClose:K});EF(()=>Le.opened&&z&&Le.onClose(),H,[ue,Re]);const Ue=f.useCallback(gt=>{Ce(gt),Le.floating.reference(gt)},[Le.floating.reference]),kt=f.useCallback(gt=>{me(gt),Le.floating.floating(gt)},[Le.floating.floating]);return N.createElement(bU,{value:{returnFocus:re,disabled:W,controlled:Le.controlled,reference:Ue,floating:kt,x:Le.floating.x,y:Le.floating.y,arrowX:(r=(n=(t=Le.floating)==null?void 0:t.middlewareData)==null?void 0:n.arrow)==null?void 0:r.x,arrowY:(i=(s=(o=Le.floating)==null?void 0:o.middlewareData)==null?void 0:s.arrow)==null?void 0:i.y,opened:Le.opened,arrowRef:u,transitionProps:w,width:C,withArrow:k,arrowSize:j,arrowOffset:E,arrowRadius:I,arrowPosition:O,placement:Le.floating.placement,trapFocus:G,withinPortal:$,portalProps:ee,zIndex:V,radius:J,shadow:ie,closeOnEscape:B,onClose:Le.onClose,onToggle:Le.onToggle,getTargetId:()=>`${_e}-target`,getDropdownId:()=>`${_e}-dropdown`,withRoles:Z,targetProps:ge,__staticSelector:ae,classNames:T,styles:A,unstyled:M,variant:pe,keepMounted:ne}},p)}ic.Target=xP;ic.Dropdown=IP;ic.displayName="@mantine/core/Popover";var nG=Object.defineProperty,_p=Object.getOwnPropertySymbols,EP=Object.prototype.hasOwnProperty,OP=Object.prototype.propertyIsEnumerable,OS=(e,t,n)=>t in e?nG(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,rG=(e,t)=>{for(var n in t||(t={}))EP.call(t,n)&&OS(e,n,t[n]);if(_p)for(var n of _p(t))OP.call(t,n)&&OS(e,n,t[n]);return e},oG=(e,t)=>{var n={};for(var r in e)EP.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(e!=null&&_p)for(var r of _p(e))t.indexOf(r)<0&&OP.call(e,r)&&(n[r]=e[r]);return n};function sG(e){var t=e,{children:n,component:r="div",maxHeight:o=220,direction:s="column",id:i,innerRef:u,__staticSelector:d,styles:p,classNames:h,unstyled:g}=t,v=oG(t,["children","component","maxHeight","direction","id","innerRef","__staticSelector","styles","classNames","unstyled"]);const{classes:b}=BV(null,{name:d,styles:p,classNames:h,unstyled:g});return N.createElement(ic.Dropdown,rG({p:0,onMouseDown:S=>S.preventDefault()},v),N.createElement("div",{style:{maxHeight:$e(o),display:"flex"}},N.createElement(bo,{component:r||"div",id:`${i}-items`,"aria-labelledby":`${i}-label`,role:"listbox",onMouseDown:S=>S.preventDefault(),style:{flex:1,overflowY:r!==Ih?"auto":void 0},"data-combobox-popover":!0,tabIndex:-1,ref:u},N.createElement("div",{className:b.itemsWrapper,style:{flexDirection:s}},n))))}function Qa({opened:e,transitionProps:t={transition:"fade",duration:0},shadow:n,withinPortal:r,portalProps:o,children:s,__staticSelector:i,onDirectionChange:u,switchDirectionOnFlip:d,zIndex:p,dropdownPosition:h,positionDependencies:g=[],classNames:v,styles:b,unstyled:S,readOnly:w,variant:C}){return N.createElement(ic,{unstyled:S,classNames:v,styles:b,width:"target",withRoles:!1,opened:e,middlewares:{flip:h==="flip",shift:!1},position:h==="flip"?"bottom":h,positionDependencies:g,zIndex:p,__staticSelector:i,withinPortal:r,portalProps:o,transitionProps:t,shadow:n,disabled:w,onPositionChange:_=>d&&(u==null?void 0:u(_==="top"?"column-reverse":"column")),variant:C},s)}Qa.Target=ic.Target;Qa.Dropdown=sG;var aG=Object.defineProperty,iG=Object.defineProperties,lG=Object.getOwnPropertyDescriptors,kp=Object.getOwnPropertySymbols,MP=Object.prototype.hasOwnProperty,RP=Object.prototype.propertyIsEnumerable,MS=(e,t,n)=>t in e?aG(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,af=(e,t)=>{for(var n in t||(t={}))MP.call(t,n)&&MS(e,n,t[n]);if(kp)for(var n of kp(t))RP.call(t,n)&&MS(e,n,t[n]);return e},cG=(e,t)=>iG(e,lG(t)),uG=(e,t)=>{var n={};for(var r in e)MP.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(e!=null&&kp)for(var r of kp(e))t.indexOf(r)<0&&RP.call(e,r)&&(n[r]=e[r]);return n};function DP(e,t,n){const r=mr(e,t,n),{label:o,description:s,error:i,required:u,classNames:d,styles:p,className:h,unstyled:g,__staticSelector:v,sx:b,errorProps:S,labelProps:w,descriptionProps:C,wrapperProps:_,id:k,size:j,style:E,inputContainer:I,inputWrapperOrder:O,withAsterisk:M,variant:T}=r,A=uG(r,["label","description","error","required","classNames","styles","className","unstyled","__staticSelector","sx","errorProps","labelProps","descriptionProps","wrapperProps","id","size","style","inputContainer","inputWrapperOrder","withAsterisk","variant"]),z=C1(k),{systemStyles:$,rest:ee}=_h(A),B=af({label:o,description:s,error:i,required:u,classNames:d,className:h,__staticSelector:v,sx:b,errorProps:S,labelProps:w,descriptionProps:C,unstyled:g,styles:p,id:z,size:j,style:E,inputContainer:I,inputWrapperOrder:O,withAsterisk:M,variant:T},_);return cG(af({},ee),{classNames:d,styles:p,unstyled:g,wrapperProps:af(af({},B),$),inputProps:{required:u,classNames:d,styles:p,unstyled:g,id:z,size:j,__staticSelector:v,error:i,variant:T}})}var dG=Zr((e,t,{size:n})=>({label:{display:"inline-block",fontSize:At({size:n,sizes:e.fontSizes}),fontWeight:500,color:e.colorScheme==="dark"?e.colors.dark[0]:e.colors.gray[9],wordBreak:"break-word",cursor:"default",WebkitTapHighlightColor:"transparent"},required:{color:e.fn.variant({variant:"filled",color:"red"}).background}}));const fG=dG;var pG=Object.defineProperty,Pp=Object.getOwnPropertySymbols,TP=Object.prototype.hasOwnProperty,AP=Object.prototype.propertyIsEnumerable,RS=(e,t,n)=>t in e?pG(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,hG=(e,t)=>{for(var n in t||(t={}))TP.call(t,n)&&RS(e,n,t[n]);if(Pp)for(var n of Pp(t))AP.call(t,n)&&RS(e,n,t[n]);return e},mG=(e,t)=>{var n={};for(var r in e)TP.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(e!=null&&Pp)for(var r of Pp(e))t.indexOf(r)<0&&AP.call(e,r)&&(n[r]=e[r]);return n};const gG={labelElement:"label",size:"sm"},R1=f.forwardRef((e,t)=>{const n=mr("InputLabel",gG,e),{labelElement:r,children:o,required:s,size:i,classNames:u,styles:d,unstyled:p,className:h,htmlFor:g,__staticSelector:v,variant:b,onMouseDown:S}=n,w=mG(n,["labelElement","children","required","size","classNames","styles","unstyled","className","htmlFor","__staticSelector","variant","onMouseDown"]),{classes:C,cx:_}=fG(null,{name:["InputWrapper",v],classNames:u,styles:d,unstyled:p,variant:b,size:i});return N.createElement(bo,hG({component:r,ref:t,className:_(C.label,h),htmlFor:r==="label"?g:void 0,onMouseDown:k=>{S==null||S(k),!k.defaultPrevented&&k.detail>1&&k.preventDefault()}},w),o,s&&N.createElement("span",{className:C.required,"aria-hidden":!0}," *"))});R1.displayName="@mantine/core/InputLabel";var vG=Zr((e,t,{size:n})=>({error:{wordBreak:"break-word",color:e.fn.variant({variant:"filled",color:"red"}).background,fontSize:`calc(${At({size:n,sizes:e.fontSizes})} - ${$e(2)})`,lineHeight:1.2,display:"block"}}));const yG=vG;var bG=Object.defineProperty,jp=Object.getOwnPropertySymbols,NP=Object.prototype.hasOwnProperty,$P=Object.prototype.propertyIsEnumerable,DS=(e,t,n)=>t in e?bG(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,xG=(e,t)=>{for(var n in t||(t={}))NP.call(t,n)&&DS(e,n,t[n]);if(jp)for(var n of jp(t))$P.call(t,n)&&DS(e,n,t[n]);return e},wG=(e,t)=>{var n={};for(var r in e)NP.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(e!=null&&jp)for(var r of jp(e))t.indexOf(r)<0&&$P.call(e,r)&&(n[r]=e[r]);return n};const SG={size:"sm"},D1=f.forwardRef((e,t)=>{const n=mr("InputError",SG,e),{children:r,className:o,classNames:s,styles:i,unstyled:u,size:d,__staticSelector:p,variant:h}=n,g=wG(n,["children","className","classNames","styles","unstyled","size","__staticSelector","variant"]),{classes:v,cx:b}=yG(null,{name:["InputWrapper",p],classNames:s,styles:i,unstyled:u,variant:h,size:d});return N.createElement(Nl,xG({className:b(v.error,o),ref:t},g),r)});D1.displayName="@mantine/core/InputError";var CG=Zr((e,t,{size:n})=>({description:{wordBreak:"break-word",color:e.colorScheme==="dark"?e.colors.dark[2]:e.colors.gray[6],fontSize:`calc(${At({size:n,sizes:e.fontSizes})} - ${$e(2)})`,lineHeight:1.2,display:"block"}}));const _G=CG;var kG=Object.defineProperty,Ip=Object.getOwnPropertySymbols,zP=Object.prototype.hasOwnProperty,LP=Object.prototype.propertyIsEnumerable,TS=(e,t,n)=>t in e?kG(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,PG=(e,t)=>{for(var n in t||(t={}))zP.call(t,n)&&TS(e,n,t[n]);if(Ip)for(var n of Ip(t))LP.call(t,n)&&TS(e,n,t[n]);return e},jG=(e,t)=>{var n={};for(var r in e)zP.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(e!=null&&Ip)for(var r of Ip(e))t.indexOf(r)<0&&LP.call(e,r)&&(n[r]=e[r]);return n};const IG={size:"sm"},T1=f.forwardRef((e,t)=>{const n=mr("InputDescription",IG,e),{children:r,className:o,classNames:s,styles:i,unstyled:u,size:d,__staticSelector:p,variant:h}=n,g=jG(n,["children","className","classNames","styles","unstyled","size","__staticSelector","variant"]),{classes:v,cx:b}=_G(null,{name:["InputWrapper",p],classNames:s,styles:i,unstyled:u,variant:h,size:d});return N.createElement(Nl,PG({color:"dimmed",className:b(v.description,o),ref:t,unstyled:u},g),r)});T1.displayName="@mantine/core/InputDescription";const BP=f.createContext({offsetBottom:!1,offsetTop:!1,describedBy:void 0}),EG=BP.Provider,OG=()=>f.useContext(BP);function MG(e,{hasDescription:t,hasError:n}){const r=e.findIndex(d=>d==="input"),o=e[r-1],s=e[r+1];return{offsetBottom:t&&s==="description"||n&&s==="error",offsetTop:t&&o==="description"||n&&o==="error"}}var RG=Object.defineProperty,DG=Object.defineProperties,TG=Object.getOwnPropertyDescriptors,AS=Object.getOwnPropertySymbols,AG=Object.prototype.hasOwnProperty,NG=Object.prototype.propertyIsEnumerable,NS=(e,t,n)=>t in e?RG(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,$G=(e,t)=>{for(var n in t||(t={}))AG.call(t,n)&&NS(e,n,t[n]);if(AS)for(var n of AS(t))NG.call(t,n)&&NS(e,n,t[n]);return e},zG=(e,t)=>DG(e,TG(t)),LG=Zr(e=>({root:zG($G({},e.fn.fontStyles()),{lineHeight:e.lineHeight})}));const BG=LG;var FG=Object.defineProperty,HG=Object.defineProperties,WG=Object.getOwnPropertyDescriptors,Ep=Object.getOwnPropertySymbols,FP=Object.prototype.hasOwnProperty,HP=Object.prototype.propertyIsEnumerable,$S=(e,t,n)=>t in e?FG(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,Na=(e,t)=>{for(var n in t||(t={}))FP.call(t,n)&&$S(e,n,t[n]);if(Ep)for(var n of Ep(t))HP.call(t,n)&&$S(e,n,t[n]);return e},zS=(e,t)=>HG(e,WG(t)),VG=(e,t)=>{var n={};for(var r in e)FP.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(e!=null&&Ep)for(var r of Ep(e))t.indexOf(r)<0&&HP.call(e,r)&&(n[r]=e[r]);return n};const UG={labelElement:"label",size:"sm",inputContainer:e=>e,inputWrapperOrder:["label","description","input","error"]},WP=f.forwardRef((e,t)=>{const n=mr("InputWrapper",UG,e),{className:r,label:o,children:s,required:i,id:u,error:d,description:p,labelElement:h,labelProps:g,descriptionProps:v,errorProps:b,classNames:S,styles:w,size:C,inputContainer:_,__staticSelector:k,unstyled:j,inputWrapperOrder:E,withAsterisk:I,variant:O}=n,M=VG(n,["className","label","children","required","id","error","description","labelElement","labelProps","descriptionProps","errorProps","classNames","styles","size","inputContainer","__staticSelector","unstyled","inputWrapperOrder","withAsterisk","variant"]),{classes:T,cx:A}=BG(null,{classNames:S,styles:w,name:["InputWrapper",k],unstyled:j,variant:O,size:C}),z={classNames:S,styles:w,unstyled:j,size:C,variant:O,__staticSelector:k},$=typeof I=="boolean"?I:i,ee=u?`${u}-error`:b==null?void 0:b.id,B=u?`${u}-description`:v==null?void 0:v.id,G=`${!!d&&typeof d!="boolean"?ee:""} ${p?B:""}`,K=G.trim().length>0?G.trim():void 0,R=o&&N.createElement(R1,Na(Na({key:"label",labelElement:h,id:u?`${u}-label`:void 0,htmlFor:u,required:$},z),g),o),U=p&&N.createElement(T1,zS(Na(Na({key:"description"},v),z),{size:(v==null?void 0:v.size)||z.size,id:(v==null?void 0:v.id)||B}),p),V=N.createElement(f.Fragment,{key:"input"},_(s)),J=typeof d!="boolean"&&d&&N.createElement(D1,zS(Na(Na({},b),z),{size:(b==null?void 0:b.size)||z.size,key:"error",id:(b==null?void 0:b.id)||ee}),d),ie=E.map(xe=>{switch(xe){case"label":return R;case"input":return V;case"description":return U;case"error":return J;default:return null}});return N.createElement(EG,{value:Na({describedBy:K},MG(E,{hasDescription:!!U,hasError:!!J}))},N.createElement(bo,Na({className:A(T.root,r),ref:t},M),ie))});WP.displayName="@mantine/core/InputWrapper";var GG=Object.defineProperty,Op=Object.getOwnPropertySymbols,VP=Object.prototype.hasOwnProperty,UP=Object.prototype.propertyIsEnumerable,LS=(e,t,n)=>t in e?GG(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,qG=(e,t)=>{for(var n in t||(t={}))VP.call(t,n)&&LS(e,n,t[n]);if(Op)for(var n of Op(t))UP.call(t,n)&&LS(e,n,t[n]);return e},KG=(e,t)=>{var n={};for(var r in e)VP.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(e!=null&&Op)for(var r of Op(e))t.indexOf(r)<0&&UP.call(e,r)&&(n[r]=e[r]);return n};const YG={},GP=f.forwardRef((e,t)=>{const n=mr("InputPlaceholder",YG,e),{sx:r}=n,o=KG(n,["sx"]);return N.createElement(bo,qG({component:"span",sx:[s=>s.fn.placeholderStyles(),...G_(r)],ref:t},o))});GP.displayName="@mantine/core/InputPlaceholder";var QG=Object.defineProperty,XG=Object.defineProperties,JG=Object.getOwnPropertyDescriptors,BS=Object.getOwnPropertySymbols,ZG=Object.prototype.hasOwnProperty,eq=Object.prototype.propertyIsEnumerable,FS=(e,t,n)=>t in e?QG(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,lf=(e,t)=>{for(var n in t||(t={}))ZG.call(t,n)&&FS(e,n,t[n]);if(BS)for(var n of BS(t))eq.call(t,n)&&FS(e,n,t[n]);return e},Eg=(e,t)=>XG(e,JG(t));const Ho={xs:$e(30),sm:$e(36),md:$e(42),lg:$e(50),xl:$e(60)},tq=["default","filled","unstyled"];function nq({theme:e,variant:t}){return tq.includes(t)?t==="default"?{border:`${$e(1)} solid ${e.colorScheme==="dark"?e.colors.dark[4]:e.colors.gray[4]}`,backgroundColor:e.colorScheme==="dark"?e.colors.dark[6]:e.white,transition:"border-color 100ms ease","&:focus, &:focus-within":e.focusRingStyles.inputStyles(e)}:t==="filled"?{border:`${$e(1)} solid transparent`,backgroundColor:e.colorScheme==="dark"?e.colors.dark[5]:e.colors.gray[1],"&:focus, &:focus-within":e.focusRingStyles.inputStyles(e)}:{borderWidth:0,color:e.colorScheme==="dark"?e.colors.dark[0]:e.black,backgroundColor:"transparent",minHeight:$e(28),outline:0,"&:focus, &:focus-within":{outline:"none",borderColor:"transparent"},"&:disabled":{backgroundColor:"transparent","&:focus, &:focus-within":{outline:"none",borderColor:"transparent"}}}:null}var rq=Zr((e,{multiline:t,radius:n,invalid:r,rightSectionWidth:o,withRightSection:s,iconWidth:i,offsetBottom:u,offsetTop:d,pointer:p},{variant:h,size:g})=>{const v=e.fn.variant({variant:"filled",color:"red"}).background,b=h==="default"||h==="filled"?{minHeight:At({size:g,sizes:Ho}),paddingLeft:`calc(${At({size:g,sizes:Ho})} / 3)`,paddingRight:s?o||At({size:g,sizes:Ho}):`calc(${At({size:g,sizes:Ho})} / 3)`,borderRadius:e.fn.radius(n)}:h==="unstyled"&&s?{paddingRight:o||At({size:g,sizes:Ho})}:null;return{wrapper:{position:"relative",marginTop:d?`calc(${e.spacing.xs} / 2)`:void 0,marginBottom:u?`calc(${e.spacing.xs} / 2)`:void 0,"&:has(input:disabled)":{"& .mantine-Input-rightSection":{display:"none"}}},input:Eg(lf(lf(Eg(lf({},e.fn.fontStyles()),{height:t?h==="unstyled"?void 0:"auto":At({size:g,sizes:Ho}),WebkitTapHighlightColor:"transparent",lineHeight:t?e.lineHeight:`calc(${At({size:g,sizes:Ho})} - ${$e(2)})`,appearance:"none",resize:"none",boxSizing:"border-box",fontSize:At({size:g,sizes:e.fontSizes}),width:"100%",color:e.colorScheme==="dark"?e.colors.dark[0]:e.black,display:"block",textAlign:"left",cursor:p?"pointer":void 0}),nq({theme:e,variant:h})),b),{"&:disabled, &[data-disabled]":{backgroundColor:e.colorScheme==="dark"?e.colors.dark[6]:e.colors.gray[1],color:e.colors.dark[2],opacity:.6,cursor:"not-allowed",pointerEvents:"none","&::placeholder":{color:e.colors.dark[2]}},"&[data-invalid]":{color:v,borderColor:v,"&::placeholder":{opacity:1,color:v}},"&[data-with-icon]":{paddingLeft:typeof i=="number"?$e(i):At({size:g,sizes:Ho})},"&::placeholder":Eg(lf({},e.fn.placeholderStyles()),{opacity:1}),"&::-webkit-inner-spin-button, &::-webkit-outer-spin-button, &::-webkit-search-decoration, &::-webkit-search-cancel-button, &::-webkit-search-results-button, &::-webkit-search-results-decoration":{appearance:"none"},"&[type=number]":{MozAppearance:"textfield"}}),icon:{pointerEvents:"none",position:"absolute",zIndex:1,left:0,top:0,bottom:0,display:"flex",alignItems:"center",justifyContent:"center",width:i?$e(i):At({size:g,sizes:Ho}),color:r?e.colors.red[e.colorScheme==="dark"?6:7]:e.colorScheme==="dark"?e.colors.dark[2]:e.colors.gray[5]},rightSection:{position:"absolute",top:0,bottom:0,right:0,display:"flex",alignItems:"center",justifyContent:"center",width:o||At({size:g,sizes:Ho})}}});const oq=rq;var sq=Object.defineProperty,aq=Object.defineProperties,iq=Object.getOwnPropertyDescriptors,Mp=Object.getOwnPropertySymbols,qP=Object.prototype.hasOwnProperty,KP=Object.prototype.propertyIsEnumerable,HS=(e,t,n)=>t in e?sq(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,cf=(e,t)=>{for(var n in t||(t={}))qP.call(t,n)&&HS(e,n,t[n]);if(Mp)for(var n of Mp(t))KP.call(t,n)&&HS(e,n,t[n]);return e},WS=(e,t)=>aq(e,iq(t)),lq=(e,t)=>{var n={};for(var r in e)qP.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(e!=null&&Mp)for(var r of Mp(e))t.indexOf(r)<0&&KP.call(e,r)&&(n[r]=e[r]);return n};const cq={size:"sm",variant:"default"},Hi=f.forwardRef((e,t)=>{const n=mr("Input",cq,e),{className:r,error:o,required:s,disabled:i,variant:u,icon:d,style:p,rightSectionWidth:h,iconWidth:g,rightSection:v,rightSectionProps:b,radius:S,size:w,wrapperProps:C,classNames:_,styles:k,__staticSelector:j,multiline:E,sx:I,unstyled:O,pointer:M}=n,T=lq(n,["className","error","required","disabled","variant","icon","style","rightSectionWidth","iconWidth","rightSection","rightSectionProps","radius","size","wrapperProps","classNames","styles","__staticSelector","multiline","sx","unstyled","pointer"]),{offsetBottom:A,offsetTop:z,describedBy:$}=OG(),{classes:ee,cx:B}=oq({radius:S,multiline:E,invalid:!!o,rightSectionWidth:h?$e(h):void 0,iconWidth:g,withRightSection:!!v,offsetBottom:A,offsetTop:z,pointer:M},{classNames:_,styles:k,name:["Input",j],unstyled:O,variant:u,size:w}),{systemStyles:H,rest:G}=_h(T);return N.createElement(bo,cf(cf({className:B(ee.wrapper,r),sx:I,style:p},H),C),d&&N.createElement("div",{className:ee.icon},d),N.createElement(bo,WS(cf({component:"input"},G),{ref:t,required:s,"aria-invalid":!!o,"aria-describedby":$,disabled:i,"data-disabled":i||void 0,"data-with-icon":!!d||void 0,"data-invalid":!!o||void 0,className:ee.input})),v&&N.createElement("div",WS(cf({},b),{className:ee.rightSection}),v))});Hi.displayName="@mantine/core/Input";Hi.Wrapper=WP;Hi.Label=R1;Hi.Description=T1;Hi.Error=D1;Hi.Placeholder=GP;const Bl=Hi;var uq=Object.defineProperty,Rp=Object.getOwnPropertySymbols,YP=Object.prototype.hasOwnProperty,QP=Object.prototype.propertyIsEnumerable,VS=(e,t,n)=>t in e?uq(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,US=(e,t)=>{for(var n in t||(t={}))YP.call(t,n)&&VS(e,n,t[n]);if(Rp)for(var n of Rp(t))QP.call(t,n)&&VS(e,n,t[n]);return e},dq=(e,t)=>{var n={};for(var r in e)YP.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(e!=null&&Rp)for(var r of Rp(e))t.indexOf(r)<0&&QP.call(e,r)&&(n[r]=e[r]);return n};const fq={multiple:!1},XP=f.forwardRef((e,t)=>{const n=mr("FileButton",fq,e),{onChange:r,children:o,multiple:s,accept:i,name:u,form:d,resetRef:p,disabled:h,capture:g,inputProps:v}=n,b=dq(n,["onChange","children","multiple","accept","name","form","resetRef","disabled","capture","inputProps"]),S=f.useRef(),w=()=>{!h&&S.current.click()},C=k=>{r(s?Array.from(k.currentTarget.files):k.currentTarget.files[0]||null)};return nk(p,()=>{S.current.value=""}),N.createElement(N.Fragment,null,o(US({onClick:w},b)),N.createElement("input",US({style:{display:"none"},type:"file",accept:i,multiple:s,onChange:C,ref:zu(t,S),name:u,form:d,capture:g},v)))});XP.displayName="@mantine/core/FileButton";const JP={xs:$e(16),sm:$e(22),md:$e(26),lg:$e(30),xl:$e(36)},pq={xs:$e(10),sm:$e(12),md:$e(14),lg:$e(16),xl:$e(18)};var hq=Zr((e,{disabled:t,radius:n,readOnly:r},{size:o,variant:s})=>({defaultValue:{display:"flex",alignItems:"center",backgroundColor:t?e.colorScheme==="dark"?e.colors.dark[5]:e.colors.gray[3]:e.colorScheme==="dark"?e.colors.dark[7]:s==="filled"?e.white:e.colors.gray[1],color:t?e.colorScheme==="dark"?e.colors.dark[1]:e.colors.gray[7]:e.colorScheme==="dark"?e.colors.dark[0]:e.colors.gray[7],height:At({size:o,sizes:JP}),paddingLeft:`calc(${At({size:o,sizes:e.spacing})} / 1.5)`,paddingRight:t||r?At({size:o,sizes:e.spacing}):0,fontWeight:500,fontSize:At({size:o,sizes:pq}),borderRadius:At({size:n,sizes:e.radius}),cursor:t?"not-allowed":"default",userSelect:"none",maxWidth:`calc(100% - ${$e(10)})`},defaultValueRemove:{color:e.colorScheme==="dark"?e.colors.dark[0]:e.colors.gray[7],marginLeft:`calc(${At({size:o,sizes:e.spacing})} / 6)`},defaultValueLabel:{display:"block",overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"}}));const mq=hq;var gq=Object.defineProperty,Dp=Object.getOwnPropertySymbols,ZP=Object.prototype.hasOwnProperty,ej=Object.prototype.propertyIsEnumerable,GS=(e,t,n)=>t in e?gq(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,vq=(e,t)=>{for(var n in t||(t={}))ZP.call(t,n)&&GS(e,n,t[n]);if(Dp)for(var n of Dp(t))ej.call(t,n)&&GS(e,n,t[n]);return e},yq=(e,t)=>{var n={};for(var r in e)ZP.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(e!=null&&Dp)for(var r of Dp(e))t.indexOf(r)<0&&ej.call(e,r)&&(n[r]=e[r]);return n};const bq={xs:16,sm:22,md:24,lg:26,xl:30};function tj(e){var t=e,{label:n,classNames:r,styles:o,className:s,onRemove:i,disabled:u,readOnly:d,size:p,radius:h="sm",variant:g,unstyled:v}=t,b=yq(t,["label","classNames","styles","className","onRemove","disabled","readOnly","size","radius","variant","unstyled"]);const{classes:S,cx:w}=mq({disabled:u,readOnly:d,radius:h},{name:"MultiSelect",classNames:r,styles:o,unstyled:v,size:p,variant:g});return N.createElement("div",vq({className:w(S.defaultValue,s)},b),N.createElement("span",{className:S.defaultValueLabel},n),!u&&!d&&N.createElement(Ak,{"aria-hidden":!0,onMouseDown:i,size:bq[p],radius:2,color:"blue",variant:"transparent",iconSize:"70%",className:S.defaultValueRemove,tabIndex:-1,unstyled:v}))}tj.displayName="@mantine/core/MultiSelect/DefaultValue";function xq({data:e,searchable:t,limit:n,searchValue:r,filter:o,value:s,disableSelectedItemFiltering:i}){if(!t&&s.length===0)return e;if(!t){const d=[];for(let p=0;ph===e[p].value&&!e[p].disabled))&&d.push(e[p]);return d}const u=[];for(let d=0;dp===e[d].value&&!e[d].disabled),e[d])&&u.push(e[d]),!(u.length>=n));d+=1);return u}var wq=Object.defineProperty,Tp=Object.getOwnPropertySymbols,nj=Object.prototype.hasOwnProperty,rj=Object.prototype.propertyIsEnumerable,qS=(e,t,n)=>t in e?wq(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,KS=(e,t)=>{for(var n in t||(t={}))nj.call(t,n)&&qS(e,n,t[n]);if(Tp)for(var n of Tp(t))rj.call(t,n)&&qS(e,n,t[n]);return e},Sq=(e,t)=>{var n={};for(var r in e)nj.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(e!=null&&Tp)for(var r of Tp(e))t.indexOf(r)<0&&rj.call(e,r)&&(n[r]=e[r]);return n};const Cq={xs:$e(14),sm:$e(18),md:$e(20),lg:$e(24),xl:$e(28)};function _q(e){var t=e,{size:n,error:r,style:o}=t,s=Sq(t,["size","error","style"]);const i=Ca(),u=At({size:n,sizes:Cq});return N.createElement("svg",KS({viewBox:"0 0 15 15",fill:"none",xmlns:"http://www.w3.org/2000/svg",style:KS({color:r?i.colors.red[6]:i.colors.gray[6],width:u,height:u},o),"data-chevron":!0},s),N.createElement("path",{d:"M4.93179 5.43179C4.75605 5.60753 4.75605 5.89245 4.93179 6.06819C5.10753 6.24392 5.39245 6.24392 5.56819 6.06819L7.49999 4.13638L9.43179 6.06819C9.60753 6.24392 9.89245 6.24392 10.0682 6.06819C10.2439 5.89245 10.2439 5.60753 10.0682 5.43179L7.81819 3.18179C7.73379 3.0974 7.61933 3.04999 7.49999 3.04999C7.38064 3.04999 7.26618 3.0974 7.18179 3.18179L4.93179 5.43179ZM10.0682 9.56819C10.2439 9.39245 10.2439 9.10753 10.0682 8.93179C9.89245 8.75606 9.60753 8.75606 9.43179 8.93179L7.49999 10.8636L5.56819 8.93179C5.39245 8.75606 5.10753 8.75606 4.93179 8.93179C4.75605 9.10753 4.75605 9.39245 4.93179 9.56819L7.18179 11.8182C7.35753 11.9939 7.64245 11.9939 7.81819 11.8182L10.0682 9.56819Z",fill:"currentColor",fillRule:"evenodd",clipRule:"evenodd"}))}var kq=Object.defineProperty,Pq=Object.defineProperties,jq=Object.getOwnPropertyDescriptors,YS=Object.getOwnPropertySymbols,Iq=Object.prototype.hasOwnProperty,Eq=Object.prototype.propertyIsEnumerable,QS=(e,t,n)=>t in e?kq(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,Oq=(e,t)=>{for(var n in t||(t={}))Iq.call(t,n)&&QS(e,n,t[n]);if(YS)for(var n of YS(t))Eq.call(t,n)&&QS(e,n,t[n]);return e},Mq=(e,t)=>Pq(e,jq(t));function oj({shouldClear:e,clearButtonProps:t,onClear:n,size:r,error:o}){return e?N.createElement(Ak,Mq(Oq({},t),{variant:"transparent",onClick:n,size:r,onMouseDown:s=>s.preventDefault()})):N.createElement(_q,{error:o,size:r})}oj.displayName="@mantine/core/SelectRightSection";var Rq=Object.defineProperty,Dq=Object.defineProperties,Tq=Object.getOwnPropertyDescriptors,Ap=Object.getOwnPropertySymbols,sj=Object.prototype.hasOwnProperty,aj=Object.prototype.propertyIsEnumerable,XS=(e,t,n)=>t in e?Rq(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,Og=(e,t)=>{for(var n in t||(t={}))sj.call(t,n)&&XS(e,n,t[n]);if(Ap)for(var n of Ap(t))aj.call(t,n)&&XS(e,n,t[n]);return e},JS=(e,t)=>Dq(e,Tq(t)),Aq=(e,t)=>{var n={};for(var r in e)sj.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(e!=null&&Ap)for(var r of Ap(e))t.indexOf(r)<0&&aj.call(e,r)&&(n[r]=e[r]);return n};function ij(e){var t=e,{styles:n,rightSection:r,rightSectionWidth:o,theme:s}=t,i=Aq(t,["styles","rightSection","rightSectionWidth","theme"]);if(r)return{rightSection:r,rightSectionWidth:o,styles:n};const u=typeof n=="function"?n(s):n;return{rightSection:!i.readOnly&&!(i.disabled&&i.shouldClear)&&N.createElement(oj,Og({},i)),styles:JS(Og({},u),{rightSection:JS(Og({},u==null?void 0:u.rightSection),{pointerEvents:i.shouldClear?void 0:"none"})})}}var Nq=Object.defineProperty,$q=Object.defineProperties,zq=Object.getOwnPropertyDescriptors,ZS=Object.getOwnPropertySymbols,Lq=Object.prototype.hasOwnProperty,Bq=Object.prototype.propertyIsEnumerable,eC=(e,t,n)=>t in e?Nq(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,Fq=(e,t)=>{for(var n in t||(t={}))Lq.call(t,n)&&eC(e,n,t[n]);if(ZS)for(var n of ZS(t))Bq.call(t,n)&&eC(e,n,t[n]);return e},Hq=(e,t)=>$q(e,zq(t)),Wq=Zr((e,{invalid:t},{size:n})=>({wrapper:{position:"relative","&:has(input:disabled)":{cursor:"not-allowed",pointerEvents:"none","& .mantine-MultiSelect-input":{backgroundColor:e.colorScheme==="dark"?e.colors.dark[6]:e.colors.gray[1],color:e.colors.dark[2],opacity:.6,"&::placeholder":{color:e.colors.dark[2]}},"& .mantine-MultiSelect-defaultValue":{backgroundColor:e.colorScheme==="dark"?e.colors.dark[5]:e.colors.gray[3],color:e.colorScheme==="dark"?e.colors.dark[1]:e.colors.gray[7]}}},values:{minHeight:`calc(${At({size:n,sizes:Ho})} - ${$e(2)})`,display:"flex",alignItems:"center",flexWrap:"wrap",marginLeft:`calc(-${e.spacing.xs} / 2)`,boxSizing:"border-box","&[data-clearable]":{marginRight:At({size:n,sizes:Ho})}},value:{margin:`calc(${e.spacing.xs} / 2 - ${$e(2)}) calc(${e.spacing.xs} / 2)`},searchInput:Hq(Fq({},e.fn.fontStyles()),{flex:1,minWidth:$e(60),backgroundColor:"transparent",border:0,outline:0,fontSize:At({size:n,sizes:e.fontSizes}),padding:0,marginLeft:`calc(${e.spacing.xs} / 2)`,appearance:"none",color:"inherit",maxHeight:At({size:n,sizes:JP}),"&::placeholder":{opacity:1,color:t?e.colors.red[e.fn.primaryShade()]:e.colorScheme==="dark"?e.colors.dark[3]:e.colors.gray[5]},"&:disabled":{cursor:"not-allowed",pointerEvents:"none"}}),searchInputEmpty:{width:"100%"},searchInputInputHidden:{flex:0,width:0,minWidth:0,margin:0,overflow:"hidden"},searchInputPointer:{cursor:"pointer","&:disabled":{cursor:"not-allowed",pointerEvents:"none"}},input:{cursor:"pointer","&:disabled":{cursor:"not-allowed",pointerEvents:"none"}}}));const Vq=Wq;var Uq=Object.defineProperty,Gq=Object.defineProperties,qq=Object.getOwnPropertyDescriptors,Np=Object.getOwnPropertySymbols,lj=Object.prototype.hasOwnProperty,cj=Object.prototype.propertyIsEnumerable,tC=(e,t,n)=>t in e?Uq(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,pl=(e,t)=>{for(var n in t||(t={}))lj.call(t,n)&&tC(e,n,t[n]);if(Np)for(var n of Np(t))cj.call(t,n)&&tC(e,n,t[n]);return e},nC=(e,t)=>Gq(e,qq(t)),Kq=(e,t)=>{var n={};for(var r in e)lj.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(e!=null&&Np)for(var r of Np(e))t.indexOf(r)<0&&cj.call(e,r)&&(n[r]=e[r]);return n};function Yq(e,t,n){return t?!1:n.label.toLowerCase().trim().includes(e.toLowerCase().trim())}function Qq(e,t){return!!e&&!t.some(n=>n.value.toLowerCase()===e.toLowerCase())}function rC(e,t){if(!Array.isArray(e))return;if(t.length===0)return[];const n=t.map(r=>typeof r=="object"?r.value:r);return e.filter(r=>n.includes(r))}const Xq={size:"sm",valueComponent:tj,itemComponent:k1,transitionProps:{transition:"fade",duration:0},maxDropdownHeight:220,shadow:"sm",searchable:!1,filter:Yq,limit:1/0,clearSearchOnChange:!0,clearable:!1,clearSearchOnBlur:!1,disabled:!1,initiallyOpened:!1,creatable:!1,shouldCreate:Qq,switchDirectionOnFlip:!1,zIndex:w1("popover"),selectOnBlur:!1,positionDependencies:[],dropdownPosition:"flip"},uj=f.forwardRef((e,t)=>{const n=mr("MultiSelect",Xq,e),{className:r,style:o,required:s,label:i,description:u,size:d,error:p,classNames:h,styles:g,wrapperProps:v,value:b,defaultValue:S,data:w,onChange:C,valueComponent:_,itemComponent:k,id:j,transitionProps:E,maxDropdownHeight:I,shadow:O,nothingFound:M,onFocus:T,onBlur:A,searchable:z,placeholder:$,filter:ee,limit:B,clearSearchOnChange:H,clearable:G,clearSearchOnBlur:K,variant:R,onSearchChange:U,searchValue:V,disabled:J,initiallyOpened:ie,radius:xe,icon:he,rightSection:ae,rightSectionWidth:Z,creatable:W,getCreateLabel:re,shouldCreate:pe,onCreate:ne,sx:ge,dropdownComponent:ue,onDropdownClose:Ce,onDropdownOpen:Re,maxSelectedValues:me,withinPortal:_e,portalProps:We,switchDirectionOnFlip:Le,zIndex:Ue,selectOnBlur:kt,name:gt,dropdownPosition:Pn,errorProps:Pt,labelProps:yt,descriptionProps:be,form:Te,positionDependencies:It,onKeyDown:Ft,unstyled:Wt,inputContainer:Cn,inputWrapperOrder:En,readOnly:ln,withAsterisk:wr,clearButtonProps:vn,hoverOnSearchChange:sr,disableSelectedItemFiltering:Ee}=n,at=Kq(n,["className","style","required","label","description","size","error","classNames","styles","wrapperProps","value","defaultValue","data","onChange","valueComponent","itemComponent","id","transitionProps","maxDropdownHeight","shadow","nothingFound","onFocus","onBlur","searchable","placeholder","filter","limit","clearSearchOnChange","clearable","clearSearchOnBlur","variant","onSearchChange","searchValue","disabled","initiallyOpened","radius","icon","rightSection","rightSectionWidth","creatable","getCreateLabel","shouldCreate","onCreate","sx","dropdownComponent","onDropdownClose","onDropdownOpen","maxSelectedValues","withinPortal","portalProps","switchDirectionOnFlip","zIndex","selectOnBlur","name","dropdownPosition","errorProps","labelProps","descriptionProps","form","positionDependencies","onKeyDown","unstyled","inputContainer","inputWrapperOrder","readOnly","withAsterisk","clearButtonProps","hoverOnSearchChange","disableSelectedItemFiltering"]),{classes:Ye,cx:rt,theme:Nt}=Vq({invalid:!!p},{name:"MultiSelect",classNames:h,styles:g,unstyled:Wt,size:d,variant:R}),{systemStyles:dr,rest:yn}=_h(at),bn=f.useRef(),zr=f.useRef({}),fr=C1(j),[An,Nn]=f.useState(ie),[$n,Rr]=f.useState(-1),[So,Lr]=f.useState("column"),[Br,es]=uu({value:V,defaultValue:"",finalValue:void 0,onChange:U}),[Dr,Ps]=f.useState(!1),{scrollIntoView:ts,targetRef:Xs,scrollableRef:js}=ok({duration:0,offset:5,cancelable:!1,isList:!0}),q=W&&typeof re=="function";let Q=null;const le=w.map(Me=>typeof Me=="string"?{label:Me,value:Me}:Me),we=q_({data:le}),[ce,et]=uu({value:rC(b,w),defaultValue:rC(S,w),finalValue:[],onChange:C}),Qe=f.useRef(!!me&&me{if(!ln){const ut=ce.filter(Ct=>Ct!==Me);et(ut),me&&ut.length{es(Me.currentTarget.value),!J&&!Qe.current&&z&&Nn(!0)},dt=Me=>{typeof T=="function"&&T(Me),!J&&!Qe.current&&z&&Nn(!0)},De=xq({data:we,searchable:z,searchValue:Br,limit:B,filter:ee,value:ce,disableSelectedItemFiltering:Ee});q&&pe(Br,we)&&(Q=re(Br),De.push({label:Br,value:Br,creatable:!0}));const ye=Math.min($n,De.length-1),Fe=(Me,ut,Ct)=>{let Tt=Me;for(;Ct(Tt);)if(Tt=ut(Tt),!De[Tt].disabled)return Tt;return Me};hs(()=>{Rr(sr&&Br?0:-1)},[Br,sr]),hs(()=>{!J&&ce.length>w.length&&Nn(!1),me&&ce.length=me&&(Qe.current=!0,Nn(!1))},[ce]);const ht=Me=>{if(!ln)if(H&&es(""),ce.includes(Me.value))Dt(Me.value);else{if(Me.creatable&&typeof ne=="function"){const ut=ne(Me.value);typeof ut<"u"&&ut!==null&&et(typeof ut=="string"?[...ce,ut]:[...ce,ut.value])}else et([...ce,Me.value]);ce.length===me-1&&(Qe.current=!0,Nn(!1)),De.length===1&&Nn(!1)}},bt=Me=>{typeof A=="function"&&A(Me),kt&&De[ye]&&An&&ht(De[ye]),K&&es(""),Nn(!1)},Et=Me=>{if(Dr||(Ft==null||Ft(Me),ln)||Me.key!=="Backspace"&&me&&Qe.current)return;const ut=So==="column",Ct=()=>{Rr(xn=>{var zt;const tn=Fe(xn,Xt=>Xt+1,Xt=>Xt{Rr(xn=>{var zt;const tn=Fe(xn,Xt=>Xt-1,Xt=>Xt>0);return An&&(Xs.current=zr.current[(zt=De[tn])==null?void 0:zt.value],ts({alignment:ut?"start":"end"})),tn})};switch(Me.key){case"ArrowUp":{Me.preventDefault(),Nn(!0),ut?Tt():Ct();break}case"ArrowDown":{Me.preventDefault(),Nn(!0),ut?Ct():Tt();break}case"Enter":{Me.preventDefault(),De[ye]&&An?ht(De[ye]):Nn(!0);break}case" ":{z||(Me.preventDefault(),De[ye]&&An?ht(De[ye]):Nn(!0));break}case"Backspace":{ce.length>0&&Br.length===0&&(et(ce.slice(0,-1)),Nn(!0),me&&(Qe.current=!1));break}case"Home":{if(!z){Me.preventDefault(),An||Nn(!0);const xn=De.findIndex(zt=>!zt.disabled);Rr(xn),ts({alignment:ut?"end":"start"})}break}case"End":{if(!z){Me.preventDefault(),An||Nn(!0);const xn=De.map(zt=>!!zt.disabled).lastIndexOf(!1);Rr(xn),ts({alignment:ut?"end":"start"})}break}case"Escape":Nn(!1)}},Lt=ce.map(Me=>{let ut=we.find(Ct=>Ct.value===Me&&!Ct.disabled);return!ut&&q&&(ut={value:Me,label:Me}),ut}).filter(Me=>!!Me).map((Me,ut)=>N.createElement(_,nC(pl({},Me),{variant:R,disabled:J,className:Ye.value,readOnly:ln,onRemove:Ct=>{Ct.preventDefault(),Ct.stopPropagation(),Dt(Me.value)},key:Me.value,size:d,styles:g,classNames:h,radius:xe,index:ut}))),qt=Me=>ce.includes(Me),Gt=()=>{var Me;es(""),et([]),(Me=bn.current)==null||Me.focus(),me&&(Qe.current=!1)},$t=!ln&&(De.length>0?An:An&&!!M);return hs(()=>{const Me=$t?Re:Ce;typeof Me=="function"&&Me()},[$t]),N.createElement(Bl.Wrapper,pl(pl({required:s,id:fr,label:i,error:p,description:u,size:d,className:r,style:o,classNames:h,styles:g,__staticSelector:"MultiSelect",sx:ge,errorProps:Pt,descriptionProps:be,labelProps:yt,inputContainer:Cn,inputWrapperOrder:En,unstyled:Wt,withAsterisk:wr,variant:R},dr),v),N.createElement(Qa,{opened:$t,transitionProps:E,shadow:"sm",withinPortal:_e,portalProps:We,__staticSelector:"MultiSelect",onDirectionChange:Lr,switchDirectionOnFlip:Le,zIndex:Ue,dropdownPosition:Pn,positionDependencies:[...It,Br],classNames:h,styles:g,unstyled:Wt,variant:R},N.createElement(Qa.Target,null,N.createElement("div",{className:Ye.wrapper,role:"combobox","aria-haspopup":"listbox","aria-owns":An&&$t?`${fr}-items`:null,"aria-controls":fr,"aria-expanded":An,onMouseLeave:()=>Rr(-1),tabIndex:-1},N.createElement("input",{type:"hidden",name:gt,value:ce.join(","),form:Te,disabled:J}),N.createElement(Bl,pl({__staticSelector:"MultiSelect",style:{overflow:"hidden"},component:"div",multiline:!0,size:d,variant:R,disabled:J,error:p,required:s,radius:xe,icon:he,unstyled:Wt,onMouseDown:Me=>{var ut;Me.preventDefault(),!J&&!Qe.current&&Nn(!An),(ut=bn.current)==null||ut.focus()},classNames:nC(pl({},h),{input:rt({[Ye.input]:!z},h==null?void 0:h.input)})},ij({theme:Nt,rightSection:ae,rightSectionWidth:Z,styles:g,size:d,shouldClear:G&&ce.length>0,onClear:Gt,error:p,disabled:J,clearButtonProps:vn,readOnly:ln})),N.createElement("div",{className:Ye.values,"data-clearable":G||void 0},Lt,N.createElement("input",pl({ref:zu(t,bn),type:"search",id:fr,className:rt(Ye.searchInput,{[Ye.searchInputPointer]:!z,[Ye.searchInputInputHidden]:!An&&ce.length>0||!z&&ce.length>0,[Ye.searchInputEmpty]:ce.length===0}),onKeyDown:Et,value:Br,onChange:ot,onFocus:dt,onBlur:bt,readOnly:!z||Qe.current||ln,placeholder:ce.length===0?$:void 0,disabled:J,"data-mantine-stop-propagation":An,autoComplete:"off",onCompositionStart:()=>Ps(!0),onCompositionEnd:()=>Ps(!1)},yn)))))),N.createElement(Qa.Dropdown,{component:ue||Ih,maxHeight:I,direction:So,id:fr,innerRef:js,__staticSelector:"MultiSelect",classNames:h,styles:g},N.createElement(_1,{data:De,hovered:ye,classNames:h,styles:g,uuid:fr,__staticSelector:"MultiSelect",onItemHover:Rr,onItemSelect:ht,itemsRefs:zr,itemComponent:k,size:d,nothingFound:M,isItemSelected:qt,creatable:W&&!!Q,createLabel:Q,unstyled:Wt,variant:R}))))});uj.displayName="@mantine/core/MultiSelect";var Jq=Object.defineProperty,Zq=Object.defineProperties,eK=Object.getOwnPropertyDescriptors,$p=Object.getOwnPropertySymbols,dj=Object.prototype.hasOwnProperty,fj=Object.prototype.propertyIsEnumerable,oC=(e,t,n)=>t in e?Jq(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,Mg=(e,t)=>{for(var n in t||(t={}))dj.call(t,n)&&oC(e,n,t[n]);if($p)for(var n of $p(t))fj.call(t,n)&&oC(e,n,t[n]);return e},tK=(e,t)=>Zq(e,eK(t)),nK=(e,t)=>{var n={};for(var r in e)dj.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(e!=null&&$p)for(var r of $p(e))t.indexOf(r)<0&&fj.call(e,r)&&(n[r]=e[r]);return n};const rK={type:"text",size:"sm",__staticSelector:"TextInput"},pj=f.forwardRef((e,t)=>{const n=DP("TextInput",rK,e),{inputProps:r,wrapperProps:o}=n,s=nK(n,["inputProps","wrapperProps"]);return N.createElement(Bl.Wrapper,Mg({},o),N.createElement(Bl,tK(Mg(Mg({},r),s),{ref:t})))});pj.displayName="@mantine/core/TextInput";function oK({data:e,searchable:t,limit:n,searchValue:r,filter:o,value:s,filterDataOnExactSearchMatch:i}){if(!t)return e;const u=s!=null&&e.find(p=>p.value===s)||null;if(u&&!i&&(u==null?void 0:u.label)===r){if(n){if(n>=e.length)return e;const p=e.indexOf(u),h=p+n,g=h-e.length;return g>0?e.slice(p-g):e.slice(p,h)}return e}const d=[];for(let p=0;p=n));p+=1);return d}var sK=Zr(()=>({input:{"&:not(:disabled)":{cursor:"pointer","&::selection":{backgroundColor:"transparent"}}}}));const aK=sK;var iK=Object.defineProperty,lK=Object.defineProperties,cK=Object.getOwnPropertyDescriptors,zp=Object.getOwnPropertySymbols,hj=Object.prototype.hasOwnProperty,mj=Object.prototype.propertyIsEnumerable,sC=(e,t,n)=>t in e?iK(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,Mc=(e,t)=>{for(var n in t||(t={}))hj.call(t,n)&&sC(e,n,t[n]);if(zp)for(var n of zp(t))mj.call(t,n)&&sC(e,n,t[n]);return e},Rg=(e,t)=>lK(e,cK(t)),uK=(e,t)=>{var n={};for(var r in e)hj.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(e!=null&&zp)for(var r of zp(e))t.indexOf(r)<0&&mj.call(e,r)&&(n[r]=e[r]);return n};function dK(e,t){return t.label.toLowerCase().trim().includes(e.toLowerCase().trim())}function fK(e,t){return!!e&&!t.some(n=>n.label.toLowerCase()===e.toLowerCase())}const pK={required:!1,size:"sm",shadow:"sm",itemComponent:k1,transitionProps:{transition:"fade",duration:0},initiallyOpened:!1,filter:dK,maxDropdownHeight:220,searchable:!1,clearable:!1,limit:1/0,disabled:!1,creatable:!1,shouldCreate:fK,selectOnBlur:!1,switchDirectionOnFlip:!1,filterDataOnExactSearchMatch:!1,zIndex:w1("popover"),positionDependencies:[],dropdownPosition:"flip"},A1=f.forwardRef((e,t)=>{const n=DP("Select",pK,e),{inputProps:r,wrapperProps:o,shadow:s,data:i,value:u,defaultValue:d,onChange:p,itemComponent:h,onKeyDown:g,onBlur:v,onFocus:b,transitionProps:S,initiallyOpened:w,unstyled:C,classNames:_,styles:k,filter:j,maxDropdownHeight:E,searchable:I,clearable:O,nothingFound:M,limit:T,disabled:A,onSearchChange:z,searchValue:$,rightSection:ee,rightSectionWidth:B,creatable:H,getCreateLabel:G,shouldCreate:K,selectOnBlur:R,onCreate:U,dropdownComponent:V,onDropdownClose:J,onDropdownOpen:ie,withinPortal:xe,portalProps:he,switchDirectionOnFlip:ae,zIndex:Z,name:W,dropdownPosition:re,allowDeselect:pe,placeholder:ne,filterDataOnExactSearchMatch:ge,form:ue,positionDependencies:Ce,readOnly:Re,clearButtonProps:me,hoverOnSearchChange:_e}=n,We=uK(n,["inputProps","wrapperProps","shadow","data","value","defaultValue","onChange","itemComponent","onKeyDown","onBlur","onFocus","transitionProps","initiallyOpened","unstyled","classNames","styles","filter","maxDropdownHeight","searchable","clearable","nothingFound","limit","disabled","onSearchChange","searchValue","rightSection","rightSectionWidth","creatable","getCreateLabel","shouldCreate","selectOnBlur","onCreate","dropdownComponent","onDropdownClose","onDropdownOpen","withinPortal","portalProps","switchDirectionOnFlip","zIndex","name","dropdownPosition","allowDeselect","placeholder","filterDataOnExactSearchMatch","form","positionDependencies","readOnly","clearButtonProps","hoverOnSearchChange"]),{classes:Le,cx:Ue,theme:kt}=aK(),[gt,Pn]=f.useState(w),[Pt,yt]=f.useState(-1),be=f.useRef(),Te=f.useRef({}),[It,Ft]=f.useState("column"),Wt=It==="column",{scrollIntoView:Cn,targetRef:En,scrollableRef:ln}=ok({duration:0,offset:5,cancelable:!1,isList:!0}),wr=pe===void 0?O:pe,vn=Q=>{if(gt!==Q){Pn(Q);const le=Q?ie:J;typeof le=="function"&&le()}},sr=H&&typeof G=="function";let Ee=null;const at=i.map(Q=>typeof Q=="string"?{label:Q,value:Q}:Q),Ye=q_({data:at}),[rt,Nt,dr]=uu({value:u,defaultValue:d,finalValue:null,onChange:p}),yn=Ye.find(Q=>Q.value===rt),[bn,zr]=uu({value:$,defaultValue:(yn==null?void 0:yn.label)||"",finalValue:void 0,onChange:z}),fr=Q=>{zr(Q),I&&typeof z=="function"&&z(Q)},An=()=>{var Q;Re||(Nt(null),dr||fr(""),(Q=be.current)==null||Q.focus())};f.useEffect(()=>{const Q=Ye.find(le=>le.value===rt);Q?fr(Q.label):(!sr||!rt)&&fr("")},[rt]),f.useEffect(()=>{yn&&(!I||!gt)&&fr(yn.label)},[yn==null?void 0:yn.label]);const Nn=Q=>{if(!Re)if(wr&&(yn==null?void 0:yn.value)===Q.value)Nt(null),vn(!1);else{if(Q.creatable&&typeof U=="function"){const le=U(Q.value);typeof le<"u"&&le!==null&&Nt(typeof le=="string"?le:le.value)}else Nt(Q.value);dr||fr(Q.label),yt(-1),vn(!1),be.current.focus()}},$n=oK({data:Ye,searchable:I,limit:T,searchValue:bn,filter:j,filterDataOnExactSearchMatch:ge,value:rt});sr&&K(bn,$n)&&(Ee=G(bn),$n.push({label:bn,value:bn,creatable:!0}));const Rr=(Q,le,we)=>{let ce=Q;for(;we(ce);)if(ce=le(ce),!$n[ce].disabled)return ce;return Q};hs(()=>{yt(_e&&bn?0:-1)},[bn,_e]);const So=rt?$n.findIndex(Q=>Q.value===rt):0,Lr=!Re&&($n.length>0?gt:gt&&!!M),Br=()=>{yt(Q=>{var le;const we=Rr(Q,ce=>ce-1,ce=>ce>0);return En.current=Te.current[(le=$n[we])==null?void 0:le.value],Lr&&Cn({alignment:Wt?"start":"end"}),we})},es=()=>{yt(Q=>{var le;const we=Rr(Q,ce=>ce+1,ce=>ce<$n.length-1);return En.current=Te.current[(le=$n[we])==null?void 0:le.value],Lr&&Cn({alignment:Wt?"end":"start"}),we})},Dr=()=>window.setTimeout(()=>{var Q;En.current=Te.current[(Q=$n[So])==null?void 0:Q.value],Cn({alignment:Wt?"end":"start"})},50);hs(()=>{Lr&&Dr()},[Lr]);const Ps=Q=>{switch(typeof g=="function"&&g(Q),Q.key){case"ArrowUp":{Q.preventDefault(),gt?Wt?Br():es():(yt(So),vn(!0),Dr());break}case"ArrowDown":{Q.preventDefault(),gt?Wt?es():Br():(yt(So),vn(!0),Dr());break}case"Home":{if(!I){Q.preventDefault(),gt||vn(!0);const le=$n.findIndex(we=>!we.disabled);yt(le),Lr&&Cn({alignment:Wt?"end":"start"})}break}case"End":{if(!I){Q.preventDefault(),gt||vn(!0);const le=$n.map(we=>!!we.disabled).lastIndexOf(!1);yt(le),Lr&&Cn({alignment:Wt?"end":"start"})}break}case"Escape":{Q.preventDefault(),vn(!1),yt(-1);break}case" ":{I||(Q.preventDefault(),$n[Pt]&>?Nn($n[Pt]):(vn(!0),yt(So),Dr()));break}case"Enter":I||Q.preventDefault(),$n[Pt]&>&&(Q.preventDefault(),Nn($n[Pt]))}},ts=Q=>{typeof v=="function"&&v(Q);const le=Ye.find(we=>we.value===rt);R&&$n[Pt]&>&&Nn($n[Pt]),fr((le==null?void 0:le.label)||""),vn(!1)},Xs=Q=>{typeof b=="function"&&b(Q),I&&vn(!0)},js=Q=>{Re||(fr(Q.currentTarget.value),O&&Q.currentTarget.value===""&&Nt(null),yt(-1),vn(!0))},q=()=>{Re||(vn(!gt),rt&&!gt&&yt(So))};return N.createElement(Bl.Wrapper,Rg(Mc({},o),{__staticSelector:"Select"}),N.createElement(Qa,{opened:Lr,transitionProps:S,shadow:s,withinPortal:xe,portalProps:he,__staticSelector:"Select",onDirectionChange:Ft,switchDirectionOnFlip:ae,zIndex:Z,dropdownPosition:re,positionDependencies:[...Ce,bn],classNames:_,styles:k,unstyled:C,variant:r.variant},N.createElement(Qa.Target,null,N.createElement("div",{role:"combobox","aria-haspopup":"listbox","aria-owns":Lr?`${r.id}-items`:null,"aria-controls":r.id,"aria-expanded":Lr,onMouseLeave:()=>yt(-1),tabIndex:-1},N.createElement("input",{type:"hidden",name:W,value:rt||"",form:ue,disabled:A}),N.createElement(Bl,Mc(Rg(Mc(Mc({autoComplete:"off",type:"search"},r),We),{ref:zu(t,be),onKeyDown:Ps,__staticSelector:"Select",value:bn,placeholder:ne,onChange:js,"aria-autocomplete":"list","aria-controls":Lr?`${r.id}-items`:null,"aria-activedescendant":Pt>=0?`${r.id}-${Pt}`:null,onMouseDown:q,onBlur:ts,onFocus:Xs,readOnly:!I||Re,disabled:A,"data-mantine-stop-propagation":Lr,name:null,classNames:Rg(Mc({},_),{input:Ue({[Le.input]:!I},_==null?void 0:_.input)})}),ij({theme:kt,rightSection:ee,rightSectionWidth:B,styles:k,size:r.size,shouldClear:O&&!!yn,onClear:An,error:o.error,clearButtonProps:me,disabled:A,readOnly:Re}))))),N.createElement(Qa.Dropdown,{component:V||Ih,maxHeight:E,direction:It,id:r.id,innerRef:ln,__staticSelector:"Select",classNames:_,styles:k},N.createElement(_1,{data:$n,hovered:Pt,classNames:_,styles:k,isItemSelected:Q=>Q===rt,uuid:r.id,__staticSelector:"Select",onItemHover:yt,onItemSelect:Nn,itemsRefs:Te,itemComponent:h,size:r.size,nothingFound:M,creatable:sr&&!!Ee,createLabel:Ee,"aria-label":o.label,unstyled:C,variant:r.variant}))))});A1.displayName="@mantine/core/Select";const N1=()=>{const[e,t,n,r,o,s,i,u,d,p,h,g,v,b,S,w,C,_,k,j,E,I,O,M,T,A,z,$,ee,B,H,G,K,R,U,V,J,ie]=Yl("colors",["base.50","base.100","base.150","base.200","base.250","base.300","base.350","base.400","base.450","base.500","base.550","base.600","base.650","base.700","base.750","base.800","base.850","base.900","base.950","accent.50","accent.100","accent.150","accent.200","accent.250","accent.300","accent.350","accent.400","accent.450","accent.500","accent.550","accent.600","accent.650","accent.700","accent.750","accent.800","accent.850","accent.900","accent.950"]);return{base50:e,base100:t,base150:n,base200:r,base250:o,base300:s,base350:i,base400:u,base450:d,base500:p,base550:h,base600:g,base650:v,base700:b,base750:S,base800:w,base850:C,base900:_,base950:k,accent50:j,accent100:E,accent150:I,accent200:O,accent250:M,accent300:T,accent350:A,accent400:z,accent450:$,accent500:ee,accent550:B,accent600:H,accent650:G,accent700:K,accent750:R,accent800:U,accent850:V,accent900:J,accent950:ie}},gj=()=>{const{base50:e,base100:t,base200:n,base300:r,base400:o,base500:s,base600:i,base700:u,base800:d,base900:p,accent200:h,accent300:g,accent400:v,accent500:b,accent600:S}=N1(),{colorMode:w}=Ro(),[C]=Yl("shadows",["dark-lg"]);return f.useCallback(()=>({label:{color:ke(u,r)(w)},separatorLabel:{color:ke(s,s)(w),"::after":{borderTopColor:ke(r,u)(w)}},input:{backgroundColor:ke(e,p)(w),borderWidth:"2px",borderColor:ke(n,d)(w),color:ke(p,t)(w),paddingRight:24,fontWeight:600,"&:hover":{borderColor:ke(r,i)(w)},"&:focus":{borderColor:ke(g,S)(w)},"&:is(:focus, :hover)":{borderColor:ke(o,s)(w)},"&:focus-within":{borderColor:ke(h,S)(w)},"&[data-disabled]":{backgroundColor:ke(r,u)(w),color:ke(i,o)(w),cursor:"not-allowed"}},value:{backgroundColor:ke(t,p)(w),color:ke(p,t)(w),button:{color:ke(p,t)(w)},"&:hover":{backgroundColor:ke(r,u)(w),cursor:"pointer"}},dropdown:{backgroundColor:ke(n,d)(w),borderColor:ke(n,d)(w),boxShadow:C},item:{backgroundColor:ke(n,d)(w),color:ke(d,n)(w),padding:6,"&[data-hovered]":{color:ke(p,t)(w),backgroundColor:ke(r,u)(w)},"&[data-active]":{backgroundColor:ke(r,u)(w),"&:hover":{color:ke(p,t)(w),backgroundColor:ke(r,u)(w)}},"&[data-selected]":{backgroundColor:ke(v,S)(w),color:ke(e,t)(w),fontWeight:600,"&:hover":{backgroundColor:ke(b,b)(w),color:ke("white",e)(w)}},"&[data-disabled]":{color:ke(s,i)(w),cursor:"not-allowed"}},rightSection:{width:32,button:{color:ke(p,t)(w)}}}),[h,g,v,b,S,t,n,r,o,e,s,i,u,d,p,C,w])},hK=e=>{const{tooltip:t,inputRef:n,label:r,disabled:o,required:s,...i}=e,u=gj();return a.jsx(_n,{label:t,placement:"top",hasArrow:!0,children:a.jsx(A1,{label:r?a.jsx(Ss,{isRequired:s,isDisabled:o,children:a.jsx(vs,{children:r})}):void 0,disabled:o,ref:n,styles:u,...i})})},Do=f.memo(hK),mK=()=>{const{base50:e,base100:t,base200:n,base300:r,base400:o,base500:s,base600:i,base700:u,base800:d,base900:p,accent200:h,accent300:g,accent400:v,accent500:b,accent600:S}=N1(),{colorMode:w}=Ro(),[C]=Yl("shadows",["dark-lg"]);return f.useCallback(()=>({label:{color:ke(u,r)(w)},separatorLabel:{color:ke(s,s)(w),"::after":{borderTopColor:ke(r,u)(w)}},searchInput:{":placeholder":{color:ke(r,u)(w)}},input:{backgroundColor:ke(e,p)(w),borderWidth:"2px",borderColor:ke(n,d)(w),color:ke(p,t)(w),paddingRight:24,fontWeight:600,"&:hover":{borderColor:ke(r,i)(w)},"&:focus":{borderColor:ke(g,S)(w)},"&:is(:focus, :hover)":{borderColor:ke(o,s)(w)},"&:focus-within":{borderColor:ke(h,S)(w)},"&[data-disabled]":{backgroundColor:ke(r,u)(w),color:ke(i,o)(w),cursor:"not-allowed"}},value:{backgroundColor:ke(n,d)(w),color:ke(p,t)(w),button:{color:ke(p,t)(w)},"&:hover":{backgroundColor:ke(r,u)(w),cursor:"pointer"}},dropdown:{backgroundColor:ke(n,d)(w),borderColor:ke(n,d)(w),boxShadow:C},item:{backgroundColor:ke(n,d)(w),color:ke(d,n)(w),padding:6,"&[data-hovered]":{color:ke(p,t)(w),backgroundColor:ke(r,u)(w)},"&[data-active]":{backgroundColor:ke(r,u)(w),"&:hover":{color:ke(p,t)(w),backgroundColor:ke(r,u)(w)}},"&[data-selected]":{backgroundColor:ke(v,S)(w),color:ke(e,t)(w),fontWeight:600,"&:hover":{backgroundColor:ke(b,b)(w),color:ke("white",e)(w)}},"&[data-disabled]":{color:ke(s,i)(w),cursor:"not-allowed"}},rightSection:{width:24,padding:20,button:{color:ke(p,t)(w)}}}),[h,g,v,b,S,t,n,r,o,e,s,i,u,d,p,C,w])},gK=e=>{const{searchable:t=!0,tooltip:n,inputRef:r,label:o,disabled:s,...i}=e,u=te(),d=f.useCallback(g=>{g.shiftKey&&u(Ko(!0))},[u]),p=f.useCallback(g=>{g.shiftKey||u(Ko(!1))},[u]),h=mK();return a.jsx(_n,{label:n,placement:"top",hasArrow:!0,isOpen:!0,children:a.jsx(uj,{label:o?a.jsx(Ss,{isDisabled:s,children:a.jsx(vs,{children:o})}):void 0,ref:r,disabled:s,onKeyDown:d,onKeyUp:p,searchable:t,maxDropdownHeight:300,styles:h,...i})})},vK=f.memo(gK),yK=Cs(R4,e=>({value:e,label:D4[e]})).sort((e,t)=>e.label.localeCompare(t.label));function bK(){const e=te(),{t}=fe(),n=L(o=>o.ui.favoriteSchedulers),r=f.useCallback(o=>{e(w8(o))},[e]);return a.jsx(vK,{label:t("settings.favoriteSchedulers"),value:n,data:yK,onChange:r,clearable:!0,searchable:!0,maxSelectedValues:99,placeholder:t("settings.favoriteSchedulersPlaceholder")})}const xK=ve([Mo,Jr],(e,t)=>{const{shouldConfirmOnDelete:n,shouldDisplayGuides:r,enableImageDebugging:o,consoleLogLevel:s,shouldLogToConsole:i,shouldAntialiasProgressImage:u}=e,{shouldUseCanvasBetaLayout:d,shouldUseSliders:p,shouldShowProgressInViewer:h,shouldShowAdvancedOptions:g}=t;return{shouldConfirmOnDelete:n,shouldDisplayGuides:r,enableImageDebugging:o,shouldUseCanvasBetaLayout:d,shouldUseSliders:p,shouldShowProgressInViewer:h,consoleLogLevel:s,shouldLogToConsole:i,shouldAntialiasProgressImage:u,shouldShowAdvancedOptions:g}},{memoizeOptions:{resultEqualityCheck:Qt}}),wK=({children:e,config:t})=>{const n=te(),{t:r}=fe(),o=(t==null?void 0:t.shouldShowBetaLayout)??!0,s=(t==null?void 0:t.shouldShowDeveloperSettings)??!0,i=(t==null?void 0:t.shouldShowResetWebUiText)??!0,u=(t==null?void 0:t.shouldShowAdvancedOptionsSettings)??!0;f.useEffect(()=>{s||n(nx(!1))},[s,n]);const{isOpen:d,onOpen:p,onClose:h}=Ws(),{isOpen:g,onOpen:v,onClose:b}=Ws(),{shouldConfirmOnDelete:S,shouldDisplayGuides:w,enableImageDebugging:C,shouldUseCanvasBetaLayout:_,shouldUseSliders:k,shouldShowProgressInViewer:j,consoleLogLevel:E,shouldLogToConsole:I,shouldAntialiasProgressImage:O,shouldShowAdvancedOptions:M}=L(xK),T=f.useCallback(()=>{Object.keys(window.localStorage).forEach($=>{(S8.includes($)||$.startsWith(C8))&&localStorage.removeItem($)}),h(),v()},[h,v]),A=f.useCallback($=>{n(_8($))},[n]),z=f.useCallback($=>{n(nx($.target.checked))},[n]);return a.jsxs(a.Fragment,{children:[f.cloneElement(e,{onClick:p}),a.jsxs(ou,{isOpen:d,onClose:h,size:"xl",isCentered:!0,children:[a.jsx(va,{}),a.jsxs(su,{children:[a.jsx(ga,{bg:"none",children:r("common.settingsLabel")}),a.jsx($v,{}),a.jsx(ya,{children:a.jsxs(F,{sx:{gap:4,flexDirection:"column"},children:[a.jsxs(Rc,{children:[a.jsx(aa,{size:"sm",children:r("settings.general")}),a.jsx(jn,{label:r("settings.confirmOnDelete"),isChecked:S,onChange:$=>n(O4($.target.checked))}),u&&a.jsx(jn,{label:r("settings.showAdvancedOptions"),isChecked:M,onChange:$=>n(k8($.target.checked))})]}),a.jsxs(Rc,{children:[a.jsx(aa,{size:"sm",children:r("settings.generation")}),a.jsx(bK,{})]}),a.jsxs(Rc,{children:[a.jsx(aa,{size:"sm",children:r("settings.ui")}),a.jsx(jn,{label:r("settings.displayHelpIcons"),isChecked:w,onChange:$=>n(P8($.target.checked))}),o&&a.jsx(jn,{label:r("settings.useCanvasBeta"),isChecked:_,onChange:$=>n(j8($.target.checked))}),a.jsx(jn,{label:r("settings.useSlidersForAll"),isChecked:k,onChange:$=>n(I8($.target.checked))}),a.jsx(jn,{label:r("settings.showProgressInViewer"),isChecked:j,onChange:$=>n(T4($.target.checked))}),a.jsx(jn,{label:r("settings.antialiasProgressImages"),isChecked:O,onChange:$=>n(E8($.target.checked))})]}),s&&a.jsxs(Rc,{children:[a.jsx(aa,{size:"sm",children:r("settings.developer")}),a.jsx(jn,{label:r("settings.shouldLogToConsole"),isChecked:I,onChange:z}),a.jsx(Do,{disabled:!I,label:r("settings.consoleLogLevel"),onChange:A,value:E,data:O8.concat()}),a.jsx(jn,{label:r("settings.enableImageDebugging"),isChecked:C,onChange:$=>n(M8($.target.checked))})]}),a.jsxs(Rc,{children:[a.jsx(aa,{size:"sm",children:r("settings.resetWebUI")}),a.jsx(Zt,{colorScheme:"error",onClick:T,children:r("settings.resetWebUI")}),i&&a.jsxs(a.Fragment,{children:[a.jsx(nt,{children:r("settings.resetWebUIDesc1")}),a.jsx(nt,{children:r("settings.resetWebUIDesc2")})]})]})]})}),a.jsx(ma,{children:a.jsx(Zt,{onClick:h,children:r("common.close")})})]})]}),a.jsxs(ou,{closeOnOverlayClick:!1,isOpen:g,onClose:b,isCentered:!0,children:[a.jsx(va,{backdropFilter:"blur(40px)"}),a.jsxs(su,{children:[a.jsx(ga,{}),a.jsx(ya,{children:a.jsx(F,{justifyContent:"center",children:a.jsx(nt,{fontSize:"lg",children:a.jsx(nt,{children:r("settings.resetComplete")})})})}),a.jsx(ma,{})]})]})]})},Rc=e=>a.jsx(F,{sx:{flexDirection:"column",gap:2,p:4,borderRadius:"base",bg:"base.100",_dark:{bg:"base.900"}},children:e.children}),SK=()=>{const{t:e}=fe(),t=br("localization").isFeatureEnabled,n=br("bugLink").isFeatureEnabled,r=br("discordLink").isFeatureEnabled,o=br("githubLink").isFeatureEnabled;return a.jsxs(F,{sx:{gap:2,alignItems:"center"},children:[a.jsx(U_,{}),a.jsx($i,{}),a.jsx(GB,{}),a.jsx(tF,{children:a.jsx(je,{"aria-label":e("common.hotkeysLabel"),tooltip:e("common.hotkeysLabel"),size:"sm",variant:"link","data-variant":"link",fontSize:20,icon:a.jsx(w$,{})})}),t&&a.jsx(sF,{}),n&&a.jsx(Ka,{isExternal:!0,href:"http://github.com/invoke-ai/InvokeAI/issues",marginBottom:"-0.25rem",children:a.jsx(je,{"aria-label":e("common.reportBugLabel"),tooltip:e("common.reportBugLabel"),variant:"link","data-variant":"link",fontSize:20,size:"sm",icon:a.jsx(s$,{})})}),o&&a.jsx(Ka,{isExternal:!0,href:"http://github.com/invoke-ai/InvokeAI",marginBottom:"-0.25rem",children:a.jsx(je,{"aria-label":e("common.githubLabel"),tooltip:e("common.githubLabel"),variant:"link","data-variant":"link",fontSize:20,size:"sm",icon:a.jsx(JN,{})})}),r&&a.jsx(Ka,{isExternal:!0,href:"https://discord.gg/ZmtBAhwWhy",marginBottom:"-0.25rem",children:a.jsx(je,{"aria-label":e("common.discordLabel"),tooltip:e("common.discordLabel"),variant:"link","data-variant":"link",fontSize:20,size:"sm",icon:a.jsx(XN,{})})}),a.jsx(ZB,{}),a.jsx(wK,{children:a.jsx(je,{"aria-label":e("common.settingsLabel"),tooltip:e("common.settingsLabel"),variant:"link","data-variant":"link",fontSize:22,size:"sm",icon:a.jsx(KB,{})})})]})},CK=f.memo(SK),_K=ve(Mo,e=>{const{isUploading:t}=e;let n="";return t&&(n="Uploading..."),{tooltip:n,shouldShow:t}}),kK=()=>{const{shouldShow:e,tooltip:t}=L(_K);return e?a.jsx(F,{sx:{alignItems:"center",justifyContent:"center",color:"base.600"},children:a.jsx(_n,{label:t,placement:"right",hasArrow:!0,children:a.jsx(Jl,{})})}):null},PK=f.memo(kK),Wi=e=>e.config,{createElement:Fl,createContext:jK,forwardRef:vj,useCallback:za,useContext:yj,useEffect:pa,useImperativeHandle:bj,useLayoutEffect:IK,useMemo:EK,useRef:Vo,useState:Jc}=dv,aC=dv["useId".toString()],OK=typeof window<"u"&&typeof window.document<"u"&&typeof window.document.createElement<"u",Lp=OK?IK:()=>{},MK=typeof aC=="function"?aC:()=>null;let RK=0;function $1(e=null){const t=MK(),n=Vo(e||t||null);return n.current===null&&(n.current=""+RK++),n.current}const Mh=jK(null);Mh.displayName="PanelGroupContext";function xj({children:e=null,className:t="",collapsedSize:n=0,collapsible:r=!1,defaultSize:o=null,forwardedRef:s,id:i=null,maxSize:u=100,minSize:d=10,onCollapse:p=null,onResize:h=null,order:g=null,style:v={},tagName:b="div"}){const S=yj(Mh);if(S===null)throw Error("Panel components must be rendered within a PanelGroup container");const w=$1(i),{collapsePanel:C,expandPanel:_,getPanelStyle:k,registerPanel:j,resizePanel:E,unregisterPanel:I}=S,O=Vo({onCollapse:p,onResize:h});if(pa(()=>{O.current.onCollapse=p,O.current.onResize=h}),d<0||d>100)throw Error(`Panel minSize must be between 0 and 100, but was ${d}`);if(u<0||u>100)throw Error(`Panel maxSize must be between 0 and 100, but was ${u}`);if(o!==null){if(o<0||o>100)throw Error(`Panel defaultSize must be between 0 and 100, but was ${o}`);d>o&&!r&&(console.error(`Panel minSize ${d} cannot be greater than defaultSize ${o}`),o=d)}const M=k(w,o),T=Vo({size:iC(M)}),A=Vo({callbacksRef:O,collapsedSize:n,collapsible:r,defaultSize:o,id:w,maxSize:u,minSize:d,order:g});return Lp(()=>{T.current.size=iC(M),A.current.callbacksRef=O,A.current.collapsedSize=n,A.current.collapsible=r,A.current.defaultSize=o,A.current.id=w,A.current.maxSize=u,A.current.minSize=d,A.current.order=g}),Lp(()=>(j(w,A),()=>{I(w)}),[g,w,j,I]),bj(s,()=>({collapse:()=>C(w),expand:()=>_(w),getCollapsed(){return T.current.size===0},getSize(){return T.current.size},resize:z=>E(w,z)}),[C,_,w,E]),Fl(b,{children:e,className:t,"data-panel":"","data-panel-collapsible":r||void 0,"data-panel-id":w,"data-panel-size":parseFloat(""+M.flexGrow).toFixed(1),id:`data-panel-id-${w}`,style:{...M,...v}})}const fu=vj((e,t)=>Fl(xj,{...e,forwardedRef:t}));xj.displayName="Panel";fu.displayName="forwardRef(Panel)";function iC(e){const{flexGrow:t}=e;return typeof t=="string"?parseFloat(t):t}const Ti=10;function Bc(e,t,n,r,o,s,i,u){const{sizes:d}=u||{},p=d||s;if(o===0)return p;const h=Wo(t),g=p.concat();let v=0;{const w=o<0?r:n,C=h.findIndex(E=>E.current.id===w),_=h[C],k=p[C],j=lC(_,Math.abs(o),k,e);if(k===j)return p;j===0&&k>0&&i.set(w,k),o=o<0?k-j:j-k}let b=o<0?n:r,S=h.findIndex(w=>w.current.id===b);for(;;){const w=h[S],C=p[S],_=Math.abs(o)-Math.abs(v),k=lC(w,0-_,C,e);if(C!==k&&(k===0&&C>0&&i.set(w.current.id,C),v+=C-k,g[S]=k,v.toPrecision(Ti).localeCompare(Math.abs(o).toPrecision(Ti),void 0,{numeric:!0})>=0))break;if(o<0){if(--S<0)break}else if(++S>=h.length)break}return v===0?p:(b=o<0?r:n,S=h.findIndex(w=>w.current.id===b),g[S]=p[S]+v,g)}function hl(e,t,n){t.forEach((r,o)=>{const{callbacksRef:s,collapsedSize:i,collapsible:u,id:d}=e[o].current,p=n[d];if(p!==r){n[d]=r;const{onCollapse:h,onResize:g}=s.current;g&&g(r,p),u&&h&&((p==null||p===i)&&r!==i?h(!1):p!==i&&r===i&&h(!0))}})}function Dg(e,t){if(t.length<2)return[null,null];const n=t.findIndex(i=>i.current.id===e);if(n<0)return[null,null];const r=n===t.length-1,o=r?t[n-1].current.id:e,s=r?e:t[n+1].current.id;return[o,s]}function wj(e,t,n){if(e.size===1)return"100";const o=Wo(e).findIndex(i=>i.current.id===t),s=n[o];return s==null?"0":s.toPrecision(Ti)}function DK(e){const t=document.querySelector(`[data-panel-id="${e}"]`);return t||null}function z1(e){const t=document.querySelector(`[data-panel-group-id="${e}"]`);return t||null}function Rh(e){const t=document.querySelector(`[data-panel-resize-handle-id="${e}"]`);return t||null}function TK(e){return Sj().findIndex(r=>r.getAttribute("data-panel-resize-handle-id")===e)??null}function Sj(){return Array.from(document.querySelectorAll("[data-panel-resize-handle-id]"))}function Cj(e){return Array.from(document.querySelectorAll(`[data-panel-resize-handle-id][data-panel-group-id="${e}"]`))}function L1(e,t,n){var d,p,h,g;const r=Rh(t),o=Cj(e),s=r?o.indexOf(r):-1,i=((p=(d=n[s])==null?void 0:d.current)==null?void 0:p.id)??null,u=((g=(h=n[s+1])==null?void 0:h.current)==null?void 0:g.id)??null;return[i,u]}function Wo(e){return Array.from(e.values()).sort((t,n)=>{const r=t.current.order,o=n.current.order;return r==null&&o==null?0:r==null?-1:o==null?1:r-o})}function lC(e,t,n,r){var h;const o=n+t,{collapsedSize:s,collapsible:i,maxSize:u,minSize:d}=e.current;if(i){if(n>s){if(o<=d/2+s)return s}else if(!((h=r==null?void 0:r.type)==null?void 0:h.startsWith("key"))&&o{const{direction:i,panels:u}=e.current,d=z1(t),{height:p,width:h}=d.getBoundingClientRect(),v=Cj(t).map(b=>{const S=b.getAttribute("data-panel-resize-handle-id"),w=Wo(u),[C,_]=L1(t,S,w);if(C==null||_==null)return()=>{};let k=0,j=100,E=0,I=0;w.forEach($=>{$.current.id===C?(j=$.current.maxSize,k=$.current.minSize):(E+=$.current.minSize,I+=$.current.maxSize)});const O=Math.min(j,100-E),M=Math.max(k,(w.length-1)*100-I),T=wj(u,C,o);b.setAttribute("aria-valuemax",""+Math.round(O)),b.setAttribute("aria-valuemin",""+Math.round(M)),b.setAttribute("aria-valuenow",""+Math.round(parseInt(T)));const A=$=>{if(!$.defaultPrevented)switch($.key){case"Enter":{$.preventDefault();const ee=w.findIndex(B=>B.current.id===C);if(ee>=0){const B=w[ee],H=o[ee];if(H!=null){let G=0;H.toPrecision(Ti)<=B.current.minSize.toPrecision(Ti)?G=i==="horizontal"?h:p:G=-(i==="horizontal"?h:p);const K=Bc($,u,C,_,G,o,s.current,null);o!==K&&r(K)}}break}}};b.addEventListener("keydown",A);const z=DK(C);return z!=null&&b.setAttribute("aria-controls",z.id),()=>{b.removeAttribute("aria-valuemax"),b.removeAttribute("aria-valuemin"),b.removeAttribute("aria-valuenow"),b.removeEventListener("keydown",A),z!=null&&b.removeAttribute("aria-controls")}});return()=>{v.forEach(b=>b())}},[e,t,n,s,r,o])}function NK({disabled:e,handleId:t,resizeHandler:n}){pa(()=>{if(e||n==null)return;const r=Rh(t);if(r==null)return;const o=s=>{if(!s.defaultPrevented)switch(s.key){case"ArrowDown":case"ArrowLeft":case"ArrowRight":case"ArrowUp":case"End":case"Home":{s.preventDefault(),n(s);break}case"F6":{s.preventDefault();const i=Sj(),u=TK(t);_j(u!==null);const d=s.shiftKey?u>0?u-1:i.length-1:u+1{r.removeEventListener("keydown",o)}},[e,t,n])}function $K(e,t){if(e.length!==t.length)return!1;for(let n=0;nM.current.id===E),O=r[I];if(O.current.collapsible){const M=h[I];(M===0||M.toPrecision(Ti)===O.current.minSize.toPrecision(Ti))&&(_=_<0?-O.current.minSize*S:O.current.minSize*S)}return _}else return kj(e,n,o,u,d)}function LK(e){return e.type==="keydown"}function B0(e){return e.type.startsWith("mouse")}function F0(e){return e.type.startsWith("touch")}let H0=null,xi=null;function Pj(e){switch(e){case"horizontal":return"ew-resize";case"horizontal-max":return"w-resize";case"horizontal-min":return"e-resize";case"vertical":return"ns-resize";case"vertical-max":return"n-resize";case"vertical-min":return"s-resize"}}function BK(){xi!==null&&(document.head.removeChild(xi),H0=null,xi=null)}function Tg(e){if(H0===e)return;H0=e;const t=Pj(e);xi===null&&(xi=document.createElement("style"),document.head.appendChild(xi)),xi.innerHTML=`*{cursor: ${t}!important;}`}function FK(e,t=10){let n=null;return(...o)=>{n!==null&&clearTimeout(n),n=setTimeout(()=>{e(...o)},t)}}function jj(e){return e.map(t=>{const{minSize:n,order:r}=t.current;return r?`${r}:${n}`:`${n}`}).sort((t,n)=>t.localeCompare(n)).join(",")}function Ij(e,t){try{const n=t.getItem(`PanelGroup:sizes:${e}`);if(n){const r=JSON.parse(n);if(typeof r=="object"&&r!=null)return r}}catch{}return null}function HK(e,t,n){const r=Ij(e,n);if(r){const o=jj(t);return r[o]??null}return null}function WK(e,t,n,r){const o=jj(t),s=Ij(e,r)||{};s[o]=n;try{r.setItem(`PanelGroup:sizes:${e}`,JSON.stringify(s))}catch(i){console.error(i)}}const Ag={};function cC(e){try{if(typeof localStorage<"u")e.getItem=t=>localStorage.getItem(t),e.setItem=(t,n)=>{localStorage.setItem(t,n)};else throw new Error("localStorage not supported in this environment")}catch(t){console.error(t),e.getItem=()=>null,e.setItem=()=>{}}}const Fc={getItem:e=>(cC(Fc),Fc.getItem(e)),setItem:(e,t)=>{cC(Fc),Fc.setItem(e,t)}};function Ej({autoSaveId:e,children:t=null,className:n="",direction:r,disablePointerEventsDuringResize:o=!1,forwardedRef:s,id:i=null,onLayout:u,storage:d=Fc,style:p={},tagName:h="div"}){const g=$1(i),[v,b]=Jc(null),[S,w]=Jc(new Map),C=Vo(null),_=Vo({onLayout:u});pa(()=>{_.current.onLayout=u});const k=Vo({}),[j,E]=Jc([]),I=Vo(new Map),O=Vo(0),M=Vo({direction:r,panels:S,sizes:j});bj(s,()=>({getLayout:()=>{const{sizes:R}=M.current;return R},setLayout:R=>{const U=R.reduce((xe,he)=>xe+he,0);_j(U===100,"Panel sizes must add up to 100%");const{panels:V}=M.current,J=k.current,ie=Wo(V);E(R),hl(ie,R,J)}}),[]),Lp(()=>{M.current.direction=r,M.current.panels=S,M.current.sizes=j}),AK({committedValuesRef:M,groupId:g,panels:S,setSizes:E,sizes:j,panelSizeBeforeCollapse:I}),pa(()=>{const{onLayout:R}=_.current,{panels:U,sizes:V}=M.current;if(V.length>0){R&&R(V);const J=k.current,ie=Wo(U);hl(ie,V,J)}},[j]),Lp(()=>{if(M.current.sizes.length===S.size)return;let U=null;if(e){const V=Wo(S);U=HK(e,V,d)}if(U!=null)E(U);else{const V=Wo(S);let J=0,ie=0,xe=0;if(V.forEach(he=>{xe+=he.current.minSize,he.current.defaultSize===null?J++:ie+=he.current.defaultSize}),ie>100)throw new Error("Default panel sizes cannot exceed 100%");if(V.length>1&&J===0&&ie!==100)throw new Error("Invalid default sizes specified for panels");if(xe>100)throw new Error("Minimum panel sizes cannot exceed 100%");E(V.map(he=>he.current.defaultSize===null?(100-ie)/J:he.current.defaultSize))}},[e,S,d]),pa(()=>{if(e){if(j.length===0||j.length!==S.size)return;const R=Wo(S);Ag[e]||(Ag[e]=FK(WK,100)),Ag[e](e,R,j,d)}},[e,S,j,d]);const T=za((R,U)=>{const{panels:V}=M.current;return V.size===0?{flexBasis:0,flexGrow:U??void 0,flexShrink:1,overflow:"hidden"}:{flexBasis:0,flexGrow:wj(V,R,j),flexShrink:1,overflow:"hidden",pointerEvents:o&&v!==null?"none":void 0}},[v,o,j]),A=za((R,U)=>{w(V=>{if(V.has(R))return V;const J=new Map(V);return J.set(R,U),J})},[]),z=za(R=>V=>{V.preventDefault();const{direction:J,panels:ie,sizes:xe}=M.current,he=Wo(ie),[ae,Z]=L1(g,R,he);if(ae==null||Z==null)return;let W=zK(V,g,R,he,J,xe,C.current);if(W===0)return;const pe=z1(g).getBoundingClientRect(),ne=J==="horizontal";document.dir==="rtl"&&ne&&(W=-W);const ge=ne?pe.width:pe.height,ue=W/ge*100,Ce=Bc(V,ie,ae,Z,ue,xe,I.current,C.current),Re=!$K(xe,Ce);if((B0(V)||F0(V))&&O.current!=ue&&Tg(Re?ne?"horizontal":"vertical":ne?W<0?"horizontal-min":"horizontal-max":W<0?"vertical-min":"vertical-max"),Re){const me=k.current;E(Ce),hl(he,Ce,me)}O.current=ue},[g]),$=za(R=>{w(U=>{if(!U.has(R))return U;const V=new Map(U);return V.delete(R),V})},[]),ee=za(R=>{const{panels:U,sizes:V}=M.current,J=U.get(R);if(J==null)return;const{collapsedSize:ie,collapsible:xe}=J.current;if(!xe)return;const he=Wo(U),ae=he.indexOf(J);if(ae<0)return;const Z=V[ae];if(Z===ie)return;I.current.set(R,Z);const[W,re]=Dg(R,he);if(W==null||re==null)return;const ne=ae===he.length-1?Z:ie-Z,ge=Bc(null,U,W,re,ne,V,I.current,null);if(V!==ge){const ue=k.current;E(ge),hl(he,ge,ue)}},[]),B=za(R=>{const{panels:U,sizes:V}=M.current,J=U.get(R);if(J==null)return;const{collapsedSize:ie,minSize:xe}=J.current,he=I.current.get(R)||xe;if(!he)return;const ae=Wo(U),Z=ae.indexOf(J);if(Z<0||V[Z]!==ie)return;const[re,pe]=Dg(R,ae);if(re==null||pe==null)return;const ge=Z===ae.length-1?ie-he:he,ue=Bc(null,U,re,pe,ge,V,I.current,null);if(V!==ue){const Ce=k.current;E(ue),hl(ae,ue,Ce)}},[]),H=za((R,U)=>{const{panels:V,sizes:J}=M.current,ie=V.get(R);if(ie==null)return;const{collapsedSize:xe,collapsible:he,maxSize:ae,minSize:Z}=ie.current,W=Wo(V),re=W.indexOf(ie);if(re<0)return;const pe=J[re];if(pe===U)return;he&&U===xe||(U=Math.min(ae,Math.max(Z,U)));const[ne,ge]=Dg(R,W);if(ne==null||ge==null)return;const Ce=re===W.length-1?pe-U:U-pe,Re=Bc(null,V,ne,ge,Ce,J,I.current,null);if(J!==Re){const me=k.current;E(Re),hl(W,Re,me)}},[]),G=EK(()=>({activeHandleId:v,collapsePanel:ee,direction:r,expandPanel:B,getPanelStyle:T,groupId:g,registerPanel:A,registerResizeHandle:z,resizePanel:H,startDragging:(R,U)=>{if(b(R),B0(U)||F0(U)){const V=Rh(R);C.current={dragHandleRect:V.getBoundingClientRect(),dragOffset:kj(U,R,r),sizes:M.current.sizes}}},stopDragging:()=>{BK(),b(null),C.current=null},unregisterPanel:$}),[v,ee,r,B,T,g,A,z,H,$]),K={display:"flex",flexDirection:r==="horizontal"?"row":"column",height:"100%",overflow:"hidden",width:"100%"};return Fl(Mh.Provider,{children:Fl(h,{children:t,className:n,"data-panel-group":"","data-panel-group-direction":r,"data-panel-group-id":g,style:{...K,...p}}),value:G})}const B1=vj((e,t)=>Fl(Ej,{...e,forwardedRef:t}));Ej.displayName="PanelGroup";B1.displayName="forwardRef(PanelGroup)";function W0({children:e=null,className:t="",disabled:n=!1,id:r=null,onDragging:o,style:s={},tagName:i="div"}){const u=Vo(null),d=Vo({onDragging:o});pa(()=>{d.current.onDragging=o});const p=yj(Mh);if(p===null)throw Error("PanelResizeHandle components must be rendered within a PanelGroup container");const{activeHandleId:h,direction:g,groupId:v,registerResizeHandle:b,startDragging:S,stopDragging:w}=p,C=$1(r),_=h===C,[k,j]=Jc(!1),[E,I]=Jc(null),O=za(()=>{u.current.blur(),w();const{onDragging:A}=d.current;A&&A(!1)},[w]);pa(()=>{if(n)I(null);else{const T=b(C);I(()=>T)}},[n,C,b]),pa(()=>{if(n||E==null||!_)return;const T=ee=>{E(ee)},A=ee=>{E(ee)},$=u.current.ownerDocument;return $.body.addEventListener("contextmenu",O),$.body.addEventListener("mousemove",T),$.body.addEventListener("touchmove",T),$.body.addEventListener("mouseleave",A),window.addEventListener("mouseup",O),window.addEventListener("touchend",O),()=>{$.body.removeEventListener("contextmenu",O),$.body.removeEventListener("mousemove",T),$.body.removeEventListener("touchmove",T),$.body.removeEventListener("mouseleave",A),window.removeEventListener("mouseup",O),window.removeEventListener("touchend",O)}},[g,n,_,E,O]),NK({disabled:n,handleId:C,resizeHandler:E});const M={cursor:Pj(g),touchAction:"none",userSelect:"none"};return Fl(i,{children:e,className:t,"data-resize-handle-active":_?"pointer":k?"keyboard":void 0,"data-panel-group-direction":g,"data-panel-group-id":v,"data-panel-resize-handle-enabled":!n,"data-panel-resize-handle-id":C,onBlur:()=>j(!1),onFocus:()=>j(!0),onMouseDown:T=>{S(C,T.nativeEvent);const{onDragging:A}=d.current;A&&A(!0)},onMouseUp:O,onTouchCancel:O,onTouchEnd:O,onTouchStart:T=>{S(C,T.nativeEvent);const{onDragging:A}=d.current;A&&A(!0)},ref:u,role:"separator",style:{...M,...s},tabIndex:0})}W0.displayName="PanelResizeHandle";const VK=(e,t,n,r="horizontal")=>{const o=f.useRef(null),[s,i]=f.useState(t),u=f.useCallback(()=>{var p,h;const d=(p=o.current)==null?void 0:p.getSize();d!==void 0&&d{const d=document.querySelector(`[data-panel-group-id="${n}"]`),p=document.querySelectorAll("[data-panel-resize-handle-id]");if(!d)return;const h=new ResizeObserver(()=>{let g=r==="horizontal"?d.getBoundingClientRect().width:d.getBoundingClientRect().height;p.forEach(v=>{g-=r==="horizontal"?v.getBoundingClientRect().width:v.getBoundingClientRect().height}),i(e/g*100)});return h.observe(d),p.forEach(g=>{h.observe(g)}),window.addEventListener("resize",u),()=>{h.disconnect(),window.removeEventListener("resize",u)}},[n,u,s,e,r]),{ref:o,minSizePct:s}},UK=ve([Rt],e=>{const{initialImage:t}=e.generation;return{initialImage:t,isResetButtonDisabled:!t}},it),GK=()=>{const{initialImage:e}=L(UK),{currentData:t,isLoading:n,isError:r,isSuccess:o}=gs((e==null?void 0:e.imageName)??qo.skipToken),s=f.useMemo(()=>{if(t)return{id:"initial-image",payloadType:"IMAGE_DTO",payload:{imageDTO:t}}},[t]),i=f.useMemo(()=>({id:"initial-image",actionType:"SET_INITIAL_IMAGE"}),[]);return a.jsx(Ja,{imageDTO:t,droppableData:i,draggableData:s,isUploadDisabled:!0,fitContainer:!0,dropLabel:"Set as Initial Image",noContentFallback:a.jsx(Li,{label:"No initial image selected"})})},qK=ve([Rt],e=>{const{initialImage:t}=e.generation;return{isResetButtonDisabled:!t}},it),KK={type:"SET_INITIAL_IMAGE"},YK=()=>{const{isResetButtonDisabled:e}=L(qK),t=te(),{openUploader:n}=fh(),{getUploadButtonProps:r,getUploadInputProps:o}=z_({postUploadAction:KK}),s=f.useCallback(()=>{t(R8())},[t]),i=f.useCallback(()=>{n()},[n]);return a.jsxs(F,{layerStyle:"first",sx:{position:"relative",flexDirection:"column",height:"full",width:"full",alignItems:"center",justifyContent:"center",borderRadius:"base",p:4,gap:4},children:[a.jsxs(F,{sx:{w:"full",flexWrap:"wrap",justifyContent:"center",alignItems:"center",gap:2},children:[a.jsx(nt,{sx:{fontWeight:600,userSelect:"none",color:"base.700",_dark:{color:"base.200"}},children:"Initial Image"}),a.jsx($i,{}),a.jsx(je,{tooltip:"Upload Initial Image","aria-label":"Upload Initial Image",icon:a.jsx(Au,{}),onClick:i,...r()}),a.jsx(je,{tooltip:"Reset Initial Image","aria-label":"Reset Initial Image",icon:a.jsx(Yv,{}),onClick:s,isDisabled:e})]}),a.jsx(GK,{}),a.jsx("input",{...o()})]})},F1="28rem",Oj=e=>{const{sx:t}=e,n=te(),r=L(i=>i.ui.shouldPinParametersPanel),{t:o}=fe(),s=()=>{n(D8(!r)),n(vo())};return a.jsx(je,{...e,tooltip:o("common.pinOptionsPanel"),"aria-label":o("common.pinOptionsPanel"),onClick:s,icon:r?a.jsx(E5,{}):a.jsx(O5,{}),variant:"ghost",size:"sm",sx:{color:"base.500",_hover:{color:"base.600"},_active:{color:"base.700"},_dark:{color:"base.500",_hover:{color:"base.400"},_active:{color:"base.300"}},...t}})},QK=ve(Jr,e=>{const{shouldPinParametersPanel:t,shouldShowParametersPanel:n}=e;return{shouldPinParametersPanel:t,shouldShowParametersPanel:n}}),XK=e=>{const{shouldPinParametersPanel:t,shouldShowParametersPanel:n}=L(QK);return t&&n?a.jsxs(ze,{sx:{position:"relative",h:"full",w:F1,flexShrink:0},children:[a.jsx(F,{sx:{gap:2,flexDirection:"column",h:"full",w:"full",position:"absolute",overflowY:"auto"},children:e.children}),a.jsx(Oj,{sx:{position:"absolute",top:0,insetInlineEnd:0}})]}):null},H1=f.memo(XK),JK=e=>{const{direction:t="horizontal",...n}=e,{colorMode:r}=Ro();return t==="horizontal"?a.jsx(W0,{children:a.jsx(F,{sx:{w:6,h:"full",justifyContent:"center",alignItems:"center"},...n,children:a.jsx(ze,{sx:{w:.5,h:"calc(100% - 4px)",bg:ke("base.100","base.850")(r)}})})}):a.jsx(W0,{children:a.jsx(F,{sx:{w:"full",h:6,justifyContent:"center",alignItems:"center"},...n,children:a.jsx(ze,{sx:{w:"calc(100% - 4px)",h:.5,bg:ke("base.100","base.850")(r)}})})})},Mj=f.memo(JK),ZK=ve([Rt],({system:e})=>{const{isProcessing:t,isConnected:n}=e;return n&&!t}),eY=e=>{const{onClick:t,isDisabled:n}=e,{t:r}=fe(),o=L(ZK);return a.jsx(je,{onClick:t,icon:a.jsx(yo,{}),tooltip:`${r("gallery.deleteImage")} (Del)`,"aria-label":`${r("gallery.deleteImage")} (Del)`,isDisabled:n||!o,colorScheme:"error"})},Rj=f.forwardRef(({label:e,tooltip:t,description:n,disabled:r,...o},s)=>a.jsx(_n,{label:t,placement:"top",hasArrow:!0,openDelay:500,children:a.jsx(ze,{ref:s,...o,children:a.jsxs(ze,{children:[a.jsx(Nl,{children:e}),n&&a.jsx(Nl,{size:"xs",color:"base.600",children:n})]})})}));Rj.displayName="IAIMantineSelectItemWithTooltip";const Vi=f.memo(Rj),tY=[{label:"RealESRGAN x2 Plus",value:"RealESRGAN_x2plus.pth",tooltip:"Attempts to retain sharpness, low smoothing",group:"x2 Upscalers"},{label:"RealESRGAN x4 Plus",value:"RealESRGAN_x4plus.pth",tooltip:"Best for photos and highly detailed images, medium smoothing",group:"x4 Upscalers"},{label:"RealESRGAN x4 Plus (anime 6B)",value:"RealESRGAN_x4plus_anime_6B.pth",tooltip:"Best for anime/manga, high smoothing",group:"x4 Upscalers"},{label:"ESRGAN SRx4",value:"ESRGAN_SRx4_DF2KOST_official-ff704c30.pth",tooltip:"Retains sharpness, low smoothing",group:"x4 Upscalers"}];function nY(){const e=L(r=>r.postprocessing.esrganModelName),t=te(),n=r=>t(T8(r));return a.jsx(Do,{label:"ESRGAN Model",value:e,itemComponent:Vi,onChange:n,data:tY})}const rY=e=>{const{imageDTO:t}=e,n=te(),r=L($r),{t:o}=fe(),{isOpen:s,onOpen:i,onClose:u}=Ws(),d=f.useCallback(()=>{u(),t&&n(A4({image_name:t.image_name}))},[n,t,u]);return a.jsx(zi,{isOpen:s,onClose:u,triggerComponent:a.jsx(je,{onClick:i,icon:a.jsx(d$,{}),"aria-label":o("parameters.upscale")}),children:a.jsxs(F,{sx:{flexDirection:"column",gap:4},children:[a.jsx(nY,{}),a.jsx(Zt,{size:"sm",isDisabled:!t||r,onClick:d,children:o("parameters.upscaleImage")})]})})};function oY(e,t,n){var r=this,o=f.useRef(null),s=f.useRef(0),i=f.useRef(null),u=f.useRef([]),d=f.useRef(),p=f.useRef(),h=f.useRef(e),g=f.useRef(!0);f.useEffect(function(){h.current=e},[e]);var v=!t&&t!==0&&typeof window<"u";if(typeof e!="function")throw new TypeError("Expected a function");t=+t||0;var b=!!(n=n||{}).leading,S=!("trailing"in n)||!!n.trailing,w="maxWait"in n,C=w?Math.max(+n.maxWait||0,t):null;f.useEffect(function(){return g.current=!0,function(){g.current=!1}},[]);var _=f.useMemo(function(){var k=function(T){var A=u.current,z=d.current;return u.current=d.current=null,s.current=T,p.current=h.current.apply(z,A)},j=function(T,A){v&&cancelAnimationFrame(i.current),i.current=v?requestAnimationFrame(T):setTimeout(T,A)},E=function(T){if(!g.current)return!1;var A=T-o.current;return!o.current||A>=t||A<0||w&&T-s.current>=C},I=function(T){return i.current=null,S&&u.current?k(T):(u.current=d.current=null,p.current)},O=function T(){var A=Date.now();if(E(A))return I(A);if(g.current){var z=t-(A-o.current),$=w?Math.min(z,C-(A-s.current)):z;j(T,$)}},M=function(){var T=Date.now(),A=E(T);if(u.current=[].slice.call(arguments),d.current=r,o.current=T,A){if(!i.current&&g.current)return s.current=o.current,j(O,t),b?k(o.current):p.current;if(w)return j(O,t),k(o.current)}return i.current||j(O,t),p.current};return M.cancel=function(){i.current&&(v?cancelAnimationFrame(i.current):clearTimeout(i.current)),s.current=0,u.current=o.current=d.current=i.current=null},M.isPending=function(){return!!i.current},M.flush=function(){return i.current?I(Date.now()):p.current},M},[b,w,t,C,S,v]);return _}function sY(e,t){return e===t}function uC(e){return typeof e=="function"?function(){return e}:e}function Dj(e,t,n){var r,o,s=n&&n.equalityFn||sY,i=(r=f.useState(uC(e)),o=r[1],[r[0],f.useCallback(function(g){return o(uC(g))},[])]),u=i[0],d=i[1],p=oY(f.useCallback(function(g){return d(g)},[d]),t,n),h=f.useRef(e);return s(h.current,e)||(p(e),h.current=e),[u,p]}const aY=ve([Rt,ur],({gallery:e,system:t,ui:n},r)=>{const{isProcessing:o,isConnected:s,shouldConfirmOnDelete:i,progressImage:u}=t,{shouldShowImageDetails:d,shouldHidePreview:p,shouldShowProgressInViewer:h}=n,g=e.selection[e.selection.length-1];return{canDeleteImage:s&&!o,shouldConfirmOnDelete:i,isProcessing:o,isConnected:s,shouldDisableToolbarButtons:!!u||!g,shouldShowImageDetails:d,activeTabName:r,shouldHidePreview:p,shouldShowProgressInViewer:h,lastSelectedImage:g}},{memoizeOptions:{resultEqualityCheck:Qt}}),iY=e=>{const t=te(),{isProcessing:n,isConnected:r,shouldDisableToolbarButtons:o,shouldShowImageDetails:s,lastSelectedImage:i,shouldShowProgressInViewer:u}=L(aY),d=br("upscaling").isFeatureEnabled,p=Ql(),{t:h}=fe(),{recallBothPrompts:g,recallSeed:v,recallAllParameters:b}=y1(),[S,w]=Dj(i,500),{currentData:C,isFetching:_}=gs(i??qo.skipToken),{currentData:k}=cv(w.isPending()?qo.skipToken:S??qo.skipToken),j=k==null?void 0:k.metadata,E=f.useCallback(()=>{b(j)},[j,b]);Ke("a",()=>{},[j,b]);const I=f.useCallback(()=>{v(j==null?void 0:j.seed)},[j==null?void 0:j.seed,v]);Ke("s",I,[C]);const O=f.useCallback(()=>{g(j==null?void 0:j.positive_prompt,j==null?void 0:j.negative_prompt)},[j==null?void 0:j.negative_prompt,j==null?void 0:j.positive_prompt,g]);Ke("p",O,[C]);const M=f.useCallback(()=>{t(k4()),t(If(C))},[t,C]);Ke("shift+i",M,[C]);const T=f.useCallback(()=>{C&&t(A4({image_name:C.image_name}))},[t,C]),A=f.useCallback(()=>{C&&t(uv(C))},[t,C]);Ke("Shift+U",()=>{T()},{enabled:()=>!!(d&&!o&&r&&!n)},[d,C,o,r,n]);const z=f.useCallback(()=>t(A8(!s)),[t,s]);Ke("i",()=>{C?z():p({title:h("toast.metadataLoadFailed"),status:"error",duration:2500,isClosable:!0})},[C,s,p]);const $=f.useCallback(()=>{t(T4(!u))},[t,u]);return a.jsx(a.Fragment,{children:a.jsxs(F,{sx:{flexWrap:"wrap",justifyContent:"center",alignItems:"center",gap:2},...e,children:[a.jsx(Yn,{isAttached:!0,isDisabled:o,children:a.jsxs(Iu,{children:[a.jsx(Eu,{as:je,"aria-label":`${h("parameters.sendTo")}...`,tooltip:`${h("parameters.sendTo")}...`,isDisabled:!C,icon:a.jsx(M$,{})}),a.jsx(tc,{motionProps:C3,children:C&&a.jsx(L_,{imageDTO:C})})]})}),a.jsxs(Yn,{isAttached:!0,isDisabled:o,children:[a.jsx(je,{icon:a.jsx(B5,{}),tooltip:`${h("parameters.usePrompt")} (P)`,"aria-label":`${h("parameters.usePrompt")} (P)`,isDisabled:!(j!=null&&j.positive_prompt),onClick:O}),a.jsx(je,{icon:a.jsx(F5,{}),tooltip:`${h("parameters.useSeed")} (S)`,"aria-label":`${h("parameters.useSeed")} (S)`,isDisabled:!(j!=null&&j.seed),onClick:I}),a.jsx(je,{icon:a.jsx(R5,{}),tooltip:`${h("parameters.useAll")} (A)`,"aria-label":`${h("parameters.useAll")} (A)`,isDisabled:!j,onClick:E})]}),d&&a.jsx(Yn,{isAttached:!0,isDisabled:o,children:d&&a.jsx(rY,{imageDTO:C})}),a.jsx(Yn,{isAttached:!0,isDisabled:o,children:a.jsx(je,{icon:a.jsx(Uv,{}),tooltip:`${h("parameters.info")} (I)`,"aria-label":`${h("parameters.info")} (I)`,isChecked:s,onClick:z})}),a.jsx(Yn,{isAttached:!0,children:a.jsx(je,{"aria-label":h("settings.displayInProgress"),tooltip:h("settings.displayInProgress"),icon:a.jsx(y$,{}),isChecked:u,onClick:$})}),a.jsx(Yn,{isAttached:!0,children:a.jsx(eY,{onClick:A,isDisabled:o})})]})})},lY=ve([Rt,P4],(e,t)=>{const{total:n,isFetching:r}=e.gallery,o=e.gallery.selection[e.gallery.selection.length-1];if(!o||t.length===0)return{isOnFirstImage:!0,isOnLastImage:!0};const s=t.findIndex(b=>b.image_name===o),i=Vs(s+1,0,t.length-1),u=Vs(s-1,0,t.length-1),d=t[i].image_name,p=t[u].image_name,h=rx(e,d),g=rx(e,p),v=t.length;return{isOnFirstImage:s===0,isOnLastImage:!isNaN(s)&&s===v-1,areMoreImagesAvailable:n>v,isFetching:r,nextImage:h,prevImage:g,nextImageId:d,prevImageId:p}},{memoizeOptions:{resultEqualityCheck:Qt}}),Tj=()=>{const e=te(),{isOnFirstImage:t,isOnLastImage:n,nextImageId:r,prevImageId:o,areMoreImagesAvailable:s,isFetching:i}=L(lY),u=f.useCallback(()=>{o&&e(Ef(o))},[e,o]),d=f.useCallback(()=>{r&&e(Ef(r))},[e,r]),p=f.useCallback(()=>{e(j4({is_intermediate:!1}))},[e]);return{handlePrevImage:u,handleNextImage:d,isOnFirstImage:t,isOnLastImage:n,nextImageId:r,prevImageId:o,areMoreImagesAvailable:s,handleLoadMoreImages:p,isFetching:i}},as=({label:e,value:t,onClick:n,isLink:r,labelPosition:o,withCopy:s=!1})=>{const{t:i}=fe();return t?a.jsxs(F,{gap:2,children:[n&&a.jsx(_n,{label:`Recall ${e}`,children:a.jsx(qa,{"aria-label":i("accessibility.useThisParameter"),icon:a.jsx(nF,{}),size:"xs",variant:"ghost",fontSize:20,onClick:n})}),s&&a.jsx(_n,{label:`Copy ${e}`,children:a.jsx(qa,{"aria-label":`Copy ${e}`,icon:a.jsx(rc,{}),size:"xs",variant:"ghost",fontSize:14,onClick:()=>navigator.clipboard.writeText(t.toString())})}),a.jsxs(F,{direction:o?"column":"row",children:[a.jsxs(nt,{fontWeight:"semibold",whiteSpace:"pre-wrap",pr:2,children:[e,":"]}),r?a.jsxs(Ka,{href:t.toString(),isExternal:!0,wordBreak:"break-all",children:[t.toString()," ",a.jsx(H5,{mx:"2px"})]}):a.jsx(nt,{overflowY:"scroll",wordBreak:"break-all",children:t.toString()})]})]}):null},cY=e=>{const{metadata:t}=e,{recallBothPrompts:n,recallPositivePrompt:r,recallNegativePrompt:o,recallSeed:s,recallInitialImage:i,recallCfgScale:u,recallModel:d,recallScheduler:p,recallSteps:h,recallWidth:g,recallHeight:v,recallStrength:b,recallAllParameters:S}=y1(),w=f.useCallback(()=>{r(t==null?void 0:t.positive_prompt)},[t==null?void 0:t.positive_prompt,r]),C=f.useCallback(()=>{o(t==null?void 0:t.negative_prompt)},[t==null?void 0:t.negative_prompt,o]),_=f.useCallback(()=>{s(t==null?void 0:t.seed)},[t==null?void 0:t.seed,s]),k=f.useCallback(()=>{d(t==null?void 0:t.model)},[t==null?void 0:t.model,d]),j=f.useCallback(()=>{g(t==null?void 0:t.width)},[t==null?void 0:t.width,g]),E=f.useCallback(()=>{v(t==null?void 0:t.height)},[t==null?void 0:t.height,v]),I=f.useCallback(()=>{p(t==null?void 0:t.scheduler)},[t==null?void 0:t.scheduler,p]),O=f.useCallback(()=>{h(t==null?void 0:t.steps)},[t==null?void 0:t.steps,h]),M=f.useCallback(()=>{u(t==null?void 0:t.cfg_scale)},[t==null?void 0:t.cfg_scale,u]),T=f.useCallback(()=>{b(t==null?void 0:t.strength)},[t==null?void 0:t.strength,b]);return!t||Object.keys(t).length===0?null:a.jsxs(a.Fragment,{children:[t.generation_mode&&a.jsx(as,{label:"Generation Mode",value:t.generation_mode}),t.positive_prompt&&a.jsx(as,{label:"Positive Prompt",labelPosition:"top",value:t.positive_prompt,onClick:w}),t.negative_prompt&&a.jsx(as,{label:"Negative Prompt",labelPosition:"top",value:t.negative_prompt,onClick:C}),t.seed!==void 0&&a.jsx(as,{label:"Seed",value:t.seed,onClick:_}),t.model!==void 0&&a.jsx(as,{label:"Model",value:t.model.model_name,onClick:k}),t.width&&a.jsx(as,{label:"Width",value:t.width,onClick:j}),t.height&&a.jsx(as,{label:"Height",value:t.height,onClick:E}),t.scheduler&&a.jsx(as,{label:"Scheduler",value:t.scheduler,onClick:I}),t.steps&&a.jsx(as,{label:"Steps",value:t.steps,onClick:O}),t.cfg_scale!==void 0&&a.jsx(as,{label:"CFG scale",value:t.cfg_scale,onClick:M}),t.strength&&a.jsx(as,{label:"Image to image strength",value:t.strength,onClick:T})]})},uY=e=>{const{copyTooltip:t,jsonObject:n}=e,r=f.useMemo(()=>JSON.stringify(n,null,2),[n]);return a.jsxs(F,{sx:{borderRadius:"base",bg:"whiteAlpha.500",_dark:{bg:"blackAlpha.500"},flexGrow:1,w:"full",h:"full",position:"relative"},children:[a.jsx(ze,{sx:{position:"absolute",top:0,left:0,right:0,bottom:0,overflow:"auto",p:4},children:a.jsx(v_,{defer:!0,style:{height:"100%",width:"100%"},options:{scrollbars:{visibility:"auto",autoHide:"move",autoHideDelay:1300,theme:"os-theme-dark"}},children:a.jsx("pre",{children:r})})}),a.jsx(F,{sx:{position:"absolute",top:0,insetInlineEnd:0,p:2},children:a.jsx(_n,{label:t,children:a.jsx(qa,{"aria-label":t,icon:a.jsx(rc,{}),variant:"ghost",onClick:()=>navigator.clipboard.writeText(r)})})})]})},dY=({image:e})=>{const[t,n]=Dj(e.image_name,500),{currentData:r}=cv(n.isPending()?qo.skipToken:t??qo.skipToken),o=r==null?void 0:r.metadata,s=r==null?void 0:r.graph,i=f.useMemo(()=>{const u=[];return o&&u.push({label:"Core Metadata",data:o,copyTooltip:"Copy Core Metadata JSON"}),e&&u.push({label:"Image Details",data:e,copyTooltip:"Copy Image Details JSON"}),s&&u.push({label:"Graph",data:s,copyTooltip:"Copy Graph JSON"}),u},[o,s,e]);return a.jsxs(F,{sx:{padding:4,gap:1,flexDirection:"column",width:"full",height:"full",backdropFilter:"blur(20px)",bg:"baseAlpha.200",_dark:{bg:"blackAlpha.600"},borderRadius:"base",position:"absolute",overflow:"hidden"},children:[a.jsxs(F,{gap:2,children:[a.jsx(nt,{fontWeight:"semibold",children:"File:"}),a.jsxs(Ka,{href:e.image_url,isExternal:!0,maxW:"calc(100% - 3rem)",children:[e.image_name,a.jsx(H5,{mx:"2px"})]})]}),a.jsx(cY,{metadata:o}),a.jsxs(ih,{variant:"line",sx:{display:"flex",flexDir:"column",w:"full",h:"full"},children:[a.jsx(lh,{children:i.map(u=>a.jsx(dh,{sx:{borderTopRadius:"base"},children:a.jsx(nt,{sx:{color:"base.700",_dark:{color:"base.300"}},children:u.label})},u.label))}),a.jsx(uh,{sx:{w:"full",h:"full"},children:i.map(u=>a.jsx(ch,{sx:{w:"full",h:"full",p:0,pt:4},children:a.jsx(uY,{jsonObject:u.data,copyTooltip:u.copyTooltip})},u.label))})]})]})},fY=f.memo(dY),Ng={color:"base.100",pointerEvents:"auto"},pY=()=>{const{t:e}=fe(),{handlePrevImage:t,handleNextImage:n,isOnFirstImage:r,isOnLastImage:o,handleLoadMoreImages:s,areMoreImagesAvailable:i,isFetching:u}=Tj();return a.jsxs(ze,{sx:{position:"relative",height:"100%",width:"100%"},children:[a.jsx(ze,{sx:{pos:"absolute",top:"50%",transform:"translate(0, -50%)",insetInlineStart:0},children:!r&&a.jsx(qa,{"aria-label":e("accessibility.previousImage"),icon:a.jsx(t$,{size:64}),variant:"unstyled",onClick:t,boxSize:16,sx:Ng})}),a.jsxs(ze,{sx:{pos:"absolute",top:"50%",transform:"translate(0, -50%)",insetInlineEnd:0},children:[!o&&a.jsx(qa,{"aria-label":e("accessibility.nextImage"),icon:a.jsx(n$,{size:64}),variant:"unstyled",onClick:n,boxSize:16,sx:Ng}),o&&i&&!u&&a.jsx(qa,{"aria-label":e("accessibility.loadMore"),icon:a.jsx(e$,{size:64}),variant:"unstyled",onClick:s,boxSize:16,sx:Ng}),o&&i&&u&&a.jsx(F,{sx:{w:16,h:16,alignItems:"center",justifyContent:"center"},children:a.jsx(Jl,{opacity:.5,size:"xl"})})]})]})},hY=f.memo(pY),mY=ve([Rt,N8],({ui:e,system:t},n)=>{const{shouldShowImageDetails:r,shouldHidePreview:o,shouldShowProgressInViewer:s}=e,{progressImage:i,shouldAntialiasProgressImage:u}=t;return{shouldShowImageDetails:r,shouldHidePreview:o,imageName:n,progressImage:i,shouldShowProgressInViewer:s,shouldAntialiasProgressImage:u}},{memoizeOptions:{resultEqualityCheck:Qt}}),gY=()=>{const{shouldShowImageDetails:e,imageName:t,progressImage:n,shouldShowProgressInViewer:r,shouldAntialiasProgressImage:o}=L(mY),{handlePrevImage:s,handleNextImage:i,prevImageId:u,nextImageId:d,isOnLastImage:p,handleLoadMoreImages:h,areMoreImagesAvailable:g,isFetching:v}=Tj();Ke("left",()=>{s()},[u]),Ke("right",()=>{if(p&&g&&!v){h();return}p||i()},[d,p,g,h,v]);const{currentData:b,isLoading:S,isError:w,isSuccess:C}=gs(t??qo.skipToken),_=f.useMemo(()=>{if(b)return{id:"current-image",payloadType:"IMAGE_DTO",payload:{imageDTO:b}}},[b]),k=f.useMemo(()=>({id:"current-image",actionType:"SET_CURRENT_IMAGE"}),[]),[j,E]=f.useState(!1),I=f.useRef(0),O=f.useCallback(()=>{E(!0),window.clearTimeout(I.current)},[]),M=f.useCallback(()=>{I.current=window.setTimeout(()=>{E(!1)},500)},[]);return a.jsxs(F,{onMouseOver:O,onMouseOut:M,sx:{width:"full",height:"full",alignItems:"center",justifyContent:"center",position:"relative"},children:[n&&r?a.jsx(bu,{src:n.dataURL,width:n.width,height:n.height,draggable:!1,sx:{objectFit:"contain",maxWidth:"full",maxHeight:"full",height:"auto",position:"absolute",borderRadius:"base",imageRendering:o?"auto":"pixelated"}}):a.jsx(Ja,{imageDTO:b,droppableData:k,draggableData:_,isUploadDisabled:!0,fitContainer:!0,dropLabel:"Set as Current Image"}),e&&b&&a.jsx(ze,{sx:{position:"absolute",top:"0",width:"full",height:"full",borderRadius:"base"},children:a.jsx(fY,{image:b})}),a.jsx(ws,{children:!e&&b&&j&&a.jsx(io.div,{initial:{opacity:0},animate:{opacity:1,transition:{duration:.1}},exit:{opacity:0,transition:{duration:.1}},style:{position:"absolute",top:"0",width:"100%",height:"100%",pointerEvents:"none"},children:a.jsx(hY,{})},"nextPrevButtons")})]})},vY=f.memo(gY),yY=()=>a.jsxs(F,{sx:{position:"relative",flexDirection:"column",height:"100%",width:"100%",rowGap:4,alignItems:"center",justifyContent:"center"},children:[a.jsx(iY,{}),a.jsx(vY,{})]}),Aj=()=>a.jsx(ze,{layerStyle:"first",sx:{position:"relative",width:"100%",height:"100%",p:4,borderRadius:"base"},children:a.jsx(F,{sx:{width:"100%",height:"100%"},children:a.jsx(yY,{})})}),bY=e=>{const{label:t,activeLabel:n,children:r,defaultIsOpen:o=!1}=e,{isOpen:s,onToggle:i}=Ws({defaultIsOpen:o}),{colorMode:u}=Ro();return a.jsxs(ze,{children:[a.jsxs(F,{onClick:i,sx:{alignItems:"center",p:2,px:4,gap:2,borderTopRadius:"base",borderBottomRadius:s?0:"base",bg:s?ke("base.200","base.750")(u):ke("base.150","base.800")(u),color:ke("base.900","base.100")(u),_hover:{bg:s?ke("base.250","base.700")(u):ke("base.200","base.750")(u)},fontSize:"sm",fontWeight:600,cursor:"pointer",transitionProperty:"common",transitionDuration:"normal",userSelect:"none"},children:[t,a.jsx(ws,{children:n&&a.jsx(io.div,{initial:{opacity:0},animate:{opacity:1,transition:{duration:.1}},exit:{opacity:0,transition:{duration:.1}},children:a.jsx(nt,{sx:{color:"accent.500",_dark:{color:"accent.300"}},children:n})},"statusText")}),a.jsx($i,{}),a.jsx(Xv,{sx:{w:"1rem",h:"1rem",transform:s?"rotate(0deg)":"rotate(180deg)",transitionProperty:"common",transitionDuration:"normal"}})]}),a.jsx(Jp,{in:s,animateOpacity:!0,style:{overflow:"unset"},children:a.jsx(ze,{sx:{p:4,borderBottomRadius:"base",bg:ke("base.100","base.800")(u)},children:r})})]})},To=f.memo(bY),xY=ve(Rt,e=>{const{combinatorial:t,isEnabled:n}=e.dynamicPrompts;return{combinatorial:t,isDisabled:!n}},it),wY=()=>{const{combinatorial:e,isDisabled:t}=L(xY),n=te(),r=f.useCallback(()=>{n($8())},[n]);return a.jsx(jn,{isDisabled:t,label:"Combinatorial Generation",isChecked:e,onChange:r})},SY=ve(Rt,e=>{const{isEnabled:t}=e.dynamicPrompts;return{isEnabled:t}},it),CY=()=>{const e=te(),{isEnabled:t}=L(SY),n=f.useCallback(()=>{e(z8())},[e]);return a.jsx(jn,{label:"Enable Dynamic Prompts",isChecked:t,onChange:n})},_Y=ve(Rt,e=>{const{maxPrompts:t,combinatorial:n,isEnabled:r}=e.dynamicPrompts,{min:o,sliderMax:s,inputMax:i}=e.config.sd.dynamicPrompts.maxPrompts;return{maxPrompts:t,min:o,sliderMax:s,inputMax:i,isDisabled:!r||!n}},it),kY=()=>{const{maxPrompts:e,min:t,sliderMax:n,inputMax:r,isDisabled:o}=L(_Y),s=te(),i=f.useCallback(d=>{s(L8(d))},[s]),u=f.useCallback(()=>{s(B8())},[s]);return a.jsx(St,{label:"Max Prompts",isDisabled:o,min:t,max:n,value:e,onChange:i,sliderNumberInputProps:{max:r},withSliderMarks:!0,withInput:!0,withReset:!0,handleReset:u})},PY=ve(Rt,e=>{const{isEnabled:t}=e.dynamicPrompts;return{activeLabel:t?"Enabled":void 0}},it),W1=()=>{const{activeLabel:e}=L(PY);return br("dynamicPrompting").isFeatureEnabled?a.jsx(To,{label:"Dynamic Prompts",activeLabel:e,children:a.jsxs(F,{sx:{gap:2,flexDir:"column"},children:[a.jsx(CY,{}),a.jsx(wY,{}),a.jsx(kY,{})]})}):null},jY=e=>{const t=te(),{lora:n}=e,r=f.useCallback(i=>{t(F8({id:n.id,weight:i}))},[t,n.id]),o=f.useCallback(()=>{t(H8(n.id))},[t,n.id]),s=f.useCallback(()=>{t(W8(n.id))},[t,n.id]);return a.jsxs(F,{sx:{gap:2.5,alignItems:"flex-end"},children:[a.jsx(St,{label:n.model_name,value:n.weight,onChange:r,min:-1,max:2,step:.01,withInput:!0,withReset:!0,handleReset:o,withSliderMarks:!0,sliderMarks:[-1,0,1,2]}),a.jsx(je,{size:"sm",onClick:s,tooltip:"Remove LoRA","aria-label":"Remove LoRA",icon:a.jsx(yo,{}),colorScheme:"error"})]})},IY=f.memo(jY),EY=ve(Rt,({lora:e})=>{const{loras:t}=e;return{loras:t}},it),OY=()=>{const{loras:e}=L(EY);return Cs(e,t=>a.jsx(IY,{lora:t},t.model_name))},MY=e=>{const{searchable:t=!0,tooltip:n,inputRef:r,onChange:o,label:s,disabled:i,...u}=e,d=te(),[p,h]=f.useState(""),g=f.useCallback(w=>{w.shiftKey&&d(Ko(!0))},[d]),v=f.useCallback(w=>{w.shiftKey||d(Ko(!1))},[d]),b=f.useCallback(w=>{h(""),o&&o(w)},[o]),S=gj();return a.jsx(_n,{label:n,placement:"top",hasArrow:!0,children:a.jsx(A1,{ref:r,label:s?a.jsx(Ss,{isDisabled:i,children:a.jsx(vs,{children:s})}):void 0,disabled:i,searchValue:p,onSearchChange:h,onChange:b,onKeyDown:g,onKeyUp:v,searchable:t,maxDropdownHeight:300,styles:S,...u})})},Mr=f.memo(MY),Or={"sd-1":"Stable Diffusion 1.x","sd-2":"Stable Diffusion 2.x",sdxl:"Stable Diffusion XL","sdxl-refiner":"Stable Diffusion XL Refiner"},RY=ve(Rt,({lora:e})=>({loras:e.loras}),it),DY=()=>{const e=te(),{loras:t}=L(RY),{data:n}=N4(),r=L(i=>i.generation.model),o=f.useMemo(()=>{if(!n)return[];const i=[];return Qo(n.entities,(u,d)=>{if(!u||d in t)return;const p=(r==null?void 0:r.base_model)!==u.base_model;i.push({value:d,label:u.model_name,disabled:p,group:Or[u.base_model],tooltip:p?`Incompatible base model: ${u.base_model}`:void 0})}),i.sort((u,d)=>u.disabled&&!d.disabled?1:-1)},[t,n,r==null?void 0:r.base_model]),s=f.useCallback(i=>{if(!i)return;const u=n==null?void 0:n.entities[i];u&&e(V8(u))},[e,n==null?void 0:n.entities]);return(n==null?void 0:n.ids.length)===0?a.jsx(F,{sx:{justifyContent:"center",p:2},children:a.jsx(nt,{sx:{fontSize:"sm",color:"base.500",_dark:"base.700"},children:"No LoRAs Loaded"})}):a.jsx(Mr,{placeholder:o.length===0?"All LoRAs added":"Add LoRA",value:null,data:o,nothingFound:"No matching LoRAs",itemComponent:Vi,disabled:o.length===0,filter:(i,u)=>{var d;return((d=u.label)==null?void 0:d.toLowerCase().includes(i.toLowerCase().trim()))||u.value.toLowerCase().includes(i.toLowerCase().trim())},onChange:s})},TY=ve(Rt,e=>{const t=U8(e.lora.loras);return{activeLabel:t>0?`${t} Active`:void 0}},it),AY=()=>{const{activeLabel:e}=L(TY);return br("lora").isFeatureEnabled?a.jsx(To,{label:"LoRA",activeLabel:e,children:a.jsxs(F,{sx:{flexDir:"column",gap:2},children:[a.jsx(DY,{}),a.jsx(OY,{})]})}):null},V1=f.memo(AY),NY=ve(Rt,e=>({activeLabel:e.generation.clipSkip>0?"Clip Skip":void 0}),it);function U1(){const{activeLabel:e}=L(NY);return L(n=>n.ui.shouldShowAdvancedOptions)&&a.jsx(To,{label:"Advanced",activeLabel:e,children:a.jsx(F,{sx:{flexDir:"column",gap:2},children:a.jsx(G8,{})})})}const $Y=Yp.child({module:"models"}),Nj=e=>{const[t,n,r]=e.split("/"),o=q8.safeParse({base_model:t,model_name:r});if(!o.success){$Y.error({controlNetModelId:e,errors:o.error.format()},"Failed to parse ControlNet model id");return}return o.data},zY=e=>{const{controlNetId:t}=e,n=te(),r=L($r),o=f.useMemo(()=>ve(Rt,({generation:v,controlNet:b})=>{var _,k;const{model:S}=v,w=(_=b.controlNets[t])==null?void 0:_.model,C=(k=b.controlNets[t])==null?void 0:k.isEnabled;return{mainModel:S,controlNetModel:w,isEnabled:C}},it),[t]),{mainModel:s,controlNetModel:i,isEnabled:u}=L(o),{data:d}=fv(),p=f.useMemo(()=>{if(!d)return[];const v=[];return Qo(d.entities,(b,S)=>{if(!b)return;const w=(b==null?void 0:b.base_model)!==(s==null?void 0:s.base_model);v.push({value:S,label:b.model_name,group:Or[b.base_model],disabled:w,tooltip:w?`Incompatible base model: ${b.base_model}`:void 0})}),v},[d,s==null?void 0:s.base_model]),h=f.useMemo(()=>(d==null?void 0:d.entities[`${i==null?void 0:i.base_model}/controlnet/${i==null?void 0:i.model_name}`])??null,[i==null?void 0:i.base_model,i==null?void 0:i.model_name,d==null?void 0:d.entities]),g=f.useCallback(v=>{if(!v)return;const b=Nj(v);b&&n($4({controlNetId:t,model:b}))},[t,n]);return a.jsx(Mr,{itemComponent:Vi,data:p,error:!h||(s==null?void 0:s.base_model)!==h.base_model,placeholder:"Select a model",value:(h==null?void 0:h.id)??null,onChange:g,disabled:r||!u,tooltip:h==null?void 0:h.description})},LY=f.memo(zY),BY=e=>{const{controlNetId:t}=e,n=te(),r=f.useMemo(()=>ve(Rt,({controlNet:u})=>{const{weight:d,isEnabled:p}=u.controlNets[t];return{weight:d,isEnabled:p}},it),[t]),{weight:o,isEnabled:s}=L(r),i=f.useCallback(u=>{n(K8({controlNetId:t,weight:u}))},[t,n]);return a.jsx(St,{isDisabled:!s,label:"Weight",value:o,onChange:i,min:0,max:2,step:.01,withSliderMarks:!0,sliderMarks:[0,1,2]})},FY=f.memo(BY),HY=e=>{const{height:t,controlNetId:n}=e,r=te(),o=f.useMemo(()=>ve(Rt,({controlNet:$})=>{const{pendingControlImages:ee}=$,{controlImage:B,processedControlImage:H,processorType:G,isEnabled:K}=$.controlNets[n];return{controlImageName:B,processedControlImageName:H,processorType:G,isEnabled:K,pendingControlImages:ee}},it),[n]),{controlImageName:s,processedControlImageName:i,processorType:u,pendingControlImages:d,isEnabled:p}=L(o),[h,g]=f.useState(!1),{currentData:v,isLoading:b,isError:S,isSuccess:w}=gs(s??qo.skipToken),{currentData:C,isLoading:_,isError:k,isSuccess:j}=gs(i??qo.skipToken),E=f.useCallback(()=>{r(Y8({controlNetId:n,controlImage:null}))},[n,r]),I=f.useCallback(()=>{g(!0)},[]),O=f.useCallback(()=>{g(!1)},[]),M=f.useMemo(()=>{if(v)return{id:n,payloadType:"IMAGE_DTO",payload:{imageDTO:v}}},[v,n]),T=f.useMemo(()=>({id:n,actionType:"SET_CONTROLNET_IMAGE",context:{controlNetId:n}}),[n]),A=f.useMemo(()=>({type:"SET_CONTROLNET_IMAGE",controlNetId:n}),[n]),z=v&&C&&!h&&!d.includes(n)&&u!=="none";return a.jsxs(F,{onMouseEnter:I,onMouseLeave:O,sx:{position:"relative",w:"full",h:t,alignItems:"center",justifyContent:"center",pointerEvents:p?"auto":"none",opacity:p?1:.5},children:[a.jsx(Ja,{draggableData:M,droppableData:T,imageDTO:v,isDropDisabled:z||!p,onClickReset:E,postUploadAction:A,resetTooltip:"Reset Control Image",withResetIcon:!!v}),a.jsx(ze,{sx:{position:"absolute",top:0,insetInlineStart:0,w:"full",h:"full",opacity:z?1:0,transitionProperty:"common",transitionDuration:"normal",pointerEvents:"none"},children:a.jsx(Ja,{draggableData:M,droppableData:T,imageDTO:C,isUploadDisabled:!0,isDropDisabled:!p,onClickReset:E,resetTooltip:"Reset Control Image",withResetIcon:!!v})}),d.includes(n)&&a.jsx(F,{sx:{position:"absolute",top:0,insetInlineStart:0,w:"full",h:"full",alignItems:"center",justifyContent:"center",opacity:.8,borderRadius:"base",bg:"base.400",_dark:{bg:"base.900"}},children:a.jsx(Jl,{size:"xl",sx:{color:"base.100",_dark:{color:"base.400"}}})})]})},dC=f.memo(HY),_s=()=>{const e=te();return f.useCallback((n,r)=>{e(Q8({controlNetId:n,changes:r}))},[e])};function ks(e){return a.jsx(F,{sx:{flexDirection:"column",gap:2},children:e.children})}const fC=Xo.canny_image_processor.default,WY=e=>{const{controlNetId:t,processorNode:n,isEnabled:r}=e,{low_threshold:o,high_threshold:s}=n,i=L($r),u=_s(),d=f.useCallback(v=>{u(t,{low_threshold:v})},[t,u]),p=f.useCallback(()=>{u(t,{low_threshold:fC.low_threshold})},[t,u]),h=f.useCallback(v=>{u(t,{high_threshold:v})},[t,u]),g=f.useCallback(()=>{u(t,{high_threshold:fC.high_threshold})},[t,u]);return a.jsxs(ks,{children:[a.jsx(St,{isDisabled:i||!r,label:"Low Threshold",value:o,onChange:d,handleReset:p,withReset:!0,min:0,max:255,withInput:!0,withSliderMarks:!0}),a.jsx(St,{isDisabled:i||!r,label:"High Threshold",value:s,onChange:h,handleReset:g,withReset:!0,min:0,max:255,withInput:!0,withSliderMarks:!0})]})},VY=f.memo(WY),Dc=Xo.content_shuffle_image_processor.default,UY=e=>{const{controlNetId:t,processorNode:n,isEnabled:r}=e,{image_resolution:o,detect_resolution:s,w:i,h:u,f:d}=n,p=_s(),h=L($r),g=f.useCallback(I=>{p(t,{detect_resolution:I})},[t,p]),v=f.useCallback(()=>{p(t,{detect_resolution:Dc.detect_resolution})},[t,p]),b=f.useCallback(I=>{p(t,{image_resolution:I})},[t,p]),S=f.useCallback(()=>{p(t,{image_resolution:Dc.image_resolution})},[t,p]),w=f.useCallback(I=>{p(t,{w:I})},[t,p]),C=f.useCallback(()=>{p(t,{w:Dc.w})},[t,p]),_=f.useCallback(I=>{p(t,{h:I})},[t,p]),k=f.useCallback(()=>{p(t,{h:Dc.h})},[t,p]),j=f.useCallback(I=>{p(t,{f:I})},[t,p]),E=f.useCallback(()=>{p(t,{f:Dc.f})},[t,p]);return a.jsxs(ks,{children:[a.jsx(St,{label:"Detect Resolution",value:s,onChange:g,handleReset:v,withReset:!0,min:0,max:4096,withInput:!0,withSliderMarks:!0,isDisabled:h||!r}),a.jsx(St,{label:"Image Resolution",value:o,onChange:b,handleReset:S,withReset:!0,min:0,max:4096,withInput:!0,withSliderMarks:!0,isDisabled:h||!r}),a.jsx(St,{label:"W",value:i,onChange:w,handleReset:C,withReset:!0,min:0,max:4096,withInput:!0,withSliderMarks:!0,isDisabled:h||!r}),a.jsx(St,{label:"H",value:u,onChange:_,handleReset:k,withReset:!0,min:0,max:4096,withInput:!0,withSliderMarks:!0,isDisabled:h||!r}),a.jsx(St,{label:"F",value:d,onChange:j,handleReset:E,withReset:!0,min:0,max:4096,withInput:!0,withSliderMarks:!0,isDisabled:h||!r})]})},GY=f.memo(UY),pC=Xo.hed_image_processor.default,qY=e=>{const{controlNetId:t,processorNode:{detect_resolution:n,image_resolution:r,scribble:o},isEnabled:s}=e,i=L($r),u=_s(),d=f.useCallback(b=>{u(t,{detect_resolution:b})},[t,u]),p=f.useCallback(b=>{u(t,{image_resolution:b})},[t,u]),h=f.useCallback(b=>{u(t,{scribble:b.target.checked})},[t,u]),g=f.useCallback(()=>{u(t,{detect_resolution:pC.detect_resolution})},[t,u]),v=f.useCallback(()=>{u(t,{image_resolution:pC.image_resolution})},[t,u]);return a.jsxs(ks,{children:[a.jsx(St,{label:"Detect Resolution",value:n,onChange:d,handleReset:g,withReset:!0,min:0,max:4096,withInput:!0,withSliderMarks:!0,isDisabled:i||!s}),a.jsx(St,{label:"Image Resolution",value:r,onChange:p,handleReset:v,withReset:!0,min:0,max:4096,withInput:!0,withSliderMarks:!0,isDisabled:i||!s}),a.jsx(jn,{label:"Scribble",isChecked:o,onChange:h,isDisabled:i||!s})]})},KY=f.memo(qY),hC=Xo.lineart_anime_image_processor.default,YY=e=>{const{controlNetId:t,processorNode:n,isEnabled:r}=e,{image_resolution:o,detect_resolution:s}=n,i=_s(),u=L($r),d=f.useCallback(v=>{i(t,{detect_resolution:v})},[t,i]),p=f.useCallback(v=>{i(t,{image_resolution:v})},[t,i]),h=f.useCallback(()=>{i(t,{detect_resolution:hC.detect_resolution})},[t,i]),g=f.useCallback(()=>{i(t,{image_resolution:hC.image_resolution})},[t,i]);return a.jsxs(ks,{children:[a.jsx(St,{label:"Detect Resolution",value:s,onChange:d,handleReset:h,withReset:!0,min:0,max:4096,withInput:!0,withSliderMarks:!0,isDisabled:u||!r}),a.jsx(St,{label:"Image Resolution",value:o,onChange:p,handleReset:g,withReset:!0,min:0,max:4096,withInput:!0,withSliderMarks:!0,isDisabled:u||!r})]})},QY=f.memo(YY),mC=Xo.lineart_image_processor.default,XY=e=>{const{controlNetId:t,processorNode:n,isEnabled:r}=e,{image_resolution:o,detect_resolution:s,coarse:i}=n,u=_s(),d=L($r),p=f.useCallback(S=>{u(t,{detect_resolution:S})},[t,u]),h=f.useCallback(S=>{u(t,{image_resolution:S})},[t,u]),g=f.useCallback(()=>{u(t,{detect_resolution:mC.detect_resolution})},[t,u]),v=f.useCallback(()=>{u(t,{image_resolution:mC.image_resolution})},[t,u]),b=f.useCallback(S=>{u(t,{coarse:S.target.checked})},[t,u]);return a.jsxs(ks,{children:[a.jsx(St,{label:"Detect Resolution",value:s,onChange:p,handleReset:g,withReset:!0,min:0,max:4096,withInput:!0,withSliderMarks:!0,isDisabled:d||!r}),a.jsx(St,{label:"Image Resolution",value:o,onChange:h,handleReset:v,withReset:!0,min:0,max:4096,withInput:!0,withSliderMarks:!0,isDisabled:d||!r}),a.jsx(jn,{label:"Coarse",isChecked:i,onChange:b,isDisabled:d||!r})]})},JY=f.memo(XY),gC=Xo.mediapipe_face_processor.default,ZY=e=>{const{controlNetId:t,processorNode:n,isEnabled:r}=e,{max_faces:o,min_confidence:s}=n,i=_s(),u=L($r),d=f.useCallback(v=>{i(t,{max_faces:v})},[t,i]),p=f.useCallback(v=>{i(t,{min_confidence:v})},[t,i]),h=f.useCallback(()=>{i(t,{max_faces:gC.max_faces})},[t,i]),g=f.useCallback(()=>{i(t,{min_confidence:gC.min_confidence})},[t,i]);return a.jsxs(ks,{children:[a.jsx(St,{label:"Max Faces",value:o,onChange:d,handleReset:h,withReset:!0,min:1,max:20,withInput:!0,withSliderMarks:!0,isDisabled:u||!r}),a.jsx(St,{label:"Min Confidence",value:s,onChange:p,handleReset:g,withReset:!0,min:0,max:1,step:.01,withInput:!0,withSliderMarks:!0,isDisabled:u||!r})]})},eQ=f.memo(ZY),vC=Xo.midas_depth_image_processor.default,tQ=e=>{const{controlNetId:t,processorNode:n,isEnabled:r}=e,{a_mult:o,bg_th:s}=n,i=_s(),u=L($r),d=f.useCallback(v=>{i(t,{a_mult:v})},[t,i]),p=f.useCallback(v=>{i(t,{bg_th:v})},[t,i]),h=f.useCallback(()=>{i(t,{a_mult:vC.a_mult})},[t,i]),g=f.useCallback(()=>{i(t,{bg_th:vC.bg_th})},[t,i]);return a.jsxs(ks,{children:[a.jsx(St,{label:"a_mult",value:o,onChange:d,handleReset:h,withReset:!0,min:0,max:20,step:.01,withInput:!0,withSliderMarks:!0,isDisabled:u||!r}),a.jsx(St,{label:"bg_th",value:s,onChange:p,handleReset:g,withReset:!0,min:0,max:20,step:.01,withInput:!0,withSliderMarks:!0,isDisabled:u||!r})]})},nQ=f.memo(tQ),uf=Xo.mlsd_image_processor.default,rQ=e=>{const{controlNetId:t,processorNode:n,isEnabled:r}=e,{image_resolution:o,detect_resolution:s,thr_d:i,thr_v:u}=n,d=_s(),p=L($r),h=f.useCallback(k=>{d(t,{detect_resolution:k})},[t,d]),g=f.useCallback(k=>{d(t,{image_resolution:k})},[t,d]),v=f.useCallback(k=>{d(t,{thr_d:k})},[t,d]),b=f.useCallback(k=>{d(t,{thr_v:k})},[t,d]),S=f.useCallback(()=>{d(t,{detect_resolution:uf.detect_resolution})},[t,d]),w=f.useCallback(()=>{d(t,{image_resolution:uf.image_resolution})},[t,d]),C=f.useCallback(()=>{d(t,{thr_d:uf.thr_d})},[t,d]),_=f.useCallback(()=>{d(t,{thr_v:uf.thr_v})},[t,d]);return a.jsxs(ks,{children:[a.jsx(St,{label:"Detect Resolution",value:s,onChange:h,handleReset:S,withReset:!0,min:0,max:4096,withInput:!0,withSliderMarks:!0,isDisabled:p||!r}),a.jsx(St,{label:"Image Resolution",value:o,onChange:g,handleReset:w,withReset:!0,min:0,max:4096,withInput:!0,withSliderMarks:!0,isDisabled:p||!r}),a.jsx(St,{label:"W",value:i,onChange:v,handleReset:C,withReset:!0,min:0,max:1,step:.01,withInput:!0,withSliderMarks:!0,isDisabled:p||!r}),a.jsx(St,{label:"H",value:u,onChange:b,handleReset:_,withReset:!0,min:0,max:1,step:.01,withInput:!0,withSliderMarks:!0,isDisabled:p||!r})]})},oQ=f.memo(rQ),yC=Xo.normalbae_image_processor.default,sQ=e=>{const{controlNetId:t,processorNode:n,isEnabled:r}=e,{image_resolution:o,detect_resolution:s}=n,i=_s(),u=L($r),d=f.useCallback(v=>{i(t,{detect_resolution:v})},[t,i]),p=f.useCallback(v=>{i(t,{image_resolution:v})},[t,i]),h=f.useCallback(()=>{i(t,{detect_resolution:yC.detect_resolution})},[t,i]),g=f.useCallback(()=>{i(t,{image_resolution:yC.image_resolution})},[t,i]);return a.jsxs(ks,{children:[a.jsx(St,{label:"Detect Resolution",value:s,onChange:d,handleReset:h,withReset:!0,min:0,max:4096,withInput:!0,withSliderMarks:!0,isDisabled:u||!r}),a.jsx(St,{label:"Image Resolution",value:o,onChange:p,handleReset:g,withReset:!0,min:0,max:4096,withInput:!0,withSliderMarks:!0,isDisabled:u||!r})]})},aQ=f.memo(sQ),bC=Xo.openpose_image_processor.default,iQ=e=>{const{controlNetId:t,processorNode:n,isEnabled:r}=e,{image_resolution:o,detect_resolution:s,hand_and_face:i}=n,u=_s(),d=L($r),p=f.useCallback(S=>{u(t,{detect_resolution:S})},[t,u]),h=f.useCallback(S=>{u(t,{image_resolution:S})},[t,u]),g=f.useCallback(()=>{u(t,{detect_resolution:bC.detect_resolution})},[t,u]),v=f.useCallback(()=>{u(t,{image_resolution:bC.image_resolution})},[t,u]),b=f.useCallback(S=>{u(t,{hand_and_face:S.target.checked})},[t,u]);return a.jsxs(ks,{children:[a.jsx(St,{label:"Detect Resolution",value:s,onChange:p,handleReset:g,withReset:!0,min:0,max:4096,withInput:!0,withSliderMarks:!0,isDisabled:d||!r}),a.jsx(St,{label:"Image Resolution",value:o,onChange:h,handleReset:v,withReset:!0,min:0,max:4096,withInput:!0,withSliderMarks:!0,isDisabled:d||!r}),a.jsx(jn,{label:"Hand and Face",isChecked:i,onChange:b,isDisabled:d||!r})]})},lQ=f.memo(iQ),xC=Xo.pidi_image_processor.default,cQ=e=>{const{controlNetId:t,processorNode:n,isEnabled:r}=e,{image_resolution:o,detect_resolution:s,scribble:i,safe:u}=n,d=_s(),p=L($r),h=f.useCallback(C=>{d(t,{detect_resolution:C})},[t,d]),g=f.useCallback(C=>{d(t,{image_resolution:C})},[t,d]),v=f.useCallback(()=>{d(t,{detect_resolution:xC.detect_resolution})},[t,d]),b=f.useCallback(()=>{d(t,{image_resolution:xC.image_resolution})},[t,d]),S=f.useCallback(C=>{d(t,{scribble:C.target.checked})},[t,d]),w=f.useCallback(C=>{d(t,{safe:C.target.checked})},[t,d]);return a.jsxs(ks,{children:[a.jsx(St,{label:"Detect Resolution",value:s,onChange:h,handleReset:v,withReset:!0,min:0,max:4096,withInput:!0,withSliderMarks:!0,isDisabled:p||!r}),a.jsx(St,{label:"Image Resolution",value:o,onChange:g,handleReset:b,withReset:!0,min:0,max:4096,withInput:!0,withSliderMarks:!0,isDisabled:p||!r}),a.jsx(jn,{label:"Scribble",isChecked:i,onChange:S}),a.jsx(jn,{label:"Safe",isChecked:u,onChange:w,isDisabled:p||!r})]})},uQ=f.memo(cQ),dQ=e=>null,fQ=f.memo(dQ),pQ=e=>{const{controlNetId:t}=e,n=f.useMemo(()=>ve(Rt,({controlNet:s})=>{const{isEnabled:i,processorNode:u}=s.controlNets[t];return{isEnabled:i,processorNode:u}},it),[t]),{isEnabled:r,processorNode:o}=L(n);return o.type==="canny_image_processor"?a.jsx(VY,{controlNetId:t,processorNode:o,isEnabled:r}):o.type==="hed_image_processor"?a.jsx(KY,{controlNetId:t,processorNode:o,isEnabled:r}):o.type==="lineart_image_processor"?a.jsx(JY,{controlNetId:t,processorNode:o,isEnabled:r}):o.type==="content_shuffle_image_processor"?a.jsx(GY,{controlNetId:t,processorNode:o,isEnabled:r}):o.type==="lineart_anime_image_processor"?a.jsx(QY,{controlNetId:t,processorNode:o,isEnabled:r}):o.type==="mediapipe_face_processor"?a.jsx(eQ,{controlNetId:t,processorNode:o,isEnabled:r}):o.type==="midas_depth_image_processor"?a.jsx(nQ,{controlNetId:t,processorNode:o,isEnabled:r}):o.type==="mlsd_image_processor"?a.jsx(oQ,{controlNetId:t,processorNode:o,isEnabled:r}):o.type==="normalbae_image_processor"?a.jsx(aQ,{controlNetId:t,processorNode:o,isEnabled:r}):o.type==="openpose_image_processor"?a.jsx(lQ,{controlNetId:t,processorNode:o,isEnabled:r}):o.type==="pidi_image_processor"?a.jsx(uQ,{controlNetId:t,processorNode:o,isEnabled:r}):o.type==="zoe_depth_image_processor"?a.jsx(fQ,{controlNetId:t,processorNode:o,isEnabled:r}):null},hQ=f.memo(pQ),mQ=e=>{const{controlNetId:t}=e,n=te(),r=f.useMemo(()=>ve(Rt,({controlNet:d})=>{const{isEnabled:p,shouldAutoConfig:h}=d.controlNets[t];return{isEnabled:p,shouldAutoConfig:h}},it),[t]),{isEnabled:o,shouldAutoConfig:s}=L(r),i=L($r),u=f.useCallback(()=>{n(X8({controlNetId:t}))},[t,n]);return a.jsx(jn,{label:"Auto configure processor","aria-label":"Auto configure processor",isChecked:s,onChange:u,isDisabled:i||!o})},gQ=f.memo(mQ),wC=e=>`${Math.round(e*100)}%`,vQ=e=>{const{controlNetId:t}=e,n=te(),r=f.useMemo(()=>ve(Rt,({controlNet:d})=>{const{beginStepPct:p,endStepPct:h,isEnabled:g}=d.controlNets[t];return{beginStepPct:p,endStepPct:h,isEnabled:g}},it),[t]),{beginStepPct:o,endStepPct:s,isEnabled:i}=L(r),u=f.useCallback(d=>{n(ox({controlNetId:t,beginStepPct:d[0]})),n(sx({controlNetId:t,endStepPct:d[1]}))},[t,n]);return f.useCallback(()=>{n(ox({controlNetId:t,beginStepPct:0})),n(sx({controlNetId:t,endStepPct:1}))},[t,n]),a.jsxs(Ss,{isDisabled:!i,children:[a.jsx(vs,{children:"Begin / End Step Percentage"}),a.jsx(Cl,{w:"100%",gap:2,alignItems:"center",children:a.jsxs(n5,{"aria-label":["Begin Step %","End Step %"],value:[o,s],onChange:u,min:0,max:1,step:.01,minStepsBetweenThumbs:5,isDisabled:!i,children:[a.jsx(r5,{children:a.jsx(o5,{})}),a.jsx(_n,{label:wC(o),placement:"top",hasArrow:!0,children:a.jsx(d0,{index:0})}),a.jsx(_n,{label:wC(s),placement:"top",hasArrow:!0,children:a.jsx(d0,{index:1})}),a.jsx(vf,{value:0,sx:{insetInlineStart:"0 !important",insetInlineEnd:"unset !important"},children:"0%"}),a.jsx(vf,{value:.5,sx:{insetInlineStart:"50% !important",transform:"translateX(-50%)"},children:"50%"}),a.jsx(vf,{value:1,sx:{insetInlineStart:"unset !important",insetInlineEnd:"0 !important"},children:"100%"})]})})]})},yQ=f.memo(vQ),bQ=[{label:"Balanced",value:"balanced"},{label:"Prompt",value:"more_prompt"},{label:"Control",value:"more_control"},{label:"Mega Control",value:"unbalanced"}];function xQ(e){const{controlNetId:t}=e,n=te(),r=f.useMemo(()=>ve(Rt,({controlNet:u})=>{const{controlMode:d,isEnabled:p}=u.controlNets[t];return{controlMode:d,isEnabled:p}},it),[t]),{controlMode:o,isEnabled:s}=L(r);fe();const i=f.useCallback(u=>{n(J8({controlNetId:t,controlMode:u}))},[t,n]);return a.jsx(Do,{disabled:!s,label:"Control Mode",data:bQ,value:String(o),onChange:i})}const wQ=ve(Wi,e=>Cs(Xo,n=>({value:n.type,label:n.label})).sort((n,r)=>n.value==="none"?-1:r.value==="none"?1:n.label.localeCompare(r.label)).filter(n=>!e.sd.disabledControlNetProcessors.includes(n.value)),it),SQ=e=>{const t=te(),{controlNetId:n}=e,r=f.useMemo(()=>ve(Rt,({controlNet:p})=>{const{isEnabled:h,processorNode:g}=p.controlNets[n];return{isEnabled:h,processorNode:g}},it),[n]),o=L($r),s=L(wQ),{isEnabled:i,processorNode:u}=L(r),d=f.useCallback(p=>{t(Z8({controlNetId:n,processorType:p}))},[n,t]);return a.jsx(Mr,{label:"Processor",value:u.type??"canny_image_processor",data:s,onChange:d,disabled:o||!i})},CQ=f.memo(SQ),_Q=e=>{const{controlNetId:t}=e,n=te(),r=ve(Rt,({controlNet:g})=>{const{isEnabled:v,shouldAutoConfig:b}=g.controlNets[t];return{isEnabled:v,shouldAutoConfig:b}},it),{isEnabled:o,shouldAutoConfig:s}=L(r),[i,u]=WB(!1),d=f.useCallback(()=>{n(e7({controlNetId:t}))},[t,n]),p=f.useCallback(()=>{n(t7({sourceControlNetId:t,newControlNetId:Ga()}))},[t,n]),h=f.useCallback(()=>{n(n7({controlNetId:t}))},[t,n]);return a.jsxs(F,{sx:{flexDir:"column",gap:2,p:3,borderRadius:"base",position:"relative",bg:"base.200",_dark:{bg:"base.850"}},children:[a.jsxs(F,{sx:{gap:2,alignItems:"center"},children:[a.jsx(jn,{tooltip:"Toggle this ControlNet","aria-label":"Toggle this ControlNet",isChecked:o,onChange:h}),a.jsx(ze,{sx:{w:"full",minW:0,opacity:o?1:.5,pointerEvents:o?"auto":"none",transitionProperty:"common",transitionDuration:"0.1s"},children:a.jsx(LY,{controlNetId:t})}),a.jsx(je,{size:"sm",tooltip:"Duplicate","aria-label":"Duplicate",onClick:p,icon:a.jsx(rc,{})}),a.jsx(je,{size:"sm",tooltip:"Delete","aria-label":"Delete",colorScheme:"error",onClick:d,icon:a.jsx(yo,{})}),a.jsx(je,{size:"sm",tooltip:i?"Hide Advanced":"Show Advanced","aria-label":i?"Hide Advanced":"Show Advanced",onClick:u,variant:"link",icon:a.jsx(Xv,{sx:{boxSize:4,color:"base.700",transform:i?"rotate(0deg)":"rotate(180deg)",transitionProperty:"common",transitionDuration:"normal",_dark:{color:"base.300"}}})}),!s&&a.jsx(ze,{sx:{position:"absolute",w:1.5,h:1.5,borderRadius:"full",top:4,insetInlineEnd:4,bg:"accent.700",_dark:{bg:"accent.400"}}})]}),a.jsxs(F,{sx:{w:"full",flexDirection:"column"},children:[a.jsxs(F,{sx:{gap:4,w:"full",alignItems:"center"},children:[a.jsxs(F,{sx:{flexDir:"column",gap:3,h:28,w:"full",paddingInlineStart:1,paddingInlineEnd:i?1:0,pb:2,justifyContent:"space-between"},children:[a.jsx(FY,{controlNetId:t}),a.jsx(yQ,{controlNetId:t})]}),!i&&a.jsx(F,{sx:{alignItems:"center",justifyContent:"center",h:28,w:28,aspectRatio:"1/1",mt:3},children:a.jsx(dC,{controlNetId:t,height:28})})]}),a.jsx(ze,{mt:2,children:a.jsx(xQ,{controlNetId:t})}),a.jsx(CQ,{controlNetId:t})]}),i&&a.jsxs(a.Fragment,{children:[a.jsx(dC,{controlNetId:t,height:"392px"}),a.jsx(gQ,{controlNetId:t}),a.jsx(hQ,{controlNetId:t})]})]})},kQ=f.memo(_Q),PQ=ve(Rt,e=>{const{isEnabled:t}=e.controlNet;return{isEnabled:t}},it),jQ=()=>{const{isEnabled:e}=L(PQ),t=te(),n=f.useCallback(()=>{t(r7())},[t]);return a.jsx(jn,{label:"Enable ControlNet",isChecked:e,onChange:n,formControlProps:{width:"100%"}})},IQ=ve(o7,e=>{const{controlNets:t,isEnabled:n}=e,r=s7(t),o=n&&r.length>0?`${r.length} Active`:void 0;return{controlNetsArray:Cs(t),activeLabel:o}},it),EQ=()=>{fe();const{controlNetsArray:e,activeLabel:t}=L(IQ),n=br("controlNet").isFeatureDisabled,r=te(),{firstModel:o}=fv(void 0,{selectFromResult:i=>{var d,p;return{firstModel:(p=i.data)==null?void 0:p.entities[(d=i.data)==null?void 0:d.ids[0]]}}}),s=f.useCallback(()=>{if(!o)return;const i=Ga();r(a7({controlNetId:i})),r($4({controlNetId:i,model:o}))},[r,o]);return n?null:a.jsx(To,{label:"ControlNet",activeLabel:t,children:a.jsxs(F,{sx:{flexDir:"column",gap:3},children:[a.jsxs(F,{gap:2,alignItems:"center",children:[a.jsx(F,{sx:{flexDirection:"column",w:"100%",gap:2,px:4,py:2,borderRadius:4,bg:"base.200",_dark:{bg:"base.850"}},children:a.jsx(jQ,{})}),a.jsx(je,{tooltip:"Add ControlNet","aria-label":"Add ControlNet",icon:a.jsx(Tu,{}),isDisabled:!o,flexGrow:1,size:"md",onClick:s})]}),e.map((i,u)=>a.jsxs(f.Fragment,{children:[u>0&&a.jsx(ni,{}),a.jsx(kQ,{controlNetId:i.controlNetId})]},i.controlNetId))]})})},G1=f.memo(EQ),q1=e=>{e.stopPropagation()},OQ=tt((e,t)=>{const n=te(),r=f.useCallback(s=>{s.shiftKey&&n(Ko(!0))},[n]),o=f.useCallback(s=>{s.shiftKey||n(Ko(!1))},[n]);return a.jsx(i5,{ref:t,onPaste:q1,onKeyDown:r,onKeyUp:o,...e})}),$j=f.memo(OQ),MQ=e=>{const{onClick:t}=e;return a.jsx(je,{size:"sm","aria-label":"Add Embedding",tooltip:"Add Embedding",icon:a.jsx(Uv,{}),sx:{p:2,color:"base.500",_hover:{color:"base.600"},_active:{color:"base.700"},_dark:{color:"base.500",_hover:{color:"base.400"},_active:{color:"base.300"}}},variant:"link",onClick:t})},zj=f.memo(MQ),Lj=e=>{const{onSelect:t,isOpen:n,onClose:r,children:o}=e,{data:s}=i7(),i=f.useRef(null),u=L(h=>h.generation.model),d=f.useMemo(()=>{if(!s)return[];const h=[];return Qo(s.entities,(g,v)=>{if(!g)return;const b=(u==null?void 0:u.base_model)!==g.base_model;h.push({value:g.model_name,label:g.model_name,group:Or[g.base_model],disabled:b,tooltip:b?`Incompatible base model: ${g.base_model}`:void 0})}),h.sort((g,v)=>g.disabled&&!v.disabled?1:-1)},[s,u==null?void 0:u.base_model]),p=f.useCallback(h=>{h&&t(h)},[t]);return a.jsxs(Bv,{initialFocusRef:i,isOpen:n,onClose:r,placement:"bottom",openDelay:0,closeDelay:0,closeOnBlur:!0,returnFocusOnClose:!0,children:[a.jsx(Lv,{children:o}),a.jsx(Fv,{sx:{p:0,top:-1,shadow:"dark-lg",borderColor:"accent.300",borderWidth:"2px",borderStyle:"solid",_dark:{borderColor:"accent.400"}},children:a.jsx(K6,{sx:{p:0,w:`calc(${F1} - 2rem )`},children:d.length===0?a.jsx(F,{sx:{justifyContent:"center",p:2},children:a.jsx(nt,{sx:{fontSize:"sm",color:"base.500",_dark:"base.700"},children:"No Embeddings Loaded"})}):a.jsx(Mr,{inputRef:i,autoFocus:!0,placeholder:"Add Embedding",value:null,data:d,nothingFound:"No matching Embeddings",itemComponent:Vi,disabled:d.length===0,onDropdownClose:r,filter:(h,g)=>{var v;return((v=g.label)==null?void 0:v.toLowerCase().includes(h.toLowerCase().trim()))||g.value.toLowerCase().includes(h.toLowerCase().trim())},onChange:p})})})]})},K1=()=>{const e=L(g=>g.generation.negativePrompt),t=f.useRef(null),{isOpen:n,onClose:r,onOpen:o}=Ws(),s=te(),{t:i}=fe(),u=f.useCallback(g=>{s(Uc(g.target.value))},[s]),d=f.useCallback(g=>{g.key==="<"&&o()},[o]),p=f.useCallback(g=>{if(!t.current)return;const v=t.current.selectionStart;if(v===void 0)return;let b=e.slice(0,v);b[b.length-1]!=="<"&&(b+="<"),b+=`${g}>`;const S=b.length;b+=e.slice(v),Xl.flushSync(()=>{s(Uc(b))}),t.current.selectionEnd=S,r()},[s,r,e]),h=br("embedding").isFeatureEnabled;return a.jsxs(Ss,{children:[a.jsx(Lj,{isOpen:n,onClose:r,onSelect:p,children:a.jsx($j,{id:"negativePrompt",name:"negativePrompt",ref:t,value:e,placeholder:i("parameters.negativePromptPlaceholder"),onChange:u,resize:"vertical",fontSize:"sm",minH:16,...h&&{onKeyDown:d}})}),!n&&h&&a.jsx(ze,{sx:{position:"absolute",top:0,insetInlineEnd:0},children:a.jsx(zj,{onClick:o})})]})},RQ=e=>{const r=e.split(",").map(o=>o.split(":")).map(o=>({seed:Number(o[0]),weight:Number(o[1])}));return Y1(r)?r:!1},Y1=e=>typeof e=="string"?!!RQ(e):!!(e.length&&!e.some(t=>{const{seed:n,weight:r}=t,o=!isNaN(parseInt(n.toString(),10)),s=!isNaN(parseInt(r.toString(),10))&&r>=0&&r<=1;return!(o&&s)})),DQ=ve([Rt,ur],(e,t)=>{const{generation:n,system:r}=e,{shouldGenerateVariations:o,seedWeights:s,initialImage:i,seed:u}=n,{isProcessing:d,isConnected:p}=r;let h=!0;const g=[];t==="img2img"&&!i&&(h=!1,g.push("No initial image selected"));const{isSuccess:v}=l7.endpoints.getMainModels.select()(e);return v||(h=!1,g.push("Models are not loaded")),d&&(h=!1,g.push("System Busy")),p||(h=!1,g.push("System Disconnected")),o&&(!(Y1(s)||s==="")||u===-1)&&(h=!1,g.push("Seed-Weights badly formatted.")),Qo(e.controlNet.controlNets,(b,S)=>{b.model||(h=!1,g.push("ControlNet ${id} has no model selected."))}),{isReady:h,reasonsWhyNotReady:g}},it),Q1=()=>{const{isReady:e}=L(DQ);return e},TQ=ve([Rt,ur],({generation:e,ui:t},n)=>({shouldPinParametersPanel:t.shouldPinParametersPanel,prompt:e.positivePrompt,activeTabName:n}),{memoizeOptions:{resultEqualityCheck:Qt}}),X1=()=>{const e=te(),{prompt:t,shouldPinParametersPanel:n,activeTabName:r}=L(TQ),o=Q1(),s=f.useRef(null),{isOpen:i,onClose:u,onOpen:d}=Ws(),{t:p}=fe(),h=f.useCallback(S=>{e(Vc(S.target.value))},[e]);Ke("alt+a",()=>{var S;(S=s.current)==null||S.focus()},[]);const g=f.useCallback(S=>{if(!s.current)return;const w=s.current.selectionStart;if(w===void 0)return;let C=t.slice(0,w);C[C.length-1]!=="<"&&(C+="<"),C+=`${S}>`;const _=C.length;C+=t.slice(w),Xl.flushSync(()=>{e(Vc(C))}),s.current.selectionStart=_,s.current.selectionEnd=_,u()},[e,u,t]),v=br("embedding").isFeatureEnabled,b=f.useCallback(S=>{S.key==="Enter"&&S.shiftKey===!1&&o&&(S.preventDefault(),e(pv()),e(hv(r))),v&&S.key==="<"&&d()},[o,e,r,d,v]);return a.jsxs(ze,{position:"relative",children:[a.jsx(Ss,{children:a.jsx(Lj,{isOpen:i,onClose:u,onSelect:g,children:a.jsx($j,{id:"prompt",name:"prompt",ref:s,value:t,placeholder:p("parameters.positivePromptPlaceholder"),onChange:h,onKeyDown:b,resize:"vertical",minH:32})})}),!i&&v&&a.jsx(ze,{sx:{position:"absolute",top:n?6:0,insetInlineEnd:0},children:a.jsx(zj,{onClick:d})})]})},AQ=ve(Rt,e=>{const{shouldUseNoiseSettings:t,shouldUseCpuNoise:n}=e.generation;return{isDisabled:!t,shouldUseCpuNoise:n}},it),NQ=()=>{const e=te(),{isDisabled:t,shouldUseCpuNoise:n}=L(AQ);fe();const r=o=>e(c7(o.target.checked));return a.jsx(jn,{isDisabled:t,label:"Use CPU Noise",isChecked:n,onChange:r})},$Q=ve(Rt,e=>{const{shouldUseNoiseSettings:t,threshold:n}=e.generation;return{isDisabled:!t,threshold:n}},it);function zQ(){const e=te(),{threshold:t,isDisabled:n}=L($Q),{t:r}=fe();return a.jsx(St,{isDisabled:n,label:r("parameters.noiseThreshold"),min:0,max:20,step:.1,onChange:o=>e(ax(o)),handleReset:()=>e(ax(0)),value:t,withInput:!0,withReset:!0,withSliderMarks:!0})}const LQ=()=>{const e=te(),t=L(r=>r.generation.shouldUseNoiseSettings);fe();const n=r=>e(u7(r.target.checked));return a.jsx(jn,{label:"Enable Noise Settings",isChecked:t,onChange:n})},BQ=ve(Rt,e=>{const{shouldUseNoiseSettings:t,perlin:n}=e.generation;return{isDisabled:!t,perlin:n}},it);function FQ(){const e=te(),{perlin:t,isDisabled:n}=L(BQ),{t:r}=fe();return a.jsx(St,{isDisabled:n,label:r("parameters.perlinNoise"),min:0,max:1,step:.05,onChange:o=>e(ix(o)),handleReset:()=>e(ix(0)),value:t,withInput:!0,withReset:!0,withSliderMarks:!0})}const HQ=ve(Rt,e=>{const{shouldUseNoiseSettings:t}=e.generation;return{activeLabel:t?"Enabled":void 0}},it),WQ=()=>{const{t:e}=fe(),t=br("noise").isFeatureEnabled,n=br("perlinNoise").isFeatureEnabled,r=br("noiseThreshold").isFeatureEnabled,{activeLabel:o}=L(HQ);return t?a.jsx(To,{label:e("parameters.noiseSettings"),activeLabel:o,children:a.jsxs(F,{sx:{gap:2,flexDirection:"column"},children:[a.jsx(LQ,{}),a.jsx(NQ,{}),n&&a.jsx(FQ,{}),r&&a.jsx(zQ,{})]})}):null},Bj=f.memo(WQ),VQ=ve(Jo,e=>{const{seamlessXAxis:t}=e;return{seamlessXAxis:t}},it),UQ=()=>{const{t:e}=fe(),{seamlessXAxis:t}=L(VQ),n=te(),r=f.useCallback(o=>{n(d7(o.target.checked))},[n]);return a.jsx(jn,{label:e("parameters.seamlessXAxis"),"aria-label":e("parameters.seamlessXAxis"),isChecked:t,onChange:r})},GQ=f.memo(UQ),qQ=ve(Jo,e=>{const{seamlessYAxis:t}=e;return{seamlessYAxis:t}},it),KQ=()=>{const{t:e}=fe(),{seamlessYAxis:t}=L(qQ),n=te(),r=f.useCallback(o=>{n(f7(o.target.checked))},[n]);return a.jsx(jn,{label:e("parameters.seamlessYAxis"),"aria-label":e("parameters.seamlessYAxis"),isChecked:t,onChange:r})},YQ=f.memo(KQ),QQ=(e,t)=>{if(e&&t)return"X & Y";if(e)return"X";if(t)return"Y"},XQ=ve(Jo,e=>{const{seamlessXAxis:t,seamlessYAxis:n}=e;return{activeLabel:QQ(t,n)}},it),JQ=()=>{const{t:e}=fe(),{activeLabel:t}=L(XQ);return br("seamless").isFeatureEnabled?a.jsx(To,{label:e("parameters.seamlessTiling"),activeLabel:t,children:a.jsxs(F,{sx:{gap:5},children:[a.jsx(ze,{flexGrow:1,children:a.jsx(GQ,{})}),a.jsx(ze,{flexGrow:1,children:a.jsx(YQ,{})})]})}):null},Fj=f.memo(JQ);function ZQ(){const e=L(o=>o.generation.horizontalSymmetrySteps),t=L(o=>o.generation.steps),n=te(),{t:r}=fe();return a.jsx(St,{label:r("parameters.hSymmetryStep"),value:e,onChange:o=>n(lx(o)),min:0,max:t,step:1,withInput:!0,withSliderMarks:!0,withReset:!0,handleReset:()=>n(lx(0))})}function eX(){const e=L(o=>o.generation.verticalSymmetrySteps),t=L(o=>o.generation.steps),n=te(),{t:r}=fe();return a.jsx(St,{label:r("parameters.vSymmetryStep"),value:e,onChange:o=>n(cx(o)),min:0,max:t,step:1,withInput:!0,withSliderMarks:!0,withReset:!0,handleReset:()=>n(cx(0))})}function tX(){const e=L(n=>n.generation.shouldUseSymmetry),t=te();return a.jsx(jn,{label:"Enable Symmetry",isChecked:e,onChange:n=>t(p7(n.target.checked))})}const nX=ve(Rt,e=>({activeLabel:e.generation.shouldUseSymmetry?"Enabled":void 0}),it),rX=()=>{const{t:e}=fe(),{activeLabel:t}=L(nX);return br("symmetry").isFeatureEnabled?a.jsx(To,{label:e("parameters.symmetry"),activeLabel:t,children:a.jsxs(F,{sx:{gap:2,flexDirection:"column"},children:[a.jsx(tX,{}),a.jsx(ZQ,{}),a.jsx(eX,{})]})}):null},J1=f.memo(rX);function oX(){const e=L(o=>o.generation.variationAmount),t=L(o=>o.generation.shouldGenerateVariations),{t:n}=fe(),r=te();return a.jsx(St,{label:n("parameters.variationAmount"),value:e,step:.01,min:0,max:1,isDisabled:!t,onChange:o=>r(ux(o)),handleReset:()=>r(ux(.1)),withInput:!0,withReset:!0,withSliderMarks:!0})}const sX=()=>{const e=te(),t=L(r=>r.generation.shouldGenerateVariations);fe();const n=r=>e(h7(r.target.checked));return a.jsx(jn,{label:"Enable Variations",isChecked:t,onChange:n})},aX={display:"flex",flexDirection:"row",alignItems:"center",gap:10},iX=e=>{const{label:t="",labelPos:n="top",isDisabled:r=!1,isInvalid:o,formControlProps:s,...i}=e,u=te(),d=f.useCallback(h=>{h.shiftKey&&u(Ko(!0))},[u]),p=f.useCallback(h=>{h.shiftKey||u(Ko(!1))},[u]);return a.jsxs(Ss,{isInvalid:o,isDisabled:r,...s,style:n==="side"?aX:void 0,children:[t!==""&&a.jsx(vs,{children:t}),a.jsx(ku,{...i,onPaste:q1,onKeyDown:d,onKeyUp:p})]})},Ai=f.memo(iX);function lX(){const e=L(s=>s.generation.seedWeights),t=L(s=>s.generation.shouldGenerateVariations),{t:n}=fe(),r=te(),o=s=>r(m7(s.target.value));return a.jsx(Ai,{label:n("parameters.seedWeights"),value:e,isInvalid:t&&!(Y1(e)||e===""),isDisabled:!t,onChange:o})}const cX=ve(Rt,e=>({activeLabel:e.generation.shouldGenerateVariations?"Enabled":void 0}),it),uX=()=>{const{t:e}=fe(),{activeLabel:t}=L(cX);return br("variation").isFeatureEnabled?a.jsx(To,{label:e("parameters.variations"),activeLabel:t,children:a.jsxs(F,{sx:{gap:2,flexDirection:"column"},children:[a.jsx(sX,{}),a.jsx(oX,{}),a.jsx(lX,{})]})}):null},Z1=f.memo(uX),dX=ve(Mo,e=>({isProcessing:e.isProcessing,isConnected:e.isConnected,isCancelable:e.isCancelable,currentIteration:e.currentIteration,totalIterations:e.totalIterations,sessionId:e.sessionId,cancelType:e.cancelType,isCancelScheduled:e.isCancelScheduled}),{memoizeOptions:{resultEqualityCheck:Qt}}),fX=e=>{const t=te(),{btnGroupWidth:n="auto",...r}=e,{isProcessing:o,isConnected:s,isCancelable:i,cancelType:u,isCancelScheduled:d,sessionId:p}=L(dX),h=f.useCallback(()=>{if(p){if(u==="scheduled"){t(g7());return}t(v7({session_id:p}))}},[t,p,u]),{t:g}=fe(),v=f.useCallback(w=>{const C=Array.isArray(w)?w[0]:w;t(y7(C))},[t]);Ke("shift+x",()=>{(s||o)&&i&&h()},[s,o,i]);const b=f.useMemo(()=>g(d?"parameters.cancel.isScheduled":u==="immediate"?"parameters.cancel.immediate":"parameters.cancel.schedule"),[g,u,d]),S=f.useMemo(()=>d?a.jsx(b7,{}):u==="immediate"?a.jsx(JB,{}):a.jsx(qB,{}),[u,d]);return a.jsxs(Yn,{isAttached:!0,width:n,children:[a.jsx(je,{icon:S,tooltip:b,"aria-label":b,isDisabled:!s||!o||!i,onClick:h,colorScheme:"error",id:"cancel-button",...r}),a.jsxs(Iu,{closeOnSelect:!1,children:[a.jsx(Eu,{as:je,tooltip:g("parameters.cancel.setType"),"aria-label":g("parameters.cancel.setType"),icon:a.jsx(z$,{w:"1em",h:"1em"}),paddingX:0,paddingY:0,colorScheme:"error",minWidth:5,...r}),a.jsx(tc,{minWidth:"240px",children:a.jsxs(Nv,{value:u,title:"Cancel Type",type:"radio",onChange:v,children:[a.jsx(ru,{value:"immediate",children:g("parameters.cancel.immediate")}),a.jsx(ru,{value:"scheduled",children:g("parameters.cancel.schedule")})]})})]})]})},Dh=f.memo(fX),pX=ve(Mo,e=>({isProcessing:e.isProcessing,currentStep:e.currentStep,totalSteps:e.totalSteps,currentStatusHasSteps:e.currentStatusHasSteps}),{memoizeOptions:{resultEqualityCheck:Qt}}),hX=()=>{const{t:e}=fe(),{isProcessing:t,currentStep:n,totalSteps:r,currentStatusHasSteps:o}=L(pX),s=n?Math.round(n*100/r):0;return a.jsx(Q6,{value:s,"aria-label":e("accessibility.invokeProgressBar"),isIndeterminate:t&&!o,height:"full",colorScheme:"accent"})},Hj=f.memo(hX),SC={_disabled:{bg:"none",color:"base.600",cursor:"not-allowed",_hover:{color:"base.600",bg:"none"}}};function ey(e){const{iconButton:t=!1,...n}=e,r=te(),o=Q1(),s=L(ur),i=L(p=>p.system.isProcessing),u=f.useCallback(()=>{r(pv()),r(hv(s))},[r,s]),{t:d}=fe();return Ke(["ctrl+enter","meta+enter"],u,{enabled:()=>o,preventDefault:!0,enableOnFormTags:["input","textarea","select"]},[o,s]),a.jsx(ze,{style:{flexGrow:4},position:"relative",children:a.jsxs(ze,{style:{position:"relative"},children:[!o&&a.jsx(ze,{borderRadius:"base",style:{position:"absolute",bottom:"0",left:"0",right:"0",height:"100%",overflow:"clip"},...n,children:a.jsx(Hj,{})}),t?a.jsx(je,{"aria-label":d("parameters.invoke"),type:"submit",icon:a.jsx(L5,{}),isDisabled:!o||i,onClick:u,tooltip:d("parameters.invoke"),tooltipProps:{placement:"top"},colorScheme:"accent",id:"invoke-button",...n,sx:{w:"full",flexGrow:1,...i?SC:{}}}):a.jsx(Zt,{"aria-label":d("parameters.invoke"),type:"submit",isDisabled:!o||i,onClick:u,colorScheme:"accent",id:"invoke-button",...n,sx:{w:"full",flexGrow:1,fontWeight:700,...i?SC:{}},children:"Invoke"})]})})}const ty=()=>a.jsxs(F,{gap:2,children:[a.jsx(ey,{}),a.jsx(Dh,{})]}),Bp=/^-?(0\.)?\.?$/,mX=e=>{const{label:t,isDisabled:n=!1,showStepper:r=!0,isInvalid:o,value:s,onChange:i,min:u,max:d,isInteger:p=!0,formControlProps:h,formLabelProps:g,numberInputFieldProps:v,numberInputStepperProps:b,tooltipProps:S,...w}=e,C=te(),[_,k]=f.useState(String(s));f.useEffect(()=>{!_.match(Bp)&&s!==Number(_)&&k(String(s))},[s,_]);const j=M=>{k(M),M.match(Bp)||i(p?Math.floor(Number(M)):Number(M))},E=M=>{const T=Vs(p?Math.floor(Number(M.target.value)):Number(M.target.value),u,d);k(String(T)),i(T)},I=f.useCallback(M=>{M.shiftKey&&C(Ko(!0))},[C]),O=f.useCallback(M=>{M.shiftKey||C(Ko(!1))},[C]);return a.jsx(_n,{...S,children:a.jsxs(Ss,{isDisabled:n,isInvalid:o,...h,children:[t&&a.jsx(vs,{...g,children:t}),a.jsxs(z4,{value:_,min:u,max:d,keepWithinRange:!0,clampValueOnBlur:!1,onChange:j,onBlur:E,...w,onPaste:q1,children:[a.jsx(L4,{...v,onKeyDown:I,onKeyUp:O}),r&&a.jsxs(B4,{children:[a.jsx(F4,{...b}),a.jsx(H4,{...b})]})]})]})})},Th=f.memo(mX),gX=ve([Jo,Wi,Jr,xu],(e,t,n,r)=>{const{initial:o,min:s,sliderMax:i,inputMax:u}=t.sd.guidance,{cfgScale:d}=e,{shouldUseSliders:p}=n,{shift:h}=r;return{cfgScale:d,initial:o,min:s,sliderMax:i,inputMax:u,shouldUseSliders:p,shift:h}},it),vX=()=>{const{cfgScale:e,initial:t,min:n,sliderMax:r,inputMax:o,shouldUseSliders:s,shift:i}=L(gX),u=te(),{t:d}=fe(),p=f.useCallback(g=>u(kf(g)),[u]),h=f.useCallback(()=>u(kf(t)),[u,t]);return s?a.jsx(St,{label:d("parameters.cfgScale"),step:i?.1:.5,min:n,max:r,onChange:p,handleReset:h,value:e,sliderNumberInputProps:{max:o},withInput:!0,withReset:!0,withSliderMarks:!0,isInteger:!1}):a.jsx(Th,{label:d("parameters.cfgScale"),step:.5,min:n,max:o,onChange:p,value:e,isInteger:!1,numberInputFieldProps:{textAlign:"center"}})},Hl=f.memo(vX),yX=ve([Rt],e=>{const{initial:t,min:n,sliderMax:r,inputMax:o,fineStep:s,coarseStep:i}=e.config.sd.iterations,{iterations:u}=e.generation,{shouldUseSliders:d}=e.ui,p=e.dynamicPrompts.isEnabled&&e.dynamicPrompts.combinatorial,h=e.hotkeys.shift?s:i;return{iterations:u,initial:t,min:n,sliderMax:r,inputMax:o,step:h,shouldUseSliders:d,isDisabled:p}},it),bX=()=>{const{iterations:e,initial:t,min:n,sliderMax:r,inputMax:o,step:s,shouldUseSliders:i,isDisabled:u}=L(yX),d=te(),{t:p}=fe(),h=f.useCallback(v=>{d(dx(v))},[d]),g=f.useCallback(()=>{d(dx(t))},[d,t]);return i?a.jsx(St,{isDisabled:u,label:p("parameters.images"),step:s,min:n,max:r,onChange:h,handleReset:g,value:e,withInput:!0,withReset:!0,withSliderMarks:!0,sliderNumberInputProps:{max:o}}):a.jsx(Th,{isDisabled:u,label:p("parameters.images"),step:s,min:n,max:o,onChange:h,value:e,numberInputFieldProps:{textAlign:"center"}})},Wl=f.memo(bX),xX=Yp.child({module:"models"}),Wj=e=>{const[t,n,r]=e.split("/"),o=x7.safeParse({base_model:t,model_name:r});if(!o.success){xX.error({mainModelId:e,errors:o.error.format()},"Failed to parse main model id");return}return o.data},wX=ve(Rt,e=>({model:e.generation.model}),it),SX=()=>{const e=te(),{t}=fe(),{model:n}=L(wX),{data:r,isLoading:o}=ji(),s=f.useMemo(()=>{if(!r)return[];const d=[];return Qo(r.entities,(p,h)=>{!p||["sdxl","sdxl-refiner"].includes(p.base_model)||d.push({value:h,label:p.model_name,group:Or[p.base_model]})}),d},[r]),i=f.useMemo(()=>(r==null?void 0:r.entities[`${n==null?void 0:n.base_model}/main/${n==null?void 0:n.model_name}`])??null,[r==null?void 0:r.entities,n]),u=f.useCallback(d=>{if(!d)return;const p=Wj(d);p&&e(Gg(p))},[e]);return o?a.jsx(Mr,{label:t("modelManager.model"),placeholder:"Loading...",disabled:!0,data:[]}):a.jsx(Mr,{tooltip:i==null?void 0:i.description,label:t("modelManager.model"),value:i==null?void 0:i.id,placeholder:s.length>0?"Select a model":"No models available",data:s,error:s.length===0,disabled:s.length===0,onChange:u})},CX=f.memo(SX),_X=Yp.child({module:"models"}),Vj=e=>{const[t,n,r]=e.split("/"),o=w7.safeParse({base_model:t,model_name:r});if(!o.success){_X.error({vaeModelId:e,errors:o.error.format()},"Failed to parse VAE model id");return}return o.data},kX=ve(Rt,({generation:e})=>{const{model:t,vae:n}=e;return{model:t,vae:n}},it),PX=()=>{const e=te(),{t}=fe(),{model:n,vae:r}=L(kX),{data:o}=W4(),s=f.useMemo(()=>{if(!o)return[];const d=[{value:"default",label:"Default",group:"Default"}];return Qo(o.entities,(p,h)=>{if(!p)return;const g=(n==null?void 0:n.base_model)!==p.base_model;d.push({value:h,label:p.model_name,group:Or[p.base_model],disabled:g,tooltip:g?`Incompatible base model: ${p.base_model}`:void 0})}),d.sort((p,h)=>p.disabled&&!h.disabled?1:-1)},[o,n==null?void 0:n.base_model]),i=f.useMemo(()=>(o==null?void 0:o.entities[`${r==null?void 0:r.base_model}/vae/${r==null?void 0:r.model_name}`])??null,[o==null?void 0:o.entities,r]),u=f.useCallback(d=>{if(!d||d==="default"){e(fx(null));return}const p=Vj(d);p&&e(fx(p))},[e]);return a.jsx(Mr,{itemComponent:Vi,tooltip:i==null?void 0:i.description,label:t("modelManager.vae"),value:(i==null?void 0:i.id)??"default",placeholder:"Default",data:s,onChange:u,disabled:s.length===0,clearable:!0})},jX=f.memo(PX),IX=ve([Jr,Jo],(e,t)=>{const{scheduler:n}=t,{favoriteSchedulers:r}=e,o=R4.map(s=>({value:s,label:D4[s],group:r.includes(s)?"Favorites":void 0})).sort((s,i)=>s.label.localeCompare(i.label));return{scheduler:n,data:o}},it),EX=()=>{const e=te(),{t}=fe(),{scheduler:n,data:r}=L(IX),o=f.useCallback(s=>{s&&e(qg(s))},[e]);return a.jsx(Mr,{label:t("parameters.scheduler"),value:n,data:r,onChange:o})},OX=f.memo(EX),MX=()=>{const e=br("vae").isFeatureEnabled;return a.jsxs(F,{gap:3,w:"full",flexWrap:e?"wrap":"nowrap",children:[a.jsx(ze,{w:"full",children:a.jsx(CX,{})}),a.jsxs(F,{gap:3,w:"full",children:[e&&a.jsx(ze,{w:"full",children:a.jsx(jX,{})}),a.jsx(ze,{w:"full",children:a.jsx(OX,{})})]})]})},Vl=f.memo(MX),RX=[{name:"Free",value:null},{name:"Portrait",value:.67/1},{name:"Wide",value:16/9},{name:"Square",value:1/1}];function Uj(){const e=L(o=>o.ui.aspectRatio),t=te(),n=L(o=>o.generation.shouldFitToWidthHeight),r=L(ur);return a.jsx(F,{gap:2,flexGrow:1,children:a.jsx(Yn,{isAttached:!0,children:RX.map(o=>a.jsx(Zt,{size:"sm",isChecked:e===o.value,isDisabled:r==="img2img"?!n:!1,onClick:()=>t(S7(o.value)),children:o.name},o.name))})})}const DX=ve([Jo,xu,Wi,Jr],(e,t,n,r)=>{const{initial:o,min:s,sliderMax:i,inputMax:u,fineStep:d,coarseStep:p}=n.sd.height,{height:h}=e,{aspectRatio:g}=r,v=t.shift?d:p;return{height:h,initial:o,min:s,sliderMax:i,inputMax:u,step:v,aspectRatio:g}},it),TX=e=>{const{height:t,initial:n,min:r,sliderMax:o,inputMax:s,step:i,aspectRatio:u}=L(DX),d=te(),{t:p}=fe(),h=f.useCallback(v=>{if(d(Al(v)),u){const b=cs(v*u,8);d(Tl(b))}},[d,u]),g=f.useCallback(()=>{if(d(Al(n)),u){const v=cs(n*u,8);d(Tl(v))}},[d,n,u]);return a.jsx(St,{label:p("parameters.height"),value:t,min:r,step:i,max:o,onChange:h,handleReset:g,withInput:!0,withReset:!0,withSliderMarks:!0,sliderNumberInputProps:{max:s},...e})},AX=f.memo(TX),NX=ve([Jo,xu,Wi,Jr],(e,t,n,r)=>{const{initial:o,min:s,sliderMax:i,inputMax:u,fineStep:d,coarseStep:p}=n.sd.width,{width:h}=e,{aspectRatio:g}=r,v=t.shift?d:p;return{width:h,initial:o,min:s,sliderMax:i,inputMax:u,step:v,aspectRatio:g}},it),$X=e=>{const{width:t,initial:n,min:r,sliderMax:o,inputMax:s,step:i,aspectRatio:u}=L(NX),d=te(),{t:p}=fe(),h=f.useCallback(v=>{if(d(Tl(v)),u){const b=cs(v/u,8);d(Al(b))}},[d,u]),g=f.useCallback(()=>{if(d(Tl(n)),u){const v=cs(n/u,8);d(Al(v))}},[d,n,u]);return a.jsx(St,{label:p("parameters.width"),value:t,min:r,step:i,max:o,onChange:h,handleReset:g,withInput:!0,withReset:!0,withSliderMarks:!0,sliderNumberInputProps:{max:s},...e})},zX=f.memo($X);function Fp(){const{t:e}=fe(),t=te(),n=L(o=>o.generation.shouldFitToWidthHeight),r=L(ur);return a.jsxs(F,{sx:{gap:2,p:4,borderRadius:4,flexDirection:"column",w:"full",bg:"base.150",_dark:{bg:"base.750"}},children:[a.jsxs(F,{alignItems:"center",gap:2,children:[a.jsx(nt,{sx:{fontSize:"sm",width:"full",color:"base.700",_dark:{color:"base.300"}},children:e("parameters.aspectRatio")}),a.jsx($i,{}),a.jsx(Uj,{}),a.jsx(je,{tooltip:e("ui.swapSizes"),"aria-label":e("ui.swapSizes"),size:"sm",icon:a.jsx(V_,{}),fontSize:20,isDisabled:r==="img2img"?!n:!1,onClick:()=>t(C7())})]}),a.jsx(F,{gap:2,alignItems:"center",children:a.jsxs(F,{gap:2,flexDirection:"column",width:"full",children:[a.jsx(zX,{isDisabled:r==="img2img"?!n:!1}),a.jsx(AX,{isDisabled:r==="img2img"?!n:!1})]})})]})}const LX=ve([Jo,Wi,Jr,xu],(e,t,n,r)=>{const{initial:o,min:s,sliderMax:i,inputMax:u,fineStep:d,coarseStep:p}=t.sd.steps,{steps:h}=e,{shouldUseSliders:g}=n,v=r.shift?d:p;return{steps:h,initial:o,min:s,sliderMax:i,inputMax:u,step:v,shouldUseSliders:g}},it),BX=()=>{const{steps:e,initial:t,min:n,sliderMax:r,inputMax:o,step:s,shouldUseSliders:i}=L(LX),u=te(),{t:d}=fe(),p=f.useCallback(v=>{u(Pf(v))},[u]),h=f.useCallback(()=>{u(Pf(t))},[u,t]),g=f.useCallback(()=>{u(pv())},[u]);return i?a.jsx(St,{label:d("parameters.steps"),min:n,max:r,step:s,onChange:p,handleReset:h,value:e,withInput:!0,withReset:!0,withSliderMarks:!0,sliderNumberInputProps:{max:o}}):a.jsx(Th,{label:d("parameters.steps"),min:n,max:o,step:s,onChange:p,value:e,numberInputFieldProps:{textAlign:"center"},onBlur:g})},Ul=f.memo(BX);function FX(){const e=te(),t=L(o=>o.generation.shouldFitToWidthHeight),n=o=>e(_7(o.target.checked)),{t:r}=fe();return a.jsx(jn,{label:r("parameters.imageFit"),isChecked:t,onChange:n})}const HX=ve([Jo,xu,Wi],(e,t,n)=>{const{initial:r,min:o,sliderMax:s,inputMax:i,fineStep:u,coarseStep:d}=n.sd.img2imgStrength,{img2imgStrength:p}=e,h=t.shift?u:d;return{img2imgStrength:p,initial:r,min:o,sliderMax:s,inputMax:i,step:h}},it),WX=()=>{const{img2imgStrength:e,initial:t,min:n,sliderMax:r,inputMax:o,step:s}=L(HX),i=te(),{t:u}=fe(),d=f.useCallback(h=>i(jf(h)),[i]),p=f.useCallback(()=>{i(jf(t))},[i,t]);return a.jsx(St,{label:`${u("parameters.denoisingStrength")}`,step:s,min:n,max:r,onChange:d,handleReset:p,value:e,isInteger:!1,withInput:!0,withSliderMarks:!0,withReset:!0,sliderNumberInputProps:{max:o}})},Gj=f.memo(WX);function VX(){const e=L(i=>i.generation.seed),t=L(i=>i.generation.shouldRandomizeSeed),n=L(i=>i.generation.shouldGenerateVariations),{t:r}=fe(),o=te(),s=i=>o(_f(i));return a.jsx(Th,{label:r("parameters.seed"),step:1,precision:0,flexGrow:1,min:V4,max:U4,isDisabled:t,isInvalid:e<0&&n,onChange:s,value:e,formControlProps:{display:"flex",alignItems:"center",gap:3}})}const UX=(e,t)=>Math.floor(Math.random()*(t-e+1)+e);function GX(){const e=te(),t=L(o=>o.generation.shouldRandomizeSeed),{t:n}=fe(),r=()=>e(_f(UX(V4,U4)));return a.jsx(je,{size:"sm",isDisabled:t,"aria-label":n("parameters.shuffle"),tooltip:n("parameters.shuffle"),onClick:r,icon:a.jsx(j$,{})})}const qX=()=>{const e=te(),{t}=fe(),n=L(o=>o.generation.shouldRandomizeSeed),r=o=>e(k7(o.target.checked));return a.jsx(jn,{label:t("common.random"),isChecked:n,onChange:r})},KX=f.memo(qX),YX=()=>a.jsxs(F,{sx:{gap:4,alignItems:"center"},children:[a.jsx(VX,{}),a.jsx(GX,{}),a.jsx(KX,{})]}),Gl=f.memo(YX),QX=ve([Jr,Jo],(e,t)=>{const{shouldUseSliders:n}=e,{shouldFitToWidthHeight:r,shouldRandomizeSeed:o}=t;return{shouldUseSliders:n,shouldFitToWidthHeight:r,activeLabel:o?void 0:"Manual Seed"}},it),XX=()=>{const{shouldUseSliders:e,shouldFitToWidthHeight:t,activeLabel:n}=L(QX);return a.jsx(To,{label:"General",activeLabel:n,defaultIsOpen:!0,children:a.jsxs(F,{sx:{flexDirection:"column",gap:3},children:[e?a.jsxs(a.Fragment,{children:[a.jsx(Wl,{}),a.jsx(Ul,{}),a.jsx(Hl,{}),a.jsx(Vl,{}),a.jsx(ze,{pt:2,children:a.jsx(Gl,{})}),a.jsx(Fp,{})]}):a.jsxs(a.Fragment,{children:[a.jsxs(F,{gap:3,children:[a.jsx(Wl,{}),a.jsx(Ul,{}),a.jsx(Hl,{})]}),a.jsx(Vl,{}),a.jsx(ze,{pt:2,children:a.jsx(Gl,{})}),a.jsx(Fp,{})]}),a.jsx(Gj,{}),a.jsx(FX,{})]})})},JX=f.memo(XX),ZX=()=>a.jsxs(a.Fragment,{children:[a.jsx(X1,{}),a.jsx(K1,{}),a.jsx(ty,{}),a.jsx(JX,{}),a.jsx(G1,{}),a.jsx(V1,{}),a.jsx(W1,{}),a.jsx(Z1,{}),a.jsx(Bj,{}),a.jsx(J1,{}),a.jsx(Fj,{}),a.jsx(U1,{})]}),qj=f.memo(ZX),eJ=()=>{const e=te(),t=f.useRef(null),n=f.useCallback(()=>{t.current&&t.current.setLayout([50,50])},[]);return a.jsxs(F,{sx:{gap:4,w:"full",h:"full"},children:[a.jsx(H1,{children:a.jsx(qj,{})}),a.jsx(ze,{sx:{w:"full",h:"full"},children:a.jsxs(B1,{ref:t,autoSaveId:"imageTab.content",direction:"horizontal",style:{height:"100%",width:"100%"},children:[a.jsx(fu,{id:"imageTab.content.initImage",order:0,defaultSize:50,minSize:25,style:{position:"relative"},children:a.jsx(YK,{})}),a.jsx(Mj,{onDoubleClick:n}),a.jsx(fu,{id:"imageTab.content.selectedImage",order:1,defaultSize:50,minSize:25,onResize:()=>{e(vo())},children:a.jsx(Aj,{})})]})})]})},tJ=f.memo(eJ);var nJ=function e(t,n){if(t===n)return!0;if(t&&n&&typeof t=="object"&&typeof n=="object"){if(t.constructor!==n.constructor)return!1;var r,o,s;if(Array.isArray(t)){if(r=t.length,r!=n.length)return!1;for(o=r;o--!==0;)if(!e(t[o],n[o]))return!1;return!0}if(t.constructor===RegExp)return t.source===n.source&&t.flags===n.flags;if(t.valueOf!==Object.prototype.valueOf)return t.valueOf()===n.valueOf();if(t.toString!==Object.prototype.toString)return t.toString()===n.toString();if(s=Object.keys(t),r=s.length,r!==Object.keys(n).length)return!1;for(o=r;o--!==0;)if(!Object.prototype.hasOwnProperty.call(n,s[o]))return!1;for(o=r;o--!==0;){var i=s[o];if(!e(t[i],n[i]))return!1}return!0}return t!==t&&n!==n};const CC=vu(nJ);function V0(e){return e===null||typeof e!="object"?{}:Object.keys(e).reduce((t,n)=>{const r=e[n];return r!=null&&r!==!1&&(t[n]=r),t},{})}var rJ=Object.defineProperty,_C=Object.getOwnPropertySymbols,oJ=Object.prototype.hasOwnProperty,sJ=Object.prototype.propertyIsEnumerable,kC=(e,t,n)=>t in e?rJ(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,aJ=(e,t)=>{for(var n in t||(t={}))oJ.call(t,n)&&kC(e,n,t[n]);if(_C)for(var n of _C(t))sJ.call(t,n)&&kC(e,n,t[n]);return e};function Kj(e,t){if(t===null||typeof t!="object")return{};const n=aJ({},t);return Object.keys(t).forEach(r=>{r.includes(`${String(e)}.`)&&delete n[r]}),n}const iJ="__MANTINE_FORM_INDEX__";function PC(e,t){return t?typeof t=="boolean"?t:Array.isArray(t)?t.includes(e.replace(/[.][0-9]/g,`.${iJ}`)):!1:!1}function jC(e,t,n){typeof n.value=="object"&&(n.value=xl(n.value)),!n.enumerable||n.get||n.set||!n.configurable||!n.writable||t==="__proto__"?Object.defineProperty(e,t,n):e[t]=n.value}function xl(e){if(typeof e!="object")return e;var t=0,n,r,o,s=Object.prototype.toString.call(e);if(s==="[object Object]"?o=Object.create(e.__proto__||null):s==="[object Array]"?o=Array(e.length):s==="[object Set]"?(o=new Set,e.forEach(function(i){o.add(xl(i))})):s==="[object Map]"?(o=new Map,e.forEach(function(i,u){o.set(xl(u),xl(i))})):s==="[object Date]"?o=new Date(+e):s==="[object RegExp]"?o=new RegExp(e.source,e.flags):s==="[object DataView]"?o=new e.constructor(xl(e.buffer)):s==="[object ArrayBuffer]"?o=e.slice(0):s.slice(-6)==="Array]"&&(o=new e.constructor(e)),o){for(r=Object.getOwnPropertySymbols(e);t0,errors:t}}function U0(e,t,n="",r={}){return typeof e!="object"||e===null?r:Object.keys(e).reduce((o,s)=>{const i=e[s],u=`${n===""?"":`${n}.`}${s}`,d=ia(u,t);let p=!1;return typeof i=="function"&&(o[u]=i(d,t,u)),typeof i=="object"&&Array.isArray(d)&&(p=!0,d.forEach((h,g)=>U0(i,t,`${u}.${g}`,o))),typeof i=="object"&&typeof d=="object"&&d!==null&&(p||U0(i,t,u,o)),o},r)}function G0(e,t){return IC(typeof e=="function"?e(t):U0(e,t))}function df(e,t,n){if(typeof e!="string")return{hasError:!1,error:null};const r=G0(t,n),o=Object.keys(r.errors).find(s=>e.split(".").every((i,u)=>i===s.split(".")[u]));return{hasError:!!o,error:o?r.errors[o]:null}}function lJ(e,{from:t,to:n},r){const o=ia(e,r);if(!Array.isArray(o))return r;const s=[...o],i=o[t];return s.splice(t,1),s.splice(n,0,i),Ah(e,s,r)}var cJ=Object.defineProperty,EC=Object.getOwnPropertySymbols,uJ=Object.prototype.hasOwnProperty,dJ=Object.prototype.propertyIsEnumerable,OC=(e,t,n)=>t in e?cJ(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,fJ=(e,t)=>{for(var n in t||(t={}))uJ.call(t,n)&&OC(e,n,t[n]);if(EC)for(var n of EC(t))dJ.call(t,n)&&OC(e,n,t[n]);return e};function pJ(e,{from:t,to:n},r){const o=`${e}.${t}`,s=`${e}.${n}`,i=fJ({},r);return Object.keys(r).every(u=>{let d,p;if(u.startsWith(o)&&(d=u,p=u.replace(o,s)),u.startsWith(s)&&(d=u.replace(s,o),p=u),d&&p){const h=i[d],g=i[p];return g===void 0?delete i[d]:i[d]=g,h===void 0?delete i[p]:i[p]=h,!1}return!0}),i}function hJ(e,t,n){const r=ia(e,n);return Array.isArray(r)?Ah(e,r.filter((o,s)=>s!==t),n):n}var mJ=Object.defineProperty,MC=Object.getOwnPropertySymbols,gJ=Object.prototype.hasOwnProperty,vJ=Object.prototype.propertyIsEnumerable,RC=(e,t,n)=>t in e?mJ(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,yJ=(e,t)=>{for(var n in t||(t={}))gJ.call(t,n)&&RC(e,n,t[n]);if(MC)for(var n of MC(t))vJ.call(t,n)&&RC(e,n,t[n]);return e};function DC(e,t){const n=e.substring(t.length+1).split(".")[0];return parseInt(n,10)}function TC(e,t,n,r){if(t===void 0)return n;const o=`${String(e)}`;let s=n;r===-1&&(s=Kj(`${o}.${t}`,s));const i=yJ({},s),u=new Set;return Object.entries(s).filter(([d])=>{if(!d.startsWith(`${o}.`))return!1;const p=DC(d,o);return Number.isNaN(p)?!1:p>=t}).forEach(([d,p])=>{const h=DC(d,o),g=d.replace(`${o}.${h}`,`${o}.${h+r}`);i[g]=p,u.add(g),u.has(d)||delete i[d]}),i}function bJ(e,t,n,r){const o=ia(e,r);if(!Array.isArray(o))return r;const s=[...o];return s.splice(typeof n=="number"?n:s.length,0,t),Ah(e,s,r)}function AC(e,t){const n=Object.keys(e);if(typeof t=="string"){const r=n.filter(o=>o.startsWith(`${t}.`));return e[t]||r.some(o=>e[o])||!1}return n.some(r=>e[r])}function xJ(e){return t=>{if(!t)e(t);else if(typeof t=="function")e(t);else if(typeof t=="object"&&"nativeEvent"in t){const{currentTarget:n}=t;n instanceof HTMLInputElement?n.type==="checkbox"?e(n.checked):e(n.value):(n instanceof HTMLTextAreaElement||n instanceof HTMLSelectElement)&&e(n.value)}else e(t)}}var wJ=Object.defineProperty,SJ=Object.defineProperties,CJ=Object.getOwnPropertyDescriptors,NC=Object.getOwnPropertySymbols,_J=Object.prototype.hasOwnProperty,kJ=Object.prototype.propertyIsEnumerable,$C=(e,t,n)=>t in e?wJ(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,$a=(e,t)=>{for(var n in t||(t={}))_J.call(t,n)&&$C(e,n,t[n]);if(NC)for(var n of NC(t))kJ.call(t,n)&&$C(e,n,t[n]);return e},$g=(e,t)=>SJ(e,CJ(t));function lc({initialValues:e={},initialErrors:t={},initialDirty:n={},initialTouched:r={},clearInputErrorOnChange:o=!0,validateInputOnChange:s=!1,validateInputOnBlur:i=!1,transformValues:u=p=>p,validate:d}={}){const[p,h]=f.useState(r),[g,v]=f.useState(n),[b,S]=f.useState(e),[w,C]=f.useState(V0(t)),_=f.useRef(e),k=Z=>{_.current=Z},j=f.useCallback(()=>h({}),[]),E=Z=>{const W=Z?$a($a({},b),Z):b;k(W),v({})},I=f.useCallback(Z=>C(W=>V0(typeof Z=="function"?Z(W):Z)),[]),O=f.useCallback(()=>C({}),[]),M=f.useCallback(()=>{S(e),O(),k(e),v({}),j()},[]),T=f.useCallback((Z,W)=>I(re=>$g($a({},re),{[Z]:W})),[]),A=f.useCallback(Z=>I(W=>{if(typeof Z!="string")return W;const re=$a({},W);return delete re[Z],re}),[]),z=f.useCallback(Z=>v(W=>{if(typeof Z!="string")return W;const re=Kj(Z,W);return delete re[Z],re}),[]),$=f.useCallback((Z,W)=>{const re=PC(Z,s);z(Z),h(pe=>$g($a({},pe),{[Z]:!0})),S(pe=>{const ne=Ah(Z,W,pe);if(re){const ge=df(Z,d,ne);ge.hasError?T(Z,ge.error):A(Z)}return ne}),!re&&o&&T(Z,null)},[]),ee=f.useCallback(Z=>{S(W=>{const re=typeof Z=="function"?Z(W):Z;return $a($a({},W),re)}),o&&O()},[]),B=f.useCallback((Z,W)=>{z(Z),S(re=>lJ(Z,W,re)),C(re=>pJ(Z,W,re))},[]),H=f.useCallback((Z,W)=>{z(Z),S(re=>hJ(Z,W,re)),C(re=>TC(Z,W,re,-1))},[]),G=f.useCallback((Z,W,re)=>{z(Z),S(pe=>bJ(Z,W,re,pe)),C(pe=>TC(Z,re,pe,1))},[]),K=f.useCallback(()=>{const Z=G0(d,b);return C(Z.errors),Z},[b,d]),R=f.useCallback(Z=>{const W=df(Z,d,b);return W.hasError?T(Z,W.error):A(Z),W},[b,d]),U=(Z,{type:W="input",withError:re=!0,withFocus:pe=!0}={})=>{const ge={onChange:xJ(ue=>$(Z,ue))};return re&&(ge.error=w[Z]),W==="checkbox"?ge.checked=ia(Z,b):ge.value=ia(Z,b),pe&&(ge.onFocus=()=>h(ue=>$g($a({},ue),{[Z]:!0})),ge.onBlur=()=>{if(PC(Z,i)){const ue=df(Z,d,b);ue.hasError?T(Z,ue.error):A(Z)}}),ge},V=(Z,W)=>re=>{re==null||re.preventDefault();const pe=K();pe.hasErrors?W==null||W(pe.errors,b,re):Z==null||Z(u(b),re)},J=Z=>u(Z||b),ie=f.useCallback(Z=>{Z.preventDefault(),M()},[]),xe=Z=>{if(Z){const re=ia(Z,g);if(typeof re=="boolean")return re;const pe=ia(Z,b),ne=ia(Z,_.current);return!CC(pe,ne)}return Object.keys(g).length>0?AC(g):!CC(b,_.current)},he=f.useCallback(Z=>AC(p,Z),[p]),ae=f.useCallback(Z=>Z?!df(Z,d,b).hasError:!G0(d,b).hasErrors,[b,d]);return{values:b,errors:w,setValues:ee,setErrors:I,setFieldValue:$,setFieldError:T,clearFieldError:A,clearErrors:O,reset:M,validate:K,validateField:R,reorderListItem:B,removeListItem:H,insertListItem:G,getInputProps:U,onSubmit:V,onReset:ie,isDirty:xe,isTouched:he,setTouched:h,setDirty:v,resetTouched:j,resetDirty:E,isValid:ae,getTransformedValues:J}}function Er(e){const{...t}=e,{base50:n,base100:r,base200:o,base300:s,base800:i,base700:u,base900:d,accent500:p,accent300:h}=N1(),{colorMode:g}=Ro();return a.jsx(pj,{styles:()=>({input:{color:ke(d,r)(g),backgroundColor:ke(n,d)(g),borderColor:ke(o,i)(g),borderWidth:2,outline:"none",":focus":{borderColor:ke(h,p)(g)}},label:{color:ke(u,s)(g),fontWeight:"normal",marginBottom:4}}),...t})}const PJ=[{value:"sd-1",label:Or["sd-1"]},{value:"sd-2",label:Or["sd-2"]},{value:"sdxl",label:Or.sdxl},{value:"sdxl-refiner",label:Or["sdxl-refiner"]}];function Nh(e){const{...t}=e,{t:n}=fe();return a.jsx(Do,{label:n("modelManager.baseModel"),data:PJ,...t})}function Qj(e){const{data:t}=G4(),{...n}=e;return a.jsx(Do,{label:"Config File",placeholder:"Select A Config File",data:t||[],...n})}const jJ=[{value:"normal",label:"Normal"},{value:"inpaint",label:"Inpaint"},{value:"depth",label:"Depth"}];function $h(e){const{...t}=e,{t:n}=fe();return a.jsx(Do,{label:n("modelManager.variant"),data:jJ,...t})}function Xj(e){const{t}=fe(),n=te(),{model_path:r}=e,o=lc({initialValues:{model_name:r?r.split("\\").splice(-1)[0].split(".")[0]:"",base_model:"sd-1",model_type:"main",path:r||"",description:"",model_format:"checkpoint",error:void 0,vae:"",variant:"normal",config:"configs\\stable-diffusion\\v1-inference.yaml"}}),[s]=q4(),[i,u]=f.useState(!1),d=p=>{s({body:p}).unwrap().then(h=>{n(rr(or({title:`Model Added: ${p.model_name}`,status:"success"}))),o.reset(),r&&n(wu(null))}).catch(h=>{h&&n(rr(or({title:"Model Add Failed",status:"error"})))})};return a.jsx("form",{onSubmit:o.onSubmit(p=>d(p)),style:{width:"100%"},children:a.jsxs(F,{flexDirection:"column",gap:2,children:[a.jsx(Er,{label:"Model Name",required:!0,...o.getInputProps("model_name")}),a.jsx(Nh,{...o.getInputProps("base_model")}),a.jsx(Er,{label:"Model Location",required:!0,...o.getInputProps("path")}),a.jsx(Er,{label:"Description",...o.getInputProps("description")}),a.jsx(Er,{label:"VAE Location",...o.getInputProps("vae")}),a.jsx($h,{...o.getInputProps("variant")}),a.jsxs(F,{flexDirection:"column",width:"100%",gap:2,children:[i?a.jsx(Er,{required:!0,label:"Custom Config File Location",...o.getInputProps("config")}):a.jsx(Qj,{required:!0,width:"100%",...o.getInputProps("config")}),a.jsx(Bn,{isChecked:i,onChange:()=>u(!i),label:"Use Custom Config"}),a.jsx(Zt,{mt:2,type:"submit",children:t("modelManager.addModel")})]})]})})}function Jj(e){const{t}=fe(),n=te(),{model_path:r}=e,[o]=q4(),s=lc({initialValues:{model_name:r?r.split("\\").splice(-1)[0]:"",base_model:"sd-1",model_type:"main",path:r||"",description:"",model_format:"diffusers",error:void 0,vae:"",variant:"normal"}}),i=u=>{o({body:u}).unwrap().then(d=>{n(rr(or({title:`Model Added: ${u.model_name}`,status:"success"}))),s.reset(),r&&n(wu(null))}).catch(d=>{d&&n(rr(or({title:"Model Add Failed",status:"error"})))})};return a.jsx("form",{onSubmit:s.onSubmit(u=>i(u)),style:{width:"100%"},children:a.jsxs(F,{flexDirection:"column",gap:2,children:[a.jsx(Er,{required:!0,label:"Model Name",...s.getInputProps("model_name")}),a.jsx(Nh,{...s.getInputProps("base_model")}),a.jsx(Er,{required:!0,label:"Model Location",placeholder:"Provide the path to a local folder where your Diffusers Model is stored",...s.getInputProps("path")}),a.jsx(Er,{label:"Description",...s.getInputProps("description")}),a.jsx(Er,{label:"VAE Location",...s.getInputProps("vae")}),a.jsx($h,{...s.getInputProps("variant")}),a.jsx(Zt,{mt:2,type:"submit",children:t("modelManager.addModel")})]})})}const Zj=[{label:"Diffusers",value:"diffusers"},{label:"Checkpoint / Safetensors",value:"checkpoint"}];function IJ(){const[e,t]=f.useState("diffusers");return a.jsxs(F,{flexDirection:"column",gap:4,width:"100%",children:[a.jsx(Do,{label:"Model Type",value:e,data:Zj,onChange:n=>{n&&t(n)}}),a.jsxs(F,{sx:{p:4,borderRadius:4,bg:"base.300",_dark:{bg:"base.850"}},children:[e==="diffusers"&&a.jsx(Jj,{}),e==="checkpoint"&&a.jsx(Xj,{})]})]})}const EJ=[{label:"None",value:"none"},{label:"v_prediction",value:"v_prediction"},{label:"epsilon",value:"epsilon"},{label:"sample",value:"sample"}];function OJ(){const e=te(),{t}=fe(),n=L(u=>u.system.isProcessing),[r,{isLoading:o}]=K4(),s=lc({initialValues:{location:"",prediction_type:void 0}}),i=u=>{const d={location:u.location,prediction_type:u.prediction_type==="none"?void 0:u.prediction_type};r({body:d}).unwrap().then(p=>{e(rr(or({title:"Model Added",status:"success"}))),s.reset()}).catch(p=>{p&&(console.log(p),e(rr(or({title:`${p.data.detail} `,status:"error"}))))})};return a.jsx("form",{onSubmit:s.onSubmit(u=>i(u)),style:{width:"100%"},children:a.jsxs(F,{flexDirection:"column",width:"100%",gap:4,children:[a.jsx(Er,{label:"Model Location",placeholder:"Provide a path to a local Diffusers model, local checkpoint / safetensors model a HuggingFace Repo ID, or a checkpoint/diffusers model URL.",w:"100%",...s.getInputProps("location")}),a.jsx(Do,{label:"Prediction Type (for Stable Diffusion 2.x Models only)",data:EJ,defaultValue:"none",...s.getInputProps("prediction_type")}),a.jsx(Zt,{type:"submit",isLoading:o,isDisabled:o||n,children:t("modelManager.addModel")})]})})}function MJ(){const[e,t]=f.useState("simple");return a.jsxs(F,{flexDirection:"column",width:"100%",overflow:"scroll",maxHeight:window.innerHeight-250,gap:4,children:[a.jsxs(Yn,{isAttached:!0,children:[a.jsx(Zt,{size:"sm",isChecked:e=="simple",onClick:()=>t("simple"),children:"Simple"}),a.jsx(Zt,{size:"sm",isChecked:e=="advanced",onClick:()=>t("advanced"),children:"Advanced"})]}),a.jsxs(F,{sx:{p:4,borderRadius:4,background:"base.200",_dark:{background:"base.800"}},children:[e==="simple"&&a.jsx(OJ,{}),e==="advanced"&&a.jsx(IJ,{})]})]})}function RJ(e){const{...t}=e;return a.jsx(aP,{w:"100%",...t,children:e.children})}function DJ(){const e=L(w=>w.modelmanager.searchFolder),[t,n]=f.useState(""),{data:r}=ji(),{foundModels:o,alreadyInstalled:s,filteredModels:i}=Y4({search_path:e||""},{selectFromResult:({data:w})=>{const C=s9(r==null?void 0:r.entities),_=Cs(C,"path"),k=n9(w,_),j=u9(w,_);return{foundModels:w,alreadyInstalled:zC(j,t),filteredModels:zC(k,t)}}}),[u,{isLoading:d}]=K4(),p=te(),{t:h}=fe(),g=f.useCallback(w=>{const C=w.currentTarget.id.split("\\").splice(-1)[0];u({body:{location:w.currentTarget.id}}).unwrap().then(_=>{p(rr(or({title:`Added Model: ${C}`,status:"success"})))}).catch(_=>{_&&p(rr(or({title:"Faile To Add Model",status:"error"})))})},[p,u]),v=f.useCallback(w=>{n(w.target.value)},[]),b=({models:w,showActions:C=!0})=>w.map(_=>a.jsxs(F,{sx:{p:4,gap:4,alignItems:"center",borderRadius:4,bg:"base.200",_dark:{bg:"base.800"}},children:[a.jsxs(F,{w:"100%",sx:{flexDirection:"column",minW:"25%"},children:[a.jsx(nt,{sx:{fontWeight:600},children:_.split("\\").slice(-1)[0]}),a.jsx(nt,{sx:{fontSize:"sm",color:"base.600",_dark:{color:"base.400"}},children:_})]}),C?a.jsxs(F,{gap:2,children:[a.jsx(Zt,{id:_,onClick:g,isLoading:d,children:"Quick Add"}),a.jsx(Zt,{onClick:()=>p(wu(_)),isLoading:d,children:"Advanced"})]}):a.jsx(nt,{sx:{fontWeight:600,p:2,borderRadius:4,color:"accent.50",bg:"accent.400",_dark:{color:"accent.100",bg:"accent.600"}},children:"Installed"})]},_));return(()=>{if(e)return!o||o.length===0?a.jsx(F,{sx:{w:"full",h:"full",justifyContent:"center",alignItems:"center",height:96,userSelect:"none",bg:"base.200",_dark:{bg:"base.900"}},children:a.jsx(nt,{variant:"subtext",children:"No Models Found"})}):a.jsxs(F,{sx:{flexDirection:"column",gap:2,w:"100%",minW:"50%"},children:[a.jsx(Ai,{onChange:v,label:h("modelManager.search"),labelPos:"side"}),a.jsxs(F,{p:2,gap:2,children:[a.jsxs(nt,{sx:{fontWeight:600},children:["Models Found: ",o.length]}),a.jsxs(nt,{sx:{fontWeight:600,color:"accent.500",_dark:{color:"accent.200"}},children:["Not Installed: ",i.length]})]}),a.jsx(RJ,{offsetScrollbars:!0,children:a.jsxs(F,{gap:2,flexDirection:"column",children:[b({models:i}),b({models:s,showActions:!1})]})})]})})()}const zC=(e,t)=>{const n=[];return Qo(e,r=>{r&&r.includes(t)&&n.push(r)}),n};function TJ(){const e=L(i=>i.modelmanager.advancedAddScanModel),[t,n]=f.useState("diffusers"),[r,o]=f.useState(!0);f.useEffect(()=>{e&&[".ckpt",".safetensors",".pth",".pt"].some(i=>e.endsWith(i))?n("checkpoint"):n("diffusers")},[e,n,r]);const s=te();return e&&a.jsxs(ze,{as:io.div,initial:{x:-100,opacity:0},animate:{x:0,opacity:1,transition:{duration:.2}},sx:{display:"flex",flexDirection:"column",minWidth:"40%",maxHeight:window.innerHeight-300,overflow:"scroll",p:4,gap:4,borderRadius:4,bg:"base.200",_dark:{bg:"base.800"}},children:[a.jsxs(F,{justifyContent:"space-between",alignItems:"center",children:[a.jsx(nt,{size:"xl",fontWeight:600,children:r||t==="checkpoint"?"Add Checkpoint Model":"Add Diffusers Model"}),a.jsx(je,{icon:a.jsx(A$,{}),"aria-label":"Close Advanced",onClick:()=>s(wu(null)),size:"sm"})]}),a.jsx(Do,{label:"Model Type",value:t,data:Zj,onChange:i=>{i&&(n(i),o(i==="checkpoint"))}}),r?a.jsx(Xj,{model_path:e},e):a.jsx(Jj,{model_path:e},e)]})}function AJ(){const e=te(),{t}=fe(),n=L(u=>u.modelmanager.searchFolder),{refetch:r}=Y4({search_path:n||""}),o=lc({initialValues:{folder:""}}),s=f.useCallback(u=>{e(px(u.folder))},[e]),i=()=>{r()};return a.jsx("form",{onSubmit:o.onSubmit(u=>s(u)),style:{width:"100%"},children:a.jsxs(F,{sx:{w:"100%",gap:2,borderRadius:4,alignItems:"center"},children:[a.jsxs(F,{w:"100%",alignItems:"center",gap:4,minH:12,children:[a.jsx(nt,{sx:{fontSize:"sm",fontWeight:600,color:"base.700",minW:"max-content",_dark:{color:"base.300"}},children:"Folder"}),n?a.jsx(F,{sx:{w:"100%",p:2,px:4,bg:"base.300",borderRadius:4,fontSize:"sm",fontWeight:"bold",_dark:{bg:"base.700"}},children:n}):a.jsx(Ai,{w:"100%",size:"md",...o.getInputProps("folder")})]}),a.jsxs(F,{gap:2,children:[n?a.jsx(je,{"aria-label":t("modelManager.scanAgain"),tooltip:t("modelManager.scanAgain"),icon:a.jsx(T$,{}),onClick:i,fontSize:18,size:"sm"}):a.jsx(je,{"aria-label":t("modelManager.findModels"),tooltip:t("modelManager.findModels"),icon:a.jsx(E$,{}),fontSize:18,size:"sm",type:"submit"}),a.jsx(je,{"aria-label":t("modelManager.clearCheckpointFolder"),tooltip:t("modelManager.clearCheckpointFolder"),icon:a.jsx(yo,{}),size:"sm",onClick:()=>{e(px(null)),e(wu(null))},isDisabled:!n,colorScheme:"red"})]})]})})}const NJ=f.memo(AJ);function $J(){return a.jsxs(F,{flexDirection:"column",w:"100%",gap:4,children:[a.jsx(NJ,{}),a.jsxs(F,{gap:4,children:[a.jsx(F,{sx:{maxHeight:window.innerHeight-300,overflow:"scroll",gap:4,w:"100%"},children:a.jsx(DJ,{})}),a.jsx(TJ,{})]})]})}function zJ(){const[e,t]=f.useState("add"),{t:n}=fe();return a.jsxs(F,{flexDirection:"column",gap:4,children:[a.jsxs(Yn,{isAttached:!0,children:[a.jsx(Zt,{onClick:()=>t("add"),isChecked:e=="add",size:"sm",width:"100%",children:n("modelManager.addModel")}),a.jsx(Zt,{onClick:()=>t("scan"),isChecked:e=="scan",size:"sm",width:"100%",children:n("modelManager.scanForModels")})]}),e=="add"&&a.jsx(MJ,{}),e=="scan"&&a.jsx($J,{})]})}const LJ=[{label:"Stable Diffusion 1",value:"sd-1"},{label:"Stable Diffusion 2",value:"sd-2"}];function BJ(){const{t:e}=fe(),t=te(),{data:n}=ji(),[r,{isLoading:o}]=P7(),[s,i]=f.useState("sd-1"),u=hx(n==null?void 0:n.entities,(R,U)=>(R==null?void 0:R.model_format)==="diffusers"&&(R==null?void 0:R.base_model)==="sd-1"),d=hx(n==null?void 0:n.entities,(R,U)=>(R==null?void 0:R.model_format)==="diffusers"&&(R==null?void 0:R.base_model)==="sd-2"),p=f.useMemo(()=>({"sd-1":u,"sd-2":d}),[u,d]),[h,g]=f.useState(Object.keys(p[s])[0]),[v,b]=f.useState(Object.keys(p[s])[1]),[S,w]=f.useState(null),[C,_]=f.useState(""),[k,j]=f.useState(.5),[E,I]=f.useState("weighted_sum"),[O,M]=f.useState("root"),[T,A]=f.useState(""),[z,$]=f.useState(!1),ee=Object.keys(p[s]).filter(R=>R!==v&&R!==S),B=Object.keys(p[s]).filter(R=>R!==h&&R!==S),H=Object.keys(p[s]).filter(R=>R!==h&&R!==v),G=R=>{i(R),g(null),b(null)},K=()=>{const R=[];let U=[h,v,S];U=U.filter(J=>J!==null),U.forEach(J=>{J&&R.push(J==null?void 0:J.split("/")[2])});const V={model_names:R,merged_model_name:C!==""?C:R.join("-"),alpha:k,interp:E,force:z,merge_dest_directory:O==="root"?void 0:T};r({base_model:s,body:V}).unwrap().then(J=>{t(rr(or({title:e("modelManager.modelsMerged"),status:"success"})))}).catch(J=>{J&&t(rr(or({title:e("modelManager.modelsMergeFailed"),status:"error"})))})};return a.jsxs(F,{flexDirection:"column",rowGap:4,children:[a.jsxs(F,{sx:{flexDirection:"column",rowGap:1},children:[a.jsx(nt,{children:e("modelManager.modelMergeHeaderHelp1")}),a.jsx(nt,{fontSize:"sm",variant:"subtext",children:e("modelManager.modelMergeHeaderHelp2")})]}),a.jsxs(F,{columnGap:4,children:[a.jsx(Do,{label:"Model Type",w:"100%",data:LJ,value:s,onChange:G}),a.jsx(Mr,{label:e("modelManager.modelOne"),w:"100%",value:h,placeholder:e("modelManager.selectModel"),data:ee,onChange:R=>g(R)}),a.jsx(Mr,{label:e("modelManager.modelTwo"),w:"100%",placeholder:e("modelManager.selectModel"),value:v,data:B,onChange:R=>b(R)}),a.jsx(Mr,{label:e("modelManager.modelThree"),data:H,w:"100%",placeholder:e("modelManager.selectModel"),clearable:!0,onChange:R=>{R?(w(R),I("weighted_sum")):(w(null),I("add_difference"))}})]}),a.jsx(Ai,{label:e("modelManager.mergedModelName"),value:C,onChange:R=>_(R.target.value)}),a.jsxs(F,{sx:{flexDirection:"column",padding:4,borderRadius:"base",gap:4,bg:"base.200",_dark:{bg:"base.800"}},children:[a.jsx(St,{label:e("modelManager.alpha"),min:.01,max:.99,step:.01,value:k,onChange:R=>j(R),withInput:!0,withReset:!0,handleReset:()=>j(.5),withSliderMarks:!0}),a.jsx(nt,{variant:"subtext",fontSize:"sm",children:e("modelManager.modelMergeAlphaHelp")})]}),a.jsxs(F,{sx:{padding:4,borderRadius:"base",gap:4,bg:"base.200",_dark:{bg:"base.800"}},children:[a.jsx(nt,{fontWeight:500,fontSize:"sm",variant:"subtext",children:e("modelManager.interpolationType")}),a.jsx(zf,{value:E,onChange:R=>I(R),children:a.jsx(F,{columnGap:4,children:S===null?a.jsxs(a.Fragment,{children:[a.jsx(sa,{value:"weighted_sum",children:a.jsx(nt,{fontSize:"sm",children:e("modelManager.weightedSum")})}),a.jsx(sa,{value:"sigmoid",children:a.jsx(nt,{fontSize:"sm",children:e("modelManager.sigmoid")})}),a.jsx(sa,{value:"inv_sigmoid",children:a.jsx(nt,{fontSize:"sm",children:e("modelManager.inverseSigmoid")})})]}):a.jsx(sa,{value:"add_difference",children:a.jsx(_n,{label:e("modelManager.modelMergeInterpAddDifferenceHelp"),children:a.jsx(nt,{fontSize:"sm",children:e("modelManager.addDifference")})})})})})]}),a.jsxs(F,{sx:{flexDirection:"column",padding:4,borderRadius:"base",gap:4,bg:"base.200",_dark:{bg:"base.900"}},children:[a.jsxs(F,{columnGap:4,children:[a.jsx(nt,{fontWeight:"500",fontSize:"sm",variant:"subtext",children:e("modelManager.mergedModelSaveLocation")}),a.jsx(zf,{value:O,onChange:R=>M(R),children:a.jsxs(F,{columnGap:4,children:[a.jsx(sa,{value:"root",children:a.jsx(nt,{fontSize:"sm",children:e("modelManager.invokeAIFolder")})}),a.jsx(sa,{value:"custom",children:a.jsx(nt,{fontSize:"sm",children:e("modelManager.custom")})})]})})]}),O==="custom"&&a.jsx(Ai,{label:e("modelManager.mergedModelCustomSaveLocation"),value:T,onChange:R=>A(R.target.value)})]}),a.jsx(Bn,{label:e("modelManager.ignoreMismatch"),isChecked:z,onChange:R=>$(R.target.checked),fontWeight:"500"}),a.jsx(Zt,{onClick:K,isLoading:o,isDisabled:h===null||v===null,children:e("modelManager.merge")})]})}const FJ=tt((e,t)=>{const{t:n}=fe(),{acceptButtonText:r=n("common.accept"),acceptCallback:o,cancelButtonText:s=n("common.cancel"),cancelCallback:i,children:u,title:d,triggerComponent:p}=e,{isOpen:h,onOpen:g,onClose:v}=Ws(),b=f.useRef(null),S=()=>{o(),v()},w=()=>{i&&i(),v()};return a.jsxs(a.Fragment,{children:[f.cloneElement(p,{onClick:g,ref:t}),a.jsx(Ou,{isOpen:h,leastDestructiveRef:b,onClose:v,isCentered:!0,children:a.jsx(va,{children:a.jsxs(Mu,{children:[a.jsx(ga,{fontSize:"lg",fontWeight:"bold",children:d}),a.jsx(ya,{children:u}),a.jsxs(ma,{children:[a.jsx(Zt,{ref:b,onClick:w,children:s}),a.jsx(Zt,{colorScheme:"error",onClick:S,ml:3,children:r})]})]})})})]})}),ny=f.memo(FJ);function HJ(e){const{model:t}=e,n=te(),{t:r}=fe(),[o,{isLoading:s}]=j7(),[i,u]=f.useState("InvokeAIRoot"),[d,p]=f.useState("");f.useEffect(()=>{u("InvokeAIRoot")},[t]);const h=()=>{u("InvokeAIRoot")},g=()=>{const v={base_model:t.base_model,model_name:t.model_name,params:{convert_dest_directory:i==="Custom"?d:void 0}};if(i==="Custom"&&d===""){n(rr(or({title:r("modelManager.noCustomLocationProvided"),status:"error"})));return}n(rr(or({title:`${r("modelManager.convertingModelBegin")}: ${t.model_name}`,status:"success"}))),o(v).unwrap().then(b=>{n(rr(or({title:`${r("modelManager.modelConverted")}: ${t.model_name}`,status:"success"})))}).catch(b=>{n(rr(or({title:`${r("modelManager.modelConversionFailed")}: ${t.model_name}`,status:"error"})))})};return a.jsxs(ny,{title:`${r("modelManager.convert")} ${t.model_name}`,acceptCallback:g,cancelCallback:h,acceptButtonText:`${r("modelManager.convert")}`,triggerComponent:a.jsxs(Zt,{size:"sm","aria-label":r("modelManager.convertToDiffusers"),className:" modal-close-btn",isLoading:s,children:["🧨 ",r("modelManager.convertToDiffusers")]}),motionPreset:"slideInBottom",children:[a.jsxs(F,{flexDirection:"column",rowGap:4,children:[a.jsx(nt,{children:r("modelManager.convertToDiffusersHelpText1")}),a.jsxs(th,{children:[a.jsx(Io,{children:r("modelManager.convertToDiffusersHelpText2")}),a.jsx(Io,{children:r("modelManager.convertToDiffusersHelpText3")}),a.jsx(Io,{children:r("modelManager.convertToDiffusersHelpText4")}),a.jsx(Io,{children:r("modelManager.convertToDiffusersHelpText5")})]}),a.jsx(nt,{children:r("modelManager.convertToDiffusersHelpText6")})]}),a.jsxs(F,{flexDir:"column",gap:2,children:[a.jsxs(F,{marginTop:4,flexDir:"column",gap:2,children:[a.jsx(nt,{fontWeight:"600",children:r("modelManager.convertToDiffusersSaveLocation")}),a.jsx(zf,{value:i,onChange:v=>u(v),children:a.jsxs(F,{gap:4,children:[a.jsx(sa,{value:"InvokeAIRoot",children:a.jsx(_n,{label:"Save converted model in the InvokeAI root folder",children:r("modelManager.invokeRoot")})}),a.jsx(sa,{value:"Custom",children:a.jsx(_n,{label:"Save converted model in a custom folder",children:r("modelManager.custom")})})]})})]}),i==="Custom"&&a.jsxs(F,{flexDirection:"column",rowGap:2,children:[a.jsx(nt,{fontWeight:"500",fontSize:"sm",variant:"subtext",children:r("modelManager.customSaveLocation")}),a.jsx(Ai,{value:d,onChange:v=>{p(v.target.value)},width:"full"})]})]})]})}function WJ(e){const t=L($r),{model:n}=e,[r,{isLoading:o}]=Q4(),{data:s}=G4(),[i,u]=f.useState(!1);f.useEffect(()=>{s!=null&&s.includes(n.config)||u(!0)},[s,n.config]);const d=te(),{t:p}=fe(),h=lc({initialValues:{model_name:n.model_name?n.model_name:"",base_model:n.base_model,model_type:"main",path:n.path?n.path:"",description:n.description?n.description:"",model_format:"checkpoint",vae:n.vae?n.vae:"",config:n.config?n.config:"",variant:n.variant},validate:{path:v=>v.trim().length===0?"Must provide a path":null}}),g=f.useCallback(v=>{const b={base_model:n.base_model,model_name:n.model_name,body:v};r(b).unwrap().then(S=>{h.setValues(S),d(rr(or({title:p("modelManager.modelUpdated"),status:"success"})))}).catch(S=>{h.reset(),d(rr(or({title:p("modelManager.modelUpdateFailed"),status:"error"})))})},[h,d,n.base_model,n.model_name,p,r]);return a.jsxs(F,{flexDirection:"column",rowGap:4,width:"100%",children:[a.jsxs(F,{justifyContent:"space-between",alignItems:"center",children:[a.jsxs(F,{flexDirection:"column",children:[a.jsx(nt,{fontSize:"lg",fontWeight:"bold",children:n.model_name}),a.jsxs(nt,{fontSize:"sm",color:"base.400",children:[Or[n.base_model]," Model"]})]}),["sdxl","sdxl-refiner"].includes(n.base_model)?a.jsx(Xa,{sx:{p:2,borderRadius:4,bg:"error.200",_dark:{bg:"error.400"}},children:"Conversion Not Supported"}):a.jsx(HJ,{model:n})]}),a.jsx(ni,{}),a.jsx(F,{flexDirection:"column",maxHeight:window.innerHeight-270,overflowY:"scroll",children:a.jsx("form",{onSubmit:h.onSubmit(v=>g(v)),children:a.jsxs(F,{flexDirection:"column",overflowY:"scroll",gap:4,children:[a.jsx(Er,{label:p("modelManager.name"),...h.getInputProps("model_name")}),a.jsx(Er,{label:p("modelManager.description"),...h.getInputProps("description")}),a.jsx(Nh,{required:!0,...h.getInputProps("base_model")}),a.jsx($h,{required:!0,...h.getInputProps("variant")}),a.jsx(Er,{required:!0,label:p("modelManager.modelLocation"),...h.getInputProps("path")}),a.jsx(Er,{label:p("modelManager.vaeLocation"),...h.getInputProps("vae")}),a.jsxs(F,{flexDirection:"column",gap:2,children:[i?a.jsx(Er,{required:!0,label:p("modelManager.config"),...h.getInputProps("config")}):a.jsx(Qj,{required:!0,...h.getInputProps("config")}),a.jsx(Bn,{isChecked:i,onChange:()=>u(!i),label:"Use Custom Config"})]}),a.jsx(Zt,{type:"submit",isDisabled:t||o,isLoading:o,children:p("modelManager.updateModel")})]})})})]})}function VJ(e){const t=L($r),{model:n}=e,[r,{isLoading:o}]=Q4(),s=te(),{t:i}=fe(),u=lc({initialValues:{model_name:n.model_name?n.model_name:"",base_model:n.base_model,model_type:"main",path:n.path?n.path:"",description:n.description?n.description:"",model_format:"diffusers",vae:n.vae?n.vae:"",variant:n.variant},validate:{path:p=>p.trim().length===0?"Must provide a path":null}}),d=f.useCallback(p=>{const h={base_model:n.base_model,model_name:n.model_name,body:p};r(h).unwrap().then(g=>{u.setValues(g),s(rr(or({title:i("modelManager.modelUpdated"),status:"success"})))}).catch(g=>{u.reset(),s(rr(or({title:i("modelManager.modelUpdateFailed"),status:"error"})))})},[u,s,n.base_model,n.model_name,i,r]);return a.jsxs(F,{flexDirection:"column",rowGap:4,width:"100%",children:[a.jsxs(F,{flexDirection:"column",children:[a.jsx(nt,{fontSize:"lg",fontWeight:"bold",children:n.model_name}),a.jsxs(nt,{fontSize:"sm",color:"base.400",children:[Or[n.base_model]," Model"]})]}),a.jsx(ni,{}),a.jsx("form",{onSubmit:u.onSubmit(p=>d(p)),children:a.jsxs(F,{flexDirection:"column",overflowY:"scroll",gap:4,children:[a.jsx(Er,{label:i("modelManager.name"),...u.getInputProps("model_name")}),a.jsx(Er,{label:i("modelManager.description"),...u.getInputProps("description")}),a.jsx(Nh,{required:!0,...u.getInputProps("base_model")}),a.jsx($h,{required:!0,...u.getInputProps("variant")}),a.jsx(Er,{required:!0,label:i("modelManager.modelLocation"),...u.getInputProps("path")}),a.jsx(Er,{label:i("modelManager.vaeLocation"),...u.getInputProps("vae")}),a.jsx(Zt,{type:"submit",isDisabled:t||o,isLoading:o,children:i("modelManager.updateModel")})]})})]})}const UJ={"sd-1":"SD1","sd-2":"SD2",sdxl:"SDXL","sdxl-refiner":"SDXLR"};function LC(e){const t=L($r),{t:n}=fe(),r=te(),[o]=I7(),{model:s,isSelected:i,setSelectedModelId:u}=e,d=f.useCallback(()=>{u(s.id)},[s.id,u]),p=f.useCallback(()=>{o(s).unwrap().then(h=>{r(rr(or({title:`${n("modelManager.modelDeleted")}: ${s.model_name}`,status:"success"})))}).catch(h=>{h&&r(rr(or({title:`${n("modelManager.modelDeleteFailed")}: ${s.model_name}`,status:"success"})))}),u(void 0)},[o,s,u,r,n]);return a.jsxs(F,{sx:{gap:2,alignItems:"center",w:"full"},children:[a.jsx(F,{as:Zt,isChecked:i,sx:{justifyContent:"start",p:2,borderRadius:"base",w:"full",alignItems:"center",bg:i?"accent.400":"base.100",color:i?"base.50":"base.800",_hover:{bg:i?"accent.500":"base.300",color:i?"base.50":"base.800"},_dark:{color:i?"base.50":"base.100",bg:i?"accent.600":"base.850",_hover:{color:i?"base.50":"base.100",bg:i?"accent.550":"base.700"}}},onClick:d,children:a.jsxs(F,{gap:4,alignItems:"center",children:[a.jsx(Xa,{minWidth:14,p:1,fontSize:"sm",sx:{bg:"base.350",color:"base.900",_dark:{bg:"base.500"}},children:UJ[s.base_model]}),a.jsx(_n,{label:s.description,hasArrow:!0,placement:"bottom",children:a.jsx(nt,{sx:{fontWeight:500},children:s.model_name})})]})}),a.jsx(ny,{title:n("modelManager.deleteModel"),acceptCallback:p,acceptButtonText:n("modelManager.delete"),triggerComponent:a.jsx(je,{icon:a.jsx($$,{}),"aria-label":n("modelManager.deleteConfig"),isDisabled:t,colorScheme:"error"}),children:a.jsxs(F,{rowGap:4,flexDirection:"column",children:[a.jsx("p",{style:{fontWeight:"bold"},children:n("modelManager.deleteMsg1")}),a.jsx("p",{children:n("modelManager.deleteMsg2")})]})})]})}const GJ=e=>{const{selectedModelId:t,setSelectedModelId:n}=e,{t:r}=fe(),[o,s]=f.useState(""),[i,u]=f.useState("all"),{filteredDiffusersModels:d}=ji(void 0,{selectFromResult:({data:g})=>({filteredDiffusersModels:BC(g,"diffusers",o)})}),{filteredCheckpointModels:p}=ji(void 0,{selectFromResult:({data:g})=>({filteredCheckpointModels:BC(g,"checkpoint",o)})}),h=f.useCallback(g=>{s(g.target.value)},[]);return a.jsx(F,{flexDirection:"column",rowGap:4,width:"50%",minWidth:"50%",children:a.jsxs(F,{flexDirection:"column",gap:4,paddingInlineEnd:4,children:[a.jsxs(Yn,{isAttached:!0,children:[a.jsx(Zt,{onClick:()=>u("all"),isChecked:i==="all",size:"sm",children:r("modelManager.allModels")}),a.jsx(Zt,{size:"sm",onClick:()=>u("diffusers"),isChecked:i==="diffusers",children:r("modelManager.diffusersModels")}),a.jsx(Zt,{size:"sm",onClick:()=>u("checkpoint"),isChecked:i==="checkpoint",children:r("modelManager.checkpointModels")})]}),a.jsx(Ai,{onChange:h,label:r("modelManager.search"),labelPos:"side"}),["all","diffusers"].includes(i)&&d.length>0&&a.jsx(FC,{children:a.jsxs(F,{sx:{gap:2,flexDir:"column"},children:[a.jsx(nt,{variant:"subtext",fontSize:"sm",children:"Diffusers"}),d.map(g=>a.jsx(LC,{model:g,isSelected:t===g.id,setSelectedModelId:n},g.id))]})}),["all","checkpoint"].includes(i)&&p.length>0&&a.jsx(FC,{children:a.jsxs(F,{sx:{gap:2,flexDir:"column"},children:[a.jsx(nt,{variant:"subtext",fontSize:"sm",children:"Checkpoint"}),p.map(g=>a.jsx(LC,{model:g,isSelected:t===g.id,setSelectedModelId:n},g.id))]})})]})})},BC=(e,t,n)=>{const r=[];return Qo(e==null?void 0:e.entities,o=>{if(!o)return;const s=o.model_name.toLowerCase().includes(n.toLowerCase()),i=o.model_format===t;s&&i&&r.push(o)}),r},FC=e=>a.jsx(F,{flexDirection:"column",maxHeight:window.innerHeight-280,overflow:"scroll",gap:4,borderRadius:4,p:4,sx:{bg:"base.200",_dark:{bg:"base.800"}},children:e.children});function qJ(){const[e,t]=f.useState(),{model:n}=ji(void 0,{selectFromResult:({data:r})=>({model:e?r==null?void 0:r.entities[e]:void 0})});return a.jsxs(F,{sx:{gap:8,w:"full",h:"full"},children:[a.jsx(GJ,{selectedModelId:e,setSelectedModelId:t}),a.jsx(KJ,{model:n})]})}const KJ=e=>{const{model:t}=e;return(t==null?void 0:t.model_format)==="checkpoint"?a.jsx(WJ,{model:t},t.id):(t==null?void 0:t.model_format)==="diffusers"?a.jsx(VJ,{model:t},t.id):a.jsx(F,{sx:{w:"full",h:"full",justifyContent:"center",alignItems:"center",maxH:96,userSelect:"none"},children:a.jsx(nt,{variant:"subtext",children:"No Model Selected"})})},HC=[{id:"modelManager",label:vr.t("modelManager.modelManager"),content:a.jsx(qJ,{})},{id:"importModels",label:vr.t("modelManager.importModels"),content:a.jsx(zJ,{})},{id:"mergeModels",label:vr.t("modelManager.mergeModels"),content:a.jsx(BJ,{})}],YJ=()=>a.jsxs(ih,{isLazy:!0,variant:"line",layerStyle:"first",sx:{w:"full",h:"full",p:4,gap:4,borderRadius:"base"},children:[a.jsx(lh,{children:HC.map(e=>a.jsx(dh,{sx:{borderTopRadius:"base"},children:e.label},e.id))}),a.jsx(uh,{sx:{w:"full",h:"full"},children:HC.map(e=>a.jsx(ch,{sx:{w:"full",h:"full"},children:e.content},e.id))})]}),QJ=f.memo(YJ);const XJ=e=>ve([t=>t.nodes],t=>{const n=t.invocationTemplates[e];if(n)return n},{memoizeOptions:{resultEqualityCheck:(t,n)=>t!==void 0&&n!==void 0&&t.type===n.type}}),JJ=(e,t)=>{const n={id:e,name:t.name,type:t.type};return t.inputRequirement!=="never"&&(t.type==="string"&&(n.value=t.default??""),t.type==="integer"&&(n.value=t.default??0),t.type==="float"&&(n.value=t.default??0),t.type==="boolean"&&(n.value=t.default??!1),t.type==="enum"&&(t.enumType==="number"&&(n.value=t.default??0),t.enumType==="string"&&(n.value=t.default??"")),t.type==="array"&&(n.value=t.default??1),t.type==="image"&&(n.value=void 0),t.type==="image_collection"&&(n.value=[]),t.type==="latents"&&(n.value=void 0),t.type==="conditioning"&&(n.value=void 0),t.type==="unet"&&(n.value=void 0),t.type==="clip"&&(n.value=void 0),t.type==="vae"&&(n.value=void 0),t.type==="control"&&(n.value=void 0),t.type==="model"&&(n.value=void 0),t.type==="vae_model"&&(n.value=void 0),t.type==="lora_model"&&(n.value=void 0),t.type==="controlnet_model"&&(n.value=void 0)),n},ZJ=ve([e=>e.nodes],e=>e.invocationTemplates),ry="node-drag-handle",WC={dragHandle:`.${ry}`},eZ=()=>{const e=L(ZJ),t=Qp();return f.useCallback(n=>{if(n==="progress_image"){const{x:h,y:g}=t.project({x:window.innerWidth/2.5,y:window.innerHeight/8});return{...WC,id:"progress_image",type:"progress_image",position:{x:h,y:g},data:{}}}const r=e[n];if(r===void 0){console.error(`Unable to find template ${n}.`);return}const o=Ga(),s=mx(r.inputs,(h,g,v)=>{const b=Ga(),S=JJ(b,g);return h[v]=S,h},{}),i=mx(r.outputs,(h,g,v)=>{const S={id:Ga(),name:v,type:g.type};return h[v]=S,h},{}),{x:u,y:d}=t.project({x:window.innerWidth/2.5,y:window.innerHeight/8});return{...WC,id:o,type:"invocation",position:{x:u,y:d},data:{id:o,type:n,inputs:s,outputs:i}}},[e,t])},tZ=e=>{const{nodeId:t,title:n,description:r}=e;return a.jsxs(F,{className:ry,sx:{borderTopRadius:"md",alignItems:"center",justifyContent:"space-between",px:2,py:1,bg:"base.100",_dark:{bg:"base.900"}},children:[a.jsx(_n,{label:t,children:a.jsx(aa,{size:"xs",sx:{fontWeight:600,color:"base.900",_dark:{color:"base.200"}},children:n})}),a.jsx(_n,{label:r,placement:"top",hasArrow:!0,shouldWrapChildren:!0,children:a.jsx(mo,{sx:{h:"min-content",color:"base.700",_dark:{color:"base.300"}},as:b$})})]})},eI=f.memo(tZ),tI=()=>{const e=Qp();return f.useCallback(({source:n,sourceHandle:r,target:o,targetHandle:s})=>(e.getEdges(),e.getNodes(),!0),[e])},nZ={position:"absolute",width:"1rem",height:"1rem",borderWidth:0},rZ={left:"-1rem"},oZ={right:"-0.5rem"},sZ=e=>{const{field:t,isValidConnection:n,handleType:r,styles:o}=e,{name:s,type:i}=t;return a.jsx(_n,{label:i,placement:r==="target"?"start":"end",hasArrow:!0,openDelay:X4,children:a.jsx(E7,{type:r,id:s,isValidConnection:n,position:r==="target"?gx.Left:gx.Right,style:{backgroundColor:J4[i].colorCssVar,...o,...nZ,...r==="target"?rZ:oZ}})})},nI=f.memo(sZ),aZ=e=>a.jsx(S$,{}),iZ=f.memo(aZ),lZ=e=>{const{nodeId:t,field:n}=e,r=te(),o=s=>{r(Yo({nodeId:t,fieldName:n.name,value:s.target.checked}))};return a.jsx(Hv,{onChange:o,isChecked:n.value})},cZ=f.memo(lZ),uZ=e=>null,dZ=f.memo(uZ);function zh(){return(zh=Object.assign||function(e){for(var t=1;t=0||(o[n]=e[n]);return o}function q0(e){var t=f.useRef(e),n=f.useRef(function(r){t.current&&t.current(r)});return t.current=e,n.current}var ql=function(e,t,n){return t===void 0&&(t=0),n===void 0&&(n=1),e>n?n:e0:C.buttons>0)&&o.current?s(VC(o.current,C,u.current)):w(!1)},S=function(){return w(!1)};function w(C){var _=d.current,k=K0(o.current),j=C?k.addEventListener:k.removeEventListener;j(_?"touchmove":"mousemove",b),j(_?"touchend":"mouseup",S)}return[function(C){var _=C.nativeEvent,k=o.current;if(k&&(UC(_),!function(E,I){return I&&!Zc(E)}(_,d.current)&&k)){if(Zc(_)){d.current=!0;var j=_.changedTouches||[];j.length&&(u.current=j[0].identifier)}k.focus(),s(VC(k,_,u.current)),w(!0)}},function(C){var _=C.which||C.keyCode;_<37||_>40||(C.preventDefault(),i({left:_===39?.05:_===37?-.05:0,top:_===40?.05:_===38?-.05:0}))},w]},[i,s]),h=p[0],g=p[1],v=p[2];return f.useEffect(function(){return v},[v]),N.createElement("div",zh({},r,{onTouchStart:h,onMouseDown:h,className:"react-colorful__interactive",ref:o,onKeyDown:g,tabIndex:0,role:"slider"}))}),Lh=function(e){return e.filter(Boolean).join(" ")},sy=function(e){var t=e.color,n=e.left,r=e.top,o=r===void 0?.5:r,s=Lh(["react-colorful__pointer",e.className]);return N.createElement("div",{className:s,style:{top:100*o+"%",left:100*n+"%"}},N.createElement("div",{className:"react-colorful__pointer-fill",style:{backgroundColor:t}}))},so=function(e,t,n){return t===void 0&&(t=0),n===void 0&&(n=Math.pow(10,t)),Math.round(n*e)/n},oI=function(e){var t=e.s,n=e.v,r=e.a,o=(200-t)*n/100;return{h:so(e.h),s:so(o>0&&o<200?t*n/100/(o<=100?o:200-o)*100:0),l:so(o/2),a:so(r,2)}},Y0=function(e){var t=oI(e);return"hsl("+t.h+", "+t.s+"%, "+t.l+"%)"},zg=function(e){var t=oI(e);return"hsla("+t.h+", "+t.s+"%, "+t.l+"%, "+t.a+")"},fZ=function(e){var t=e.h,n=e.s,r=e.v,o=e.a;t=t/360*6,n/=100,r/=100;var s=Math.floor(t),i=r*(1-n),u=r*(1-(t-s)*n),d=r*(1-(1-t+s)*n),p=s%6;return{r:so(255*[r,u,i,i,d,r][p]),g:so(255*[d,r,r,u,i,i][p]),b:so(255*[i,i,d,r,r,u][p]),a:so(o,2)}},pZ=function(e){var t=e.r,n=e.g,r=e.b,o=e.a,s=Math.max(t,n,r),i=s-Math.min(t,n,r),u=i?s===t?(n-r)/i:s===n?2+(r-t)/i:4+(t-n)/i:0;return{h:so(60*(u<0?u+6:u)),s:so(s?i/s*100:0),v:so(s/255*100),a:o}},hZ=N.memo(function(e){var t=e.hue,n=e.onChange,r=Lh(["react-colorful__hue",e.className]);return N.createElement("div",{className:r},N.createElement(oy,{onMove:function(o){n({h:360*o.left})},onKey:function(o){n({h:ql(t+360*o.left,0,360)})},"aria-label":"Hue","aria-valuenow":so(t),"aria-valuemax":"360","aria-valuemin":"0"},N.createElement(sy,{className:"react-colorful__hue-pointer",left:t/360,color:Y0({h:t,s:100,v:100,a:1})})))}),mZ=N.memo(function(e){var t=e.hsva,n=e.onChange,r={backgroundColor:Y0({h:t.h,s:100,v:100,a:1})};return N.createElement("div",{className:"react-colorful__saturation",style:r},N.createElement(oy,{onMove:function(o){n({s:100*o.left,v:100-100*o.top})},onKey:function(o){n({s:ql(t.s+100*o.left,0,100),v:ql(t.v-100*o.top,0,100)})},"aria-label":"Color","aria-valuetext":"Saturation "+so(t.s)+"%, Brightness "+so(t.v)+"%"},N.createElement(sy,{className:"react-colorful__saturation-pointer",top:1-t.v/100,left:t.s/100,color:Y0(t)})))}),sI=function(e,t){if(e===t)return!0;for(var n in e)if(e[n]!==t[n])return!1;return!0};function gZ(e,t,n){var r=q0(n),o=f.useState(function(){return e.toHsva(t)}),s=o[0],i=o[1],u=f.useRef({color:t,hsva:s});f.useEffect(function(){if(!e.equal(t,u.current.color)){var p=e.toHsva(t);u.current={hsva:p,color:t},i(p)}},[t,e]),f.useEffect(function(){var p;sI(s,u.current.hsva)||e.equal(p=e.fromHsva(s),u.current.color)||(u.current={hsva:s,color:p},r(p))},[s,e,r]);var d=f.useCallback(function(p){i(function(h){return Object.assign({},h,p)})},[]);return[s,d]}var vZ=typeof window<"u"?f.useLayoutEffect:f.useEffect,yZ=function(){return typeof __webpack_nonce__<"u"?__webpack_nonce__:void 0},GC=new Map,bZ=function(e){vZ(function(){var t=e.current?e.current.ownerDocument:document;if(t!==void 0&&!GC.has(t)){var n=t.createElement("style");n.innerHTML=`.react-colorful{position:relative;display:flex;flex-direction:column;width:200px;height:200px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:default}.react-colorful__saturation{position:relative;flex-grow:1;border-color:transparent;border-bottom:12px solid #000;border-radius:8px 8px 0 0;background-image:linear-gradient(0deg,#000,transparent),linear-gradient(90deg,#fff,hsla(0,0%,100%,0))}.react-colorful__alpha-gradient,.react-colorful__pointer-fill{content:"";position:absolute;left:0;top:0;right:0;bottom:0;pointer-events:none;border-radius:inherit}.react-colorful__alpha-gradient,.react-colorful__saturation{box-shadow:inset 0 0 0 1px rgba(0,0,0,.05)}.react-colorful__alpha,.react-colorful__hue{position:relative;height:24px}.react-colorful__hue{background:linear-gradient(90deg,red 0,#ff0 17%,#0f0 33%,#0ff 50%,#00f 67%,#f0f 83%,red)}.react-colorful__last-control{border-radius:0 0 8px 8px}.react-colorful__interactive{position:absolute;left:0;top:0;right:0;bottom:0;border-radius:inherit;outline:none;touch-action:none}.react-colorful__pointer{position:absolute;z-index:1;box-sizing:border-box;width:28px;height:28px;transform:translate(-50%,-50%);background-color:#fff;border:2px solid #fff;border-radius:50%;box-shadow:0 2px 4px rgba(0,0,0,.2)}.react-colorful__interactive:focus .react-colorful__pointer{transform:translate(-50%,-50%) scale(1.1)}.react-colorful__alpha,.react-colorful__alpha-pointer{background-color:#fff;background-image:url('data:image/svg+xml;charset=utf-8,')}.react-colorful__saturation-pointer{z-index:3}.react-colorful__hue-pointer{z-index:2}`,GC.set(t,n);var r=yZ();r&&n.setAttribute("nonce",r),t.head.appendChild(n)}},[])},xZ=function(e){var t=e.className,n=e.hsva,r=e.onChange,o={backgroundImage:"linear-gradient(90deg, "+zg(Object.assign({},n,{a:0}))+", "+zg(Object.assign({},n,{a:1}))+")"},s=Lh(["react-colorful__alpha",t]),i=so(100*n.a);return N.createElement("div",{className:s},N.createElement("div",{className:"react-colorful__alpha-gradient",style:o}),N.createElement(oy,{onMove:function(u){r({a:u.left})},onKey:function(u){r({a:ql(n.a+u.left)})},"aria-label":"Alpha","aria-valuetext":i+"%","aria-valuenow":i,"aria-valuemin":"0","aria-valuemax":"100"},N.createElement(sy,{className:"react-colorful__alpha-pointer",left:n.a,color:zg(n)})))},wZ=function(e){var t=e.className,n=e.colorModel,r=e.color,o=r===void 0?n.defaultColor:r,s=e.onChange,i=rI(e,["className","colorModel","color","onChange"]),u=f.useRef(null);bZ(u);var d=gZ(n,o,s),p=d[0],h=d[1],g=Lh(["react-colorful",t]);return N.createElement("div",zh({},i,{ref:u,className:g}),N.createElement(mZ,{hsva:p,onChange:h}),N.createElement(hZ,{hue:p.h,onChange:h}),N.createElement(xZ,{hsva:p,onChange:h,className:"react-colorful__last-control"}))},SZ={defaultColor:{r:0,g:0,b:0,a:1},toHsva:pZ,fromHsva:fZ,equal:sI},aI=function(e){return N.createElement(wZ,zh({},e,{colorModel:SZ}))};const CZ=e=>{const{nodeId:t,field:n}=e,r=te(),o=s=>{r(Yo({nodeId:t,fieldName:n.name,value:s}))};return a.jsx(aI,{className:"nodrag",color:n.value,onChange:o})},_Z=f.memo(CZ),kZ=e=>null,PZ=f.memo(kZ),jZ=e=>null,IZ=f.memo(jZ),EZ=e=>{const{nodeId:t,field:n}=e,r=n.value,o=te();fe();const{data:s}=fv(),i=f.useMemo(()=>(s==null?void 0:s.entities[`${r==null?void 0:r.base_model}/controlnet/${r==null?void 0:r.model_name}`])??null,[r==null?void 0:r.base_model,r==null?void 0:r.model_name,s==null?void 0:s.entities]),u=f.useMemo(()=>{if(!s)return[];const p=[];return Qo(s.entities,(h,g)=>{h&&p.push({value:g,label:h.model_name,group:Or[h.base_model]})}),p},[s]),d=f.useCallback(p=>{if(!p)return;const h=Nj(p);h&&o(Yo({nodeId:t,fieldName:n.name,value:h}))},[o,n.name,t]);return a.jsx(Do,{tooltip:i==null?void 0:i.description,label:(i==null?void 0:i.base_model)&&Or[i==null?void 0:i.base_model],value:(i==null?void 0:i.id)??null,placeholder:"Pick one",error:!i,data:u,onChange:d})},OZ=f.memo(EZ),MZ=e=>{const{nodeId:t,field:n,template:r}=e,o=te(),s=i=>{o(Yo({nodeId:t,fieldName:n.name,value:i.target.value}))};return a.jsx(Z6,{onChange:s,value:n.value,children:r.options.map(i=>a.jsx("option",{children:i},i))})},RZ=f.memo(MZ),DZ=e=>{var p;const{nodeId:t,field:n}=e,r=te();f.useCallback(({image_name:h})=>{r(Yo({nodeId:t,fieldName:n.name,value:O7([...n.value??[],{image_name:h}],"image_name")}))},[r,n.name,n.value,t]);const o={id:`node-${t}-${n.name}`,actionType:"SET_MULTI_NODES_IMAGE",context:{nodeId:t,fieldName:n.name}},{isOver:s,setNodeRef:i,active:u,over:d}=sv({id:`node_${t}`,data:o});return f.useCallback(()=>{r(Yo({nodeId:t,fieldName:n.name,value:void 0}))},[r,n.name,t]),a.jsxs(F,{ref:i,sx:{w:"full",h:"full",alignItems:"center",justifyContent:"center",position:"relative",minH:"10rem"},children:[(p=n.value)==null?void 0:p.map(({image_name:h})=>a.jsx(AZ,{imageName:h},h)),Cf(o,u)&&a.jsx(Kf,{isOver:s})]})},TZ=f.memo(DZ),AZ=e=>{const{currentData:t}=gs(e.imageName);return a.jsx(Ja,{imageDTO:t,isDropDisabled:!0,isDragDisabled:!0})},NZ=e=>{var v;const{nodeId:t,field:n}=e,r=te(),{currentData:o,isLoading:s,isError:i,isSuccess:u}=gs(((v=n.value)==null?void 0:v.image_name)??qo.skipToken),d=f.useCallback(()=>{r(Yo({nodeId:t,fieldName:n.name,value:void 0}))},[r,n.name,t]),p=f.useMemo(()=>{if(o)return{id:`node-${t}-${n.name}`,payloadType:"IMAGE_DTO",payload:{imageDTO:o}}},[n.name,o,t]),h=f.useMemo(()=>({id:`node-${t}-${n.name}`,actionType:"SET_NODES_IMAGE",context:{nodeId:t,fieldName:n.name}}),[n.name,t]),g=f.useMemo(()=>({type:"SET_NODES_IMAGE",nodeId:t,fieldName:n.name}),[t,n.name]);return a.jsx(F,{sx:{w:"full",h:"full",alignItems:"center",justifyContent:"center"},children:a.jsx(Ja,{imageDTO:o,droppableData:h,draggableData:p,onClickReset:d,postUploadAction:g})})},$Z=f.memo(NZ),zZ=e=>a.jsx(ZN,{}),qC=f.memo(zZ),LZ=e=>null,BZ=f.memo(LZ),FZ=Yp.child({module:"models"}),HZ=e=>{const[t,n,r]=e.split("/"),o=M7.safeParse({base_model:t,model_name:r});if(!o.success){FZ.error({loraModelId:e,errors:o.error.format()},"Failed to parse LoRA model id");return}return o.data},WZ=e=>{const{nodeId:t,field:n}=e,r=n.value,o=te(),{data:s}=N4(),i=f.useMemo(()=>{if(!s)return[];const p=[];return Qo(s.entities,(h,g)=>{h&&p.push({value:g,label:h.model_name,group:Or[h.base_model]})}),p.sort((h,g)=>h.disabled&&!g.disabled?1:-1)},[s]),u=f.useMemo(()=>(s==null?void 0:s.entities[`${r==null?void 0:r.base_model}/lora/${r==null?void 0:r.model_name}`])??null,[s==null?void 0:s.entities,r==null?void 0:r.base_model,r==null?void 0:r.model_name]),d=f.useCallback(p=>{if(!p)return;const h=HZ(p);h&&o(Yo({nodeId:t,fieldName:n.name,value:h}))},[o,n.name,t]);return(s==null?void 0:s.ids.length)===0?a.jsx(F,{sx:{justifyContent:"center",p:2},children:a.jsx(nt,{sx:{fontSize:"sm",color:"base.500",_dark:"base.700"},children:"No LoRAs Loaded"})}):a.jsx(Mr,{value:(u==null?void 0:u.id)??null,label:(u==null?void 0:u.base_model)&&Or[u==null?void 0:u.base_model],placeholder:i.length>0?"Select a LoRA":"No LoRAs available",data:i,nothingFound:"No matching LoRAs",itemComponent:Vi,disabled:i.length===0,filter:(p,h)=>{var g;return((g=h.label)==null?void 0:g.toLowerCase().includes(p.toLowerCase().trim()))||h.value.toLowerCase().includes(p.toLowerCase().trim())},onChange:d})},VZ=f.memo(WZ),UZ=e=>{var h,g;const{nodeId:t,field:n}=e,r=te(),{t:o}=fe(),{data:s,isLoading:i}=ji(),u=f.useMemo(()=>{if(!s)return[];const v=[];return Qo(s.entities,(b,S)=>{b&&v.push({value:S,label:b.model_name,group:Or[b.base_model]})}),v},[s]),d=f.useMemo(()=>{var v,b;return(s==null?void 0:s.entities[`${(v=n.value)==null?void 0:v.base_model}/main/${(b=n.value)==null?void 0:b.model_name}`])??null},[(h=n.value)==null?void 0:h.base_model,(g=n.value)==null?void 0:g.model_name,s==null?void 0:s.entities]),p=f.useCallback(v=>{if(!v)return;const b=Wj(v);b&&r(Yo({nodeId:t,fieldName:n.name,value:b}))},[r,n.name,t]);return i?a.jsx(Mr,{label:o("modelManager.model"),placeholder:"Loading...",disabled:!0,data:[]}):a.jsx(Mr,{tooltip:d==null?void 0:d.description,label:(d==null?void 0:d.base_model)&&Or[d==null?void 0:d.base_model],value:d==null?void 0:d.id,placeholder:u.length>0?"Select a model":"No models available",data:u,error:u.length===0,disabled:u.length===0,onChange:p})},GZ=f.memo(UZ),qZ=e=>{const{nodeId:t,field:n}=e,r=te(),[o,s]=f.useState(String(n.value)),i=u=>{s(u),u.match(Bp)||r(Yo({nodeId:t,fieldName:n.name,value:e.template.type==="integer"?Math.floor(Number(u)):Number(u)}))};return f.useEffect(()=>{!o.match(Bp)&&n.value!==Number(o)&&s(String(n.value))},[n.value,o]),a.jsxs(z4,{onChange:i,value:o,step:e.template.type==="integer"?1:.1,precision:e.template.type==="integer"?0:3,children:[a.jsx(L4,{}),a.jsxs(B4,{children:[a.jsx(F4,{}),a.jsx(H4,{})]})]})},KZ=f.memo(qZ),YZ=e=>{const{nodeId:t,field:n}=e,r=te(),o=s=>{r(Yo({nodeId:t,fieldName:n.name,value:s.target.value}))};return a.jsx(ku,{onChange:o,value:n.value})},QZ=f.memo(YZ),XZ=e=>null,JZ=f.memo(XZ),ZZ=e=>null,eee=f.memo(ZZ),tee=e=>{const{nodeId:t,field:n}=e,r=n.value,o=te();fe();const{data:s}=W4(),i=f.useMemo(()=>{if(!s)return[];const p=[{value:"default",label:"Default",group:"Default"}];return Qo(s.entities,(h,g)=>{h&&p.push({value:g,label:h.model_name,group:Or[h.base_model]})}),p.sort((h,g)=>h.disabled&&!g.disabled?1:-1)},[s]),u=f.useMemo(()=>(s==null?void 0:s.entities[`${r==null?void 0:r.base_model}/vae/${r==null?void 0:r.model_name}`])??null,[s==null?void 0:s.entities,r]),d=f.useCallback(p=>{if(!p)return;const h=Vj(p);h&&o(Yo({nodeId:t,fieldName:n.name,value:h}))},[o,n.name,t]);return a.jsx(Mr,{itemComponent:Vi,tooltip:u==null?void 0:u.description,label:(u==null?void 0:u.base_model)&&Or[u==null?void 0:u.base_model],value:(u==null?void 0:u.id)??"default",placeholder:"Default",data:i,onChange:d,disabled:i.length===0,clearable:!0})},nee=f.memo(tee),ree=e=>{const{nodeId:t,field:n,template:r}=e,{type:o}=n;return o==="string"&&r.type==="string"?a.jsx(QZ,{nodeId:t,field:n,template:r}):o==="boolean"&&r.type==="boolean"?a.jsx(cZ,{nodeId:t,field:n,template:r}):o==="integer"&&r.type==="integer"||o==="float"&&r.type==="float"?a.jsx(KZ,{nodeId:t,field:n,template:r}):o==="enum"&&r.type==="enum"?a.jsx(RZ,{nodeId:t,field:n,template:r}):o==="image"&&r.type==="image"?a.jsx($Z,{nodeId:t,field:n,template:r}):o==="latents"&&r.type==="latents"?a.jsx(BZ,{nodeId:t,field:n,template:r}):o==="conditioning"&&r.type==="conditioning"?a.jsx(PZ,{nodeId:t,field:n,template:r}):o==="unet"&&r.type==="unet"?a.jsx(JZ,{nodeId:t,field:n,template:r}):o==="clip"&&r.type==="clip"?a.jsx(dZ,{nodeId:t,field:n,template:r}):o==="vae"&&r.type==="vae"?a.jsx(eee,{nodeId:t,field:n,template:r}):o==="control"&&r.type==="control"?a.jsx(IZ,{nodeId:t,field:n,template:r}):o==="model"&&r.type==="model"?a.jsx(GZ,{nodeId:t,field:n,template:r}):o==="vae_model"&&r.type==="vae_model"?a.jsx(nee,{nodeId:t,field:n,template:r}):o==="lora_model"&&r.type==="lora_model"?a.jsx(VZ,{nodeId:t,field:n,template:r}):o==="controlnet_model"&&r.type==="controlnet_model"?a.jsx(OZ,{nodeId:t,field:n,template:r}):o==="array"&&r.type==="array"?a.jsx(iZ,{nodeId:t,field:n,template:r}):o==="item"&&r.type==="item"?a.jsx(qC,{nodeId:t,field:n,template:r}):o==="color"&&r.type==="color"?a.jsx(_Z,{nodeId:t,field:n,template:r}):o==="item"&&r.type==="item"?a.jsx(qC,{nodeId:t,field:n,template:r}):o==="image_collection"&&r.type==="image_collection"?a.jsx(TZ,{nodeId:t,field:n,template:r}):a.jsxs(ze,{p:2,children:["Unknown field type: ",o]})},oee=f.memo(ree);function see(e){const{nodeId:t,input:n,template:r,connected:o}=e,s=tI();return a.jsx(ze,{className:"nopan",position:"relative",borderColor:r?!o&&["always","connectionOnly"].includes(String(r==null?void 0:r.inputRequirement))&&n.value===void 0?"warning.400":void 0:"error.400",children:a.jsx(Ss,{isDisabled:r?o:!0,pl:2,children:r?a.jsxs(a.Fragment,{children:[a.jsxs(Cl,{justifyContent:"space-between",alignItems:"center",children:[a.jsx(Cl,{children:a.jsx(_n,{label:r==null?void 0:r.description,placement:"top",hasArrow:!0,shouldWrapChildren:!0,openDelay:X4,children:a.jsx(vs,{children:r==null?void 0:r.title})})}),a.jsx(oee,{nodeId:t,field:n,template:r})]}),!["never","directOnly"].includes((r==null?void 0:r.inputRequirement)??"")&&a.jsx(nI,{nodeId:t,field:r,isValidConnection:s,handleType:"target"})]}):a.jsx(Cl,{justifyContent:"space-between",alignItems:"center",children:a.jsxs(vs,{children:["Unknown input: ",n.name]})})})})}const aee=e=>{const{nodeId:t,template:n,inputs:r}=e,o=L(i=>i.nodes.edges);return f.useCallback(()=>{const i=[],u=Cs(r);return u.forEach((d,p)=>{const h=n.inputs[d.name],g=!!o.filter(v=>v.target===t&&v.targetHandle===d.name).length;p{const{nodeId:t,template:n,outputs:r}=e,o=L(i=>i.nodes.edges);return f.useCallback(()=>{const i=[];return Cs(r).forEach(d=>{const p=n.outputs[d.name],h=!!o.filter(g=>g.source===t&&g.sourceHandle===d.name).length;i.push(a.jsx(lee,{nodeId:t,output:d,template:p,connected:h},d.id))}),a.jsx(F,{flexDir:"column",children:i})},[o,t,r,n.outputs])()},uee=f.memo(cee),dee=e=>{const{...t}=e;return a.jsx(CA,{style:{position:"absolute",border:"none",background:"transparent",width:15,height:15,bottom:0,right:0},minWidth:Z4,...t})},Q0=f.memo(dee),X0=e=>{const[t,n]=Yl("shadows",["nodeSelectedOutline","dark-lg"]),r=L(o=>o.hotkeys.shift);return a.jsx(ze,{className:r?ry:"nopan",sx:{position:"relative",borderRadius:"md",minWidth:Z4,shadow:e.selected?`${t}, ${n}`:`${n}`},children:e.children})},iI=f.memo(e=>{const{id:t,data:n,selected:r}=e,{type:o,inputs:s,outputs:i}=n,u=f.useMemo(()=>XJ(o),[o]),d=L(u);return d?a.jsxs(X0,{selected:r,children:[a.jsx(eI,{nodeId:t,title:d.title,description:d.description}),a.jsxs(F,{className:"nopan",sx:{cursor:"auto",flexDirection:"column",borderBottomRadius:"md",py:2,bg:"base.150",_dark:{bg:"base.800"}},children:[a.jsx(uee,{nodeId:t,outputs:i,template:d}),a.jsx(iee,{nodeId:t,inputs:s,template:d})]}),a.jsx(Q0,{})]}):a.jsx(X0,{selected:r,children:a.jsxs(F,{className:"nopan",sx:{alignItems:"center",justifyContent:"center",cursor:"auto"},children:[a.jsx(mo,{as:c$,sx:{boxSize:32,color:"base.600",_dark:{color:"base.400"}}}),a.jsx(Q0,{})]})})});iI.displayName="InvocationComponent";const fee=e=>{const t=L(r=>r.system.progressImage),{selected:n}=e;return a.jsxs(X0,{selected:n,children:[a.jsx(eI,{title:"Progress Image",description:"Displays the progress image in the Node Editor"}),a.jsx(F,{className:"nopan",sx:{flexDirection:"column",borderBottomRadius:"md",p:2,bg:"base.200",_dark:{bg:"base.800"}},children:t?a.jsx(bu,{src:t.dataURL,sx:{w:"full",h:"full",objectFit:"contain"}}):a.jsx(F,{sx:{w:"full",h:"full",minW:32,minH:32,alignItems:"center",justifyContent:"center"},children:a.jsx(Li,{})})}),a.jsx(Q0,{maxHeight:(t==null?void 0:t.height)??512,maxWidth:(t==null?void 0:t.width)??512})]})},pee=f.memo(fee),hee=()=>{const{t:e}=fe(),{zoomIn:t,zoomOut:n,fitView:r}=Qp(),o=te(),s=L(S=>S.nodes.shouldShowGraphOverlay),i=L(S=>S.nodes.shouldShowFieldTypeLegend),u=L(S=>S.nodes.shouldShowMinimapPanel),d=f.useCallback(()=>{t()},[t]),p=f.useCallback(()=>{n()},[n]),h=f.useCallback(()=>{r()},[r]),g=f.useCallback(()=>{o(R7(!s))},[s,o]),v=f.useCallback(()=>{o(D7(!i))},[i,o]),b=f.useCallback(()=>{o(T7(!u))},[u,o]);return a.jsxs(Yn,{isAttached:!0,orientation:"vertical",children:[a.jsx(_n,{label:e("nodes.zoomInNodes"),children:a.jsx(je,{onClick:d,icon:a.jsx(Tu,{})})}),a.jsx(_n,{label:e("nodes.zoomOutNodes"),children:a.jsx(je,{onClick:p,icon:a.jsx(k$,{})})}),a.jsx(_n,{label:e("nodes.fitViewportNodes"),children:a.jsx(je,{onClick:h,icon:a.jsx(f$,{})})}),a.jsx(_n,{label:e(s?"nodes.hideGraphNodes":"nodes.showGraphNodes"),children:a.jsx(je,{isChecked:s,onClick:g,icon:a.jsx(Uv,{})})}),a.jsx(_n,{label:e(i?"nodes.hideLegendNodes":"nodes.showLegendNodes"),children:a.jsx(je,{isChecked:i,onClick:v,icon:a.jsx(x$,{})})}),a.jsx(_n,{label:e(u?"nodes.hideMinimapnodes":"nodes.showMinimapnodes"),children:a.jsx(je,{isChecked:u,onClick:b,icon:a.jsx(C$,{})})})]})},mee=f.memo(hee),gee=()=>a.jsx(yu,{position:"bottom-left",children:a.jsx(mee,{})}),vee=f.memo(gee),yee=()=>{const e=ff({background:"var(--invokeai-colors-base-200)"},{background:"var(--invokeai-colors-base-500)"}),t=L(o=>o.nodes.shouldShowMinimapPanel),n=ff("var(--invokeai-colors-accent-300)","var(--invokeai-colors-accent-700)"),r=ff("var(--invokeai-colors-blackAlpha-300)","var(--invokeai-colors-blackAlpha-600)");return a.jsx(a.Fragment,{children:t&&a.jsx(pA,{nodeStrokeWidth:3,pannable:!0,zoomable:!0,nodeBorderRadius:30,style:e,nodeColor:n,maskColor:r})})},bee=f.memo(yee),xee=()=>{const{t:e}=fe(),t=te(),{fitView:n}=Qp(),r=f.useRef(null),o=f.useCallback(s=>{var u;if(!s)return;const i=new FileReader;i.onload=async()=>{const d=i.result,p=await JSON.parse(String(d));p||t(rr(or({title:e("toast.nodesLoadedFailed"),status:"error"}))),p&&(t(A7(p.nodes)),t(N7(p.edges)),n(),t(rr(or({title:e("toast.nodesLoaded"),status:"success"})))),i.abort()},i.readAsText(s),(u=r.current)==null||u.call(r)},[n,t,e]);return a.jsx(XP,{resetRef:r,accept:"application/json",onChange:o,children:s=>a.jsx(je,{icon:a.jsx(Au,{}),tooltip:e("nodes.loadNodes"),"aria-label":e("nodes.loadNodes"),...s})})},wee=f.memo(xee);function See(e){const{iconButton:t=!1,...n}=e,r=te(),o=L(ur),s=Q1(),i=f.useCallback(()=>{r(hv("nodes"))},[r]),{t:u}=fe();return Ke(["ctrl+enter","meta+enter"],i,{enabled:()=>s,preventDefault:!0,enableOnFormTags:["input","textarea","select"]},[s,o]),a.jsx(ze,{style:{flexGrow:4},position:"relative",children:a.jsxs(ze,{style:{position:"relative"},children:[!s&&a.jsx(ze,{borderRadius:"base",style:{position:"absolute",bottom:"0",left:"0",right:"0",height:"100%",overflow:"clip"},children:a.jsx(Hj,{})}),t?a.jsx(je,{"aria-label":u("parameters.invoke"),type:"submit",icon:a.jsx(L5,{}),isDisabled:!s,onClick:i,flexGrow:1,w:"100%",tooltip:u("parameters.invoke"),tooltipProps:{placement:"bottom"},colorScheme:"accent",id:"invoke-button",_disabled:{background:"none",_hover:{background:"none"}},...n}):a.jsx(Zt,{"aria-label":u("parameters.invoke"),type:"submit",isDisabled:!s,onClick:i,flexGrow:1,w:"100%",colorScheme:"accent",id:"invoke-button",fontWeight:700,_disabled:{background:"none",_hover:{background:"none"}},...n,children:"Invoke"})]})})}function Cee(){const{t:e}=fe(),t=te(),n=f.useCallback(()=>{t($7())},[t]);return a.jsx(je,{icon:a.jsx(D$,{}),tooltip:e("nodes.reloadSchema"),"aria-label":e("nodes.reloadSchema"),onClick:n})}const _ee=()=>{const{t:e}=fe(),t=L(o=>o.nodes.editorInstance),n=L(o=>o.nodes.nodes),r=f.useCallback(()=>{if(t){const o=t.toObject();o.edges=Cs(o.edges,u=>z7(u,["style"]));const s=new Blob([JSON.stringify(o)]),i=document.createElement("a");i.href=URL.createObjectURL(s),i.download="MyNodes.json",document.body.appendChild(i),i.click(),i.remove()}},[t]);return a.jsx(je,{icon:a.jsx(ph,{}),fontSize:18,tooltip:e("nodes.saveNodes"),"aria-label":e("nodes.saveNodes"),onClick:r,isDisabled:n.length===0})},kee=f.memo(_ee),Pee=()=>{const{t:e}=fe(),t=te(),{isOpen:n,onOpen:r,onClose:o}=Ws(),s=f.useRef(null),i=L(d=>d.nodes.nodes),u=f.useCallback(()=>{t(L7()),t(rr(or({title:e("toast.nodesCleared"),status:"success"}))),o()},[t,e,o]);return a.jsxs(a.Fragment,{children:[a.jsx(je,{icon:a.jsx(yo,{}),tooltip:e("nodes.clearNodes"),"aria-label":e("nodes.clearNodes"),onClick:r,isDisabled:i.length===0}),a.jsxs(Ou,{isOpen:n,onClose:o,leastDestructiveRef:s,isCentered:!0,children:[a.jsx(va,{}),a.jsxs(Mu,{children:[a.jsx(ga,{fontSize:"lg",fontWeight:"bold",children:e("nodes.clearNodes")}),a.jsx(ya,{children:a.jsx(nt,{children:e("common.clearNodes")})}),a.jsxs(ma,{children:[a.jsx(Sf,{ref:s,onClick:o,children:e("common.cancel")}),a.jsx(Sf,{colorScheme:"red",ml:3,onClick:u,children:e("common.accept")})]})]})]})]})},jee=f.memo(Pee),Iee=()=>a.jsx(yu,{position:"top-center",children:a.jsxs(Cl,{children:[a.jsx(See,{}),a.jsx(Dh,{}),a.jsx(Cee,{}),a.jsx(kee,{}),a.jsx(wee,{}),a.jsx(jee,{})]})}),Eee=f.memo(Iee),Oee=ve(B7,e=>{const t=Cs(e.invocationTemplates,n=>({label:n.title,value:n.type,description:n.description}));return t.push({label:"Progress Image",value:"progress_image",description:"Displays the progress image in the Node Editor"}),{data:t}},it),Mee=()=>{const e=te(),{data:t}=L(Oee),n=eZ(),r=Ql(),o=f.useCallback(i=>{const u=n(i);if(!u){r({status:"error",title:`Unknown Invocation type ${i}`});return}e(F7(u))},[e,n,r]),s=f.useCallback(i=>{i&&o(i)},[o]);return a.jsx(F,{sx:{gap:2,alignItems:"center"},children:a.jsx(Mr,{selectOnBlur:!1,placeholder:"Add Node",value:null,data:t,maxDropdownHeight:400,nothingFound:"No matching nodes",itemComponent:lI,filter:(i,u)=>u.label.toLowerCase().includes(i.toLowerCase().trim())||u.value.toLowerCase().includes(i.toLowerCase().trim())||u.description.toLowerCase().includes(i.toLowerCase().trim()),onChange:s,sx:{width:"18rem"}})})},lI=f.forwardRef(({label:e,description:t,...n},r)=>a.jsx("div",{ref:r,...n,children:a.jsxs("div",{children:[a.jsx(nt,{fontWeight:600,children:e}),a.jsx(nt,{size:"xs",sx:{color:"base.600",_dark:{color:"base.500"}},children:t})]})}));lI.displayName="SelectItem";const Ree=()=>a.jsx(yu,{position:"top-left",children:a.jsx(Mee,{})}),Dee=f.memo(Ree),Tee=()=>a.jsx(F,{sx:{gap:2,flexDir:"column"},children:Cs(J4,({title:e,description:t,color:n},r)=>a.jsx(_n,{label:t,children:a.jsx(Xa,{colorScheme:n,sx:{userSelect:"none"},textAlign:"center",children:e})},r))}),Aee=f.memo(Tee),Nee=()=>{const e=L(n=>n),t=H7(e);return a.jsx(ze,{as:"pre",sx:{fontFamily:"monospace",position:"absolute",top:2,right:2,opacity:.7,p:2,maxHeight:500,maxWidth:500,overflowY:"scroll",borderRadius:"base",bg:"base.200",_dark:{bg:"base.800"}},children:JSON.stringify(t,null,2)})},$ee=f.memo(Nee),zee=()=>{const e=L(n=>n.nodes.shouldShowGraphOverlay),t=L(n=>n.nodes.shouldShowFieldTypeLegend);return a.jsxs(yu,{position:"top-right",children:[t&&a.jsx(Aee,{}),e&&a.jsx($ee,{})]})},Lee=f.memo(zee),Bee={invocation:iI,progress_image:pee},Fee=()=>{const e=te(),t=L(p=>p.nodes.nodes),n=L(p=>p.nodes.edges),r=f.useCallback(p=>{e(W7(p))},[e]),o=f.useCallback(p=>{e(V7(p))},[e]),s=f.useCallback((p,h)=>{e(U7(h))},[e]),i=f.useCallback(p=>{e(G7(p))},[e]),u=f.useCallback(()=>{e(q7())},[e]),d=f.useCallback(p=>{e(K7(p)),p&&p.fitView()},[e]);return a.jsxs(Y7,{nodeTypes:Bee,nodes:t,edges:n,onNodesChange:r,onEdgesChange:o,onConnectStart:s,onConnect:i,onConnectEnd:u,onInit:d,defaultEdgeOptions:{style:{strokeWidth:2}},children:[a.jsx(Dee,{}),a.jsx(Eee,{}),a.jsx(Lee,{}),a.jsx(vee,{}),a.jsx(bA,{}),a.jsx(bee,{})]})},Hee=()=>a.jsx(ze,{layerStyle:"first",sx:{position:"relative",width:"full",height:"full",borderRadius:"base"},children:a.jsx(Q7,{children:a.jsx(Fee,{})})}),Wee=f.memo(Hee),Vee=()=>a.jsx(Wee,{}),Uee=f.memo(Vee),Gee=ve(Rt,({ui:e,generation:t})=>{const{shouldUseSliders:n}=e,{shouldRandomizeSeed:r}=t;return{shouldUseSliders:n,activeLabel:r?void 0:"Manual Seed"}},it),qee=()=>{const{shouldUseSliders:e,activeLabel:t}=L(Gee);return a.jsx(To,{label:"General",activeLabel:t,defaultIsOpen:!0,children:a.jsx(F,{sx:{flexDirection:"column",gap:3},children:e?a.jsxs(a.Fragment,{children:[a.jsx(Wl,{}),a.jsx(Ul,{}),a.jsx(Hl,{}),a.jsx(Vl,{}),a.jsx(ze,{pt:2,children:a.jsx(Gl,{})}),a.jsx(Fp,{})]}):a.jsxs(a.Fragment,{children:[a.jsxs(F,{gap:3,children:[a.jsx(Wl,{}),a.jsx(Ul,{}),a.jsx(Hl,{})]}),a.jsx(Vl,{}),a.jsx(ze,{pt:2,children:a.jsx(Gl,{})}),a.jsx(Fp,{})]})})})},Kee=f.memo(qee),Yee=()=>a.jsxs(a.Fragment,{children:[a.jsx(X1,{}),a.jsx(K1,{}),a.jsx(ty,{}),a.jsx(Kee,{}),a.jsx(G1,{}),a.jsx(V1,{}),a.jsx(W1,{}),a.jsx(Z1,{}),a.jsx(Bj,{}),a.jsx(J1,{}),a.jsx(Fj,{}),a.jsx(U1,{})]}),cI=f.memo(Yee),Qee=()=>a.jsxs(F,{sx:{gap:4,w:"full",h:"full"},children:[a.jsx(H1,{children:a.jsx(cI,{})}),a.jsx(Aj,{})]}),Xee=f.memo(Qee);var J0={exports:{}};(function(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.Konva=void 0;var n=vx;Object.defineProperty(t,"Konva",{enumerable:!0,get:function(){return n.Konva}});const r=vx;e.exports=r.Konva})(J0,J0.exports);var Jee=J0.exports;const pu=vu(Jee);var uI={exports:{}};/** + * @license React + * react-reconciler.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */var Zee=function(t){var n={},r=f,o=pf,s=Object.assign;function i(l){for(var c="https://reactjs.org/docs/error-decoder.html?invariant="+l,m=1;mY||x[D]!==P[Y]){var se=` +`+x[D].replace(" at new "," at ");return l.displayName&&se.includes("")&&(se=se.replace("",l.displayName)),se}while(1<=D&&0<=Y);break}}}finally{Lt=!1,Error.prepareStackTrace=m}return(l=l?l.displayName||l.name:"")?Et(l):""}var Gt=Object.prototype.hasOwnProperty,$t=[],Me=-1;function ut(l){return{current:l}}function Ct(l){0>Me||(l.current=$t[Me],$t[Me]=null,Me--)}function Tt(l,c){Me++,$t[Me]=l.current,l.current=c}var xn={},zt=ut(xn),tn=ut(!1),Xt=xn;function Sr(l,c){var m=l.type.contextTypes;if(!m)return xn;var y=l.stateNode;if(y&&y.__reactInternalMemoizedUnmaskedChildContext===c)return y.__reactInternalMemoizedMaskedChildContext;var x={},P;for(P in m)x[P]=c[P];return y&&(l=l.stateNode,l.__reactInternalMemoizedUnmaskedChildContext=c,l.__reactInternalMemoizedMaskedChildContext=x),x}function Vn(l){return l=l.childContextTypes,l!=null}function vt(){Ct(tn),Ct(zt)}function wn(l,c,m){if(zt.current!==xn)throw Error(i(168));Tt(zt,c),Tt(tn,m)}function kn(l,c,m){var y=l.stateNode;if(c=c.childContextTypes,typeof y.getChildContext!="function")return m;y=y.getChildContext();for(var x in y)if(!(x in c))throw Error(i(108,T(l)||"Unknown",x));return s({},m,y)}function Un(l){return l=(l=l.stateNode)&&l.__reactInternalMemoizedMergedChildContext||xn,Xt=zt.current,Tt(zt,l),Tt(tn,tn.current),!0}function ar(l,c,m){var y=l.stateNode;if(!y)throw Error(i(169));m?(l=kn(l,c,Xt),y.__reactInternalMemoizedMergedChildContext=l,Ct(tn),Ct(zt),Tt(zt,l)):Ct(tn),Tt(tn,m)}var On=Math.clz32?Math.clz32:pn,Mn=Math.log,nn=Math.LN2;function pn(l){return l>>>=0,l===0?32:31-(Mn(l)/nn|0)|0}var Sn=64,cn=4194304;function un(l){switch(l&-l){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return l&4194240;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return l&130023424;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 1073741824;default:return l}}function Be(l,c){var m=l.pendingLanes;if(m===0)return 0;var y=0,x=l.suspendedLanes,P=l.pingedLanes,D=m&268435455;if(D!==0){var Y=D&~x;Y!==0?y=un(Y):(P&=D,P!==0&&(y=un(P)))}else D=m&~x,D!==0?y=un(D):P!==0&&(y=un(P));if(y===0)return 0;if(c!==0&&c!==y&&!(c&x)&&(x=y&-y,P=c&-c,x>=P||x===16&&(P&4194240)!==0))return c;if(y&4&&(y|=m&16),c=l.entangledLanes,c!==0)for(l=l.entanglements,c&=y;0m;m++)c.push(l);return c}function lt(l,c,m){l.pendingLanes|=c,c!==536870912&&(l.suspendedLanes=0,l.pingedLanes=0),l=l.eventTimes,c=31-On(c),l[c]=m}function qe(l,c){var m=l.pendingLanes&~c;l.pendingLanes=c,l.suspendedLanes=0,l.pingedLanes=0,l.expiredLanes&=c,l.mutableReadLanes&=c,l.entangledLanes&=c,c=l.entanglements;var y=l.eventTimes;for(l=l.expirationTimes;0>=D,x-=D,_o=1<<32-On(c)+x|m<hn?(Nr=Ut,Ut=null):Nr=Ut.sibling;var mn=Je(oe,Ut,de[hn],Ze);if(mn===null){Ut===null&&(Ut=Nr);break}l&&Ut&&mn.alternate===null&&c(oe,Ut),X=P(mn,X,hn),Yt===null?jt=mn:Yt.sibling=mn,Yt=mn,Ut=Nr}if(hn===de.length)return m(oe,Ut),Gn&&ii(oe,hn),jt;if(Ut===null){for(;hnhn?(Nr=Ut,Ut=null):Nr=Ut.sibling;var Ta=Je(oe,Ut,mn.value,Ze);if(Ta===null){Ut===null&&(Ut=Nr);break}l&&Ut&&Ta.alternate===null&&c(oe,Ut),X=P(Ta,X,hn),Yt===null?jt=Ta:Yt.sibling=Ta,Yt=Ta,Ut=Nr}if(mn.done)return m(oe,Ut),Gn&&ii(oe,hn),jt;if(Ut===null){for(;!mn.done;hn++,mn=de.next())mn=Vt(oe,mn.value,Ze),mn!==null&&(X=P(mn,X,hn),Yt===null?jt=mn:Yt.sibling=mn,Yt=mn);return Gn&&ii(oe,hn),jt}for(Ut=y(oe,Ut);!mn.done;hn++,mn=de.next())mn=Hn(Ut,oe,hn,mn.value,Ze),mn!==null&&(l&&mn.alternate!==null&&Ut.delete(mn.key===null?hn:mn.key),X=P(mn,X,hn),Yt===null?jt=mn:Yt.sibling=mn,Yt=mn);return l&&Ut.forEach(function(sE){return c(oe,sE)}),Gn&&ii(oe,hn),jt}function ra(oe,X,de,Ze){if(typeof de=="object"&&de!==null&&de.type===h&&de.key===null&&(de=de.props.children),typeof de=="object"&&de!==null){switch(de.$$typeof){case d:e:{for(var jt=de.key,Yt=X;Yt!==null;){if(Yt.key===jt){if(jt=de.type,jt===h){if(Yt.tag===7){m(oe,Yt.sibling),X=x(Yt,de.props.children),X.return=oe,oe=X;break e}}else if(Yt.elementType===jt||typeof jt=="object"&&jt!==null&&jt.$$typeof===j&&Cy(jt)===Yt.type){m(oe,Yt.sibling),X=x(Yt,de.props),X.ref=uc(oe,Yt,de),X.return=oe,oe=X;break e}m(oe,Yt);break}else c(oe,Yt);Yt=Yt.sibling}de.type===h?(X=hi(de.props.children,oe.mode,Ze,de.key),X.return=oe,oe=X):(Ze=wd(de.type,de.key,de.props,null,oe.mode,Ze),Ze.ref=uc(oe,X,de),Ze.return=oe,oe=Ze)}return D(oe);case p:e:{for(Yt=de.key;X!==null;){if(X.key===Yt)if(X.tag===4&&X.stateNode.containerInfo===de.containerInfo&&X.stateNode.implementation===de.implementation){m(oe,X.sibling),X=x(X,de.children||[]),X.return=oe,oe=X;break e}else{m(oe,X);break}else c(oe,X);X=X.sibling}X=Fm(de,oe.mode,Ze),X.return=oe,oe=X}return D(oe);case j:return Yt=de._init,ra(oe,X,Yt(de._payload),Ze)}if(G(de))return Dn(oe,X,de,Ze);if(O(de))return po(oe,X,de,Ze);Yu(oe,de)}return typeof de=="string"&&de!==""||typeof de=="number"?(de=""+de,X!==null&&X.tag===6?(m(oe,X.sibling),X=x(X,de),X.return=oe,oe=X):(m(oe,X),X=Bm(de,oe.mode,Ze),X.return=oe,oe=X),D(oe)):m(oe,X)}return ra}var Yi=_y(!0),ky=_y(!1),dc={},zo=ut(dc),fc=ut(dc),Qi=ut(dc);function Os(l){if(l===dc)throw Error(i(174));return l}function em(l,c){Tt(Qi,c),Tt(fc,l),Tt(zo,dc),l=R(c),Ct(zo),Tt(zo,l)}function Xi(){Ct(zo),Ct(fc),Ct(Qi)}function Py(l){var c=Os(Qi.current),m=Os(zo.current);c=U(m,l.type,c),m!==c&&(Tt(fc,l),Tt(zo,c))}function tm(l){fc.current===l&&(Ct(zo),Ct(fc))}var Jn=ut(0);function Qu(l){for(var c=l;c!==null;){if(c.tag===13){var m=c.memoizedState;if(m!==null&&(m=m.dehydrated,m===null||Dr(m)||Ps(m)))return c}else if(c.tag===19&&c.memoizedProps.revealOrder!==void 0){if(c.flags&128)return c}else if(c.child!==null){c.child.return=c,c=c.child;continue}if(c===l)break;for(;c.sibling===null;){if(c.return===null||c.return===l)return null;c=c.return}c.sibling.return=c.return,c=c.sibling}return null}var nm=[];function rm(){for(var l=0;lm?m:4,l(!0);var y=om.transition;om.transition={};try{l(!1),c()}finally{Se=m,om.transition=y}}function Vy(){return Lo().memoizedState}function RI(l,c,m){var y=Ma(l);if(m={lane:y,action:m,hasEagerState:!1,eagerState:null,next:null},Uy(l))Gy(c,m);else if(m=my(l,c,m,y),m!==null){var x=Yr();Bo(m,l,y,x),qy(m,c,y)}}function DI(l,c,m){var y=Ma(l),x={lane:y,action:m,hasEagerState:!1,eagerState:null,next:null};if(Uy(l))Gy(c,x);else{var P=l.alternate;if(l.lanes===0&&(P===null||P.lanes===0)&&(P=c.lastRenderedReducer,P!==null))try{var D=c.lastRenderedState,Y=P(D,m);if(x.hasEagerState=!0,x.eagerState=Y,rn(Y,D)){var se=c.interleaved;se===null?(x.next=x,Qh(c)):(x.next=se.next,se.next=x),c.interleaved=x;return}}catch{}finally{}m=my(l,c,x,y),m!==null&&(x=Yr(),Bo(m,l,y,x),qy(m,c,y))}}function Uy(l){var c=l.alternate;return l===Zn||c!==null&&c===Zn}function Gy(l,c){pc=Ju=!0;var m=l.pending;m===null?c.next=c:(c.next=m.next,m.next=c),l.pending=c}function qy(l,c,m){if(m&4194240){var y=c.lanes;y&=l.pendingLanes,m|=y,c.lanes=m,Pe(l,m)}}var td={readContext:$o,useCallback:Gr,useContext:Gr,useEffect:Gr,useImperativeHandle:Gr,useInsertionEffect:Gr,useLayoutEffect:Gr,useMemo:Gr,useReducer:Gr,useRef:Gr,useState:Gr,useDebugValue:Gr,useDeferredValue:Gr,useTransition:Gr,useMutableSource:Gr,useSyncExternalStore:Gr,useId:Gr,unstable_isNewReconciler:!1},TI={readContext:$o,useCallback:function(l,c){return Ms().memoizedState=[l,c===void 0?null:c],l},useContext:$o,useEffect:Ny,useImperativeHandle:function(l,c,m){return m=m!=null?m.concat([l]):null,Zu(4194308,4,Ly.bind(null,c,l),m)},useLayoutEffect:function(l,c){return Zu(4194308,4,l,c)},useInsertionEffect:function(l,c){return Zu(4,2,l,c)},useMemo:function(l,c){var m=Ms();return c=c===void 0?null:c,l=l(),m.memoizedState=[l,c],l},useReducer:function(l,c,m){var y=Ms();return c=m!==void 0?m(c):c,y.memoizedState=y.baseState=c,l={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:l,lastRenderedState:c},y.queue=l,l=l.dispatch=RI.bind(null,Zn,l),[y.memoizedState,l]},useRef:function(l){var c=Ms();return l={current:l},c.memoizedState=l},useState:Ty,useDebugValue:dm,useDeferredValue:function(l){return Ms().memoizedState=l},useTransition:function(){var l=Ty(!1),c=l[0];return l=MI.bind(null,l[1]),Ms().memoizedState=l,[c,l]},useMutableSource:function(){},useSyncExternalStore:function(l,c,m){var y=Zn,x=Ms();if(Gn){if(m===void 0)throw Error(i(407));m=m()}else{if(m=c(),Ar===null)throw Error(i(349));ci&30||Ey(y,c,m)}x.memoizedState=m;var P={value:m,getSnapshot:c};return x.queue=P,Ny(My.bind(null,y,P,l),[l]),y.flags|=2048,gc(9,Oy.bind(null,y,P,m,c),void 0,null),m},useId:function(){var l=Ms(),c=Ar.identifierPrefix;if(Gn){var m=Ur,y=_o;m=(y&~(1<<32-On(y)-1)).toString(32)+m,c=":"+c+"R"+m,m=hc++,0Rm&&(c.flags|=128,y=!0,bc(x,!1),c.lanes=4194304)}else{if(!y)if(l=Qu(P),l!==null){if(c.flags|=128,y=!0,l=l.updateQueue,l!==null&&(c.updateQueue=l,c.flags|=4),bc(x,!0),x.tail===null&&x.tailMode==="hidden"&&!P.alternate&&!Gn)return qr(c),null}else 2*Ne()-x.renderingStartTime>Rm&&m!==1073741824&&(c.flags|=128,y=!0,bc(x,!1),c.lanes=4194304);x.isBackwards?(P.sibling=c.child,c.child=P):(l=x.last,l!==null?l.sibling=P:c.child=P,x.last=P)}return x.tail!==null?(c=x.tail,x.rendering=c,x.tail=c.sibling,x.renderingStartTime=Ne(),c.sibling=null,l=Jn.current,Tt(Jn,y?l&1|2:l&1),c):(qr(c),null);case 22:case 23:return $m(),m=c.memoizedState!==null,l!==null&&l.memoizedState!==null!==m&&(c.flags|=8192),m&&c.mode&1?Po&1073741824&&(qr(c),ue&&c.subtreeFlags&6&&(c.flags|=8192)):qr(c),null;case 24:return null;case 25:return null}throw Error(i(156,c.tag))}function HI(l,c){switch(Hh(c),c.tag){case 1:return Vn(c.type)&&vt(),l=c.flags,l&65536?(c.flags=l&-65537|128,c):null;case 3:return Xi(),Ct(tn),Ct(zt),rm(),l=c.flags,l&65536&&!(l&128)?(c.flags=l&-65537|128,c):null;case 5:return tm(c),null;case 13:if(Ct(Jn),l=c.memoizedState,l!==null&&l.dehydrated!==null){if(c.alternate===null)throw Error(i(340));Gi()}return l=c.flags,l&65536?(c.flags=l&-65537|128,c):null;case 19:return Ct(Jn),null;case 4:return Xi(),null;case 10:return Kh(c.type._context),null;case 22:case 23:return $m(),null;case 24:return null;default:return null}}var ad=!1,Kr=!1,WI=typeof WeakSet=="function"?WeakSet:Set,st=null;function Zi(l,c){var m=l.ref;if(m!==null)if(typeof m=="function")try{m(null)}catch(y){qn(l,c,y)}else m.current=null}function xm(l,c,m){try{m()}catch(y){qn(l,c,y)}}var fb=!1;function VI(l,c){for(V(l.containerInfo),st=c;st!==null;)if(l=st,c=l.child,(l.subtreeFlags&1028)!==0&&c!==null)c.return=l,st=c;else for(;st!==null;){l=st;try{var m=l.alternate;if(l.flags&1024)switch(l.tag){case 0:case 11:case 15:break;case 1:if(m!==null){var y=m.memoizedProps,x=m.memoizedState,P=l.stateNode,D=P.getSnapshotBeforeUpdate(l.elementType===l.type?y:rs(l.type,y),x);P.__reactInternalSnapshotBeforeUpdate=D}break;case 3:ue&&bn(l.stateNode.containerInfo);break;case 5:case 6:case 4:case 17:break;default:throw Error(i(163))}}catch(Y){qn(l,l.return,Y)}if(c=l.sibling,c!==null){c.return=l.return,st=c;break}st=l.return}return m=fb,fb=!1,m}function xc(l,c,m){var y=c.updateQueue;if(y=y!==null?y.lastEffect:null,y!==null){var x=y=y.next;do{if((x.tag&l)===l){var P=x.destroy;x.destroy=void 0,P!==void 0&&xm(c,m,P)}x=x.next}while(x!==y)}}function id(l,c){if(c=c.updateQueue,c=c!==null?c.lastEffect:null,c!==null){var m=c=c.next;do{if((m.tag&l)===l){var y=m.create;m.destroy=y()}m=m.next}while(m!==c)}}function wm(l){var c=l.ref;if(c!==null){var m=l.stateNode;switch(l.tag){case 5:l=K(m);break;default:l=m}typeof c=="function"?c(l):c.current=l}}function pb(l){var c=l.alternate;c!==null&&(l.alternate=null,pb(c)),l.child=null,l.deletions=null,l.sibling=null,l.tag===5&&(c=l.stateNode,c!==null&&Le(c)),l.stateNode=null,l.return=null,l.dependencies=null,l.memoizedProps=null,l.memoizedState=null,l.pendingProps=null,l.stateNode=null,l.updateQueue=null}function hb(l){return l.tag===5||l.tag===3||l.tag===4}function mb(l){e:for(;;){for(;l.sibling===null;){if(l.return===null||hb(l.return))return null;l=l.return}for(l.sibling.return=l.return,l=l.sibling;l.tag!==5&&l.tag!==6&&l.tag!==18;){if(l.flags&2||l.child===null||l.tag===4)continue e;l.child.return=l,l=l.child}if(!(l.flags&2))return l.stateNode}}function Sm(l,c,m){var y=l.tag;if(y===5||y===6)l=l.stateNode,c?sr(m,l,c):Cn(m,l);else if(y!==4&&(l=l.child,l!==null))for(Sm(l,c,m),l=l.sibling;l!==null;)Sm(l,c,m),l=l.sibling}function Cm(l,c,m){var y=l.tag;if(y===5||y===6)l=l.stateNode,c?vn(m,l,c):Wt(m,l);else if(y!==4&&(l=l.child,l!==null))for(Cm(l,c,m),l=l.sibling;l!==null;)Cm(l,c,m),l=l.sibling}var Hr=null,os=!1;function Ds(l,c,m){for(m=m.child;m!==null;)_m(l,c,m),m=m.sibling}function _m(l,c,m){if(an&&typeof an.onCommitFiberUnmount=="function")try{an.onCommitFiberUnmount(Fn,m)}catch{}switch(m.tag){case 5:Kr||Zi(m,c);case 6:if(ue){var y=Hr,x=os;Hr=null,Ds(l,c,m),Hr=y,os=x,Hr!==null&&(os?at(Hr,m.stateNode):Ee(Hr,m.stateNode))}else Ds(l,c,m);break;case 18:ue&&Hr!==null&&(os?De(Hr,m.stateNode):dt(Hr,m.stateNode));break;case 4:ue?(y=Hr,x=os,Hr=m.stateNode.containerInfo,os=!0,Ds(l,c,m),Hr=y,os=x):(Ce&&(y=m.stateNode.containerInfo,x=fr(y),$n(y,x)),Ds(l,c,m));break;case 0:case 11:case 14:case 15:if(!Kr&&(y=m.updateQueue,y!==null&&(y=y.lastEffect,y!==null))){x=y=y.next;do{var P=x,D=P.destroy;P=P.tag,D!==void 0&&(P&2||P&4)&&xm(m,c,D),x=x.next}while(x!==y)}Ds(l,c,m);break;case 1:if(!Kr&&(Zi(m,c),y=m.stateNode,typeof y.componentWillUnmount=="function"))try{y.props=m.memoizedProps,y.state=m.memoizedState,y.componentWillUnmount()}catch(Y){qn(m,c,Y)}Ds(l,c,m);break;case 21:Ds(l,c,m);break;case 22:m.mode&1?(Kr=(y=Kr)||m.memoizedState!==null,Ds(l,c,m),Kr=y):Ds(l,c,m);break;default:Ds(l,c,m)}}function gb(l){var c=l.updateQueue;if(c!==null){l.updateQueue=null;var m=l.stateNode;m===null&&(m=l.stateNode=new WI),c.forEach(function(y){var x=ZI.bind(null,l,y);m.has(y)||(m.add(y),y.then(x,x))})}}function ss(l,c){var m=c.deletions;if(m!==null)for(var y=0;y";case cd:return":has("+(jm(l)||"")+")";case ud:return'[role="'+l.value+'"]';case fd:return'"'+l.value+'"';case dd:return'[data-testname="'+l.value+'"]';default:throw Error(i(365))}}function Sb(l,c){var m=[];l=[l,0];for(var y=0;yx&&(x=D),y&=~P}if(y=x,y=Ne()-y,y=(120>y?120:480>y?480:1080>y?1080:1920>y?1920:3e3>y?3e3:4320>y?4320:1960*GI(y/1960))-y,10l?16:l,Oa===null)var y=!1;else{if(l=Oa,Oa=null,vd=0,Jt&6)throw Error(i(331));var x=Jt;for(Jt|=4,st=l.current;st!==null;){var P=st,D=P.child;if(st.flags&16){var Y=P.deletions;if(Y!==null){for(var se=0;seNe()-Mm?di(l,0):Om|=m),fo(l,c)}function Mb(l,c){c===0&&(l.mode&1?(c=cn,cn<<=1,!(cn&130023424)&&(cn=4194304)):c=1);var m=Yr();l=Es(l,c),l!==null&&(lt(l,c,m),fo(l,m))}function JI(l){var c=l.memoizedState,m=0;c!==null&&(m=c.retryLane),Mb(l,m)}function ZI(l,c){var m=0;switch(l.tag){case 13:var y=l.stateNode,x=l.memoizedState;x!==null&&(m=x.retryLane);break;case 19:y=l.stateNode;break;default:throw Error(i(314))}y!==null&&y.delete(c),Mb(l,m)}var Rb;Rb=function(l,c,m){if(l!==null)if(l.memoizedProps!==c.pendingProps||tn.current)co=!0;else{if(!(l.lanes&m)&&!(c.flags&128))return co=!1,BI(l,c,m);co=!!(l.flags&131072)}else co=!1,Gn&&c.flags&1048576&&cy(c,to,c.index);switch(c.lanes=0,c.tag){case 2:var y=c.type;rd(l,c),l=c.pendingProps;var x=Sr(c,zt.current);Ki(c,m),x=am(null,c,y,l,x,m);var P=im();return c.flags|=1,typeof x=="object"&&x!==null&&typeof x.render=="function"&&x.$$typeof===void 0?(c.tag=1,c.memoizedState=null,c.updateQueue=null,Vn(y)?(P=!0,Un(c)):P=!1,c.memoizedState=x.state!==null&&x.state!==void 0?x.state:null,Xh(c),x.updater=Ku,c.stateNode=x,x._reactInternals=c,Zh(c,y,l,m),c=mm(null,c,y,!0,P,m)):(c.tag=0,Gn&&P&&Fh(c),oo(null,c,x,m),c=c.child),c;case 16:y=c.elementType;e:{switch(rd(l,c),l=c.pendingProps,x=y._init,y=x(y._payload),c.type=y,x=c.tag=tE(y),l=rs(y,l),x){case 0:c=hm(null,c,y,l,m);break e;case 1:c=ob(null,c,y,l,m);break e;case 11:c=Zy(null,c,y,l,m);break e;case 14:c=eb(null,c,y,rs(y.type,l),m);break e}throw Error(i(306,y,""))}return c;case 0:return y=c.type,x=c.pendingProps,x=c.elementType===y?x:rs(y,x),hm(l,c,y,x,m);case 1:return y=c.type,x=c.pendingProps,x=c.elementType===y?x:rs(y,x),ob(l,c,y,x,m);case 3:e:{if(sb(c),l===null)throw Error(i(387));y=c.pendingProps,P=c.memoizedState,x=P.element,gy(l,c),qu(c,y,null,m);var D=c.memoizedState;if(y=D.element,Re&&P.isDehydrated)if(P={element:y,isDehydrated:!1,cache:D.cache,pendingSuspenseBoundaries:D.pendingSuspenseBoundaries,transitions:D.transitions},c.updateQueue.baseState=P,c.memoizedState=P,c.flags&256){x=Ji(Error(i(423)),c),c=ab(l,c,y,m,x);break e}else if(y!==x){x=Ji(Error(i(424)),c),c=ab(l,c,y,m,x);break e}else for(Re&&(No=Q(c.stateNode.containerInfo),ko=c,Gn=!0,ns=null,cc=!1),m=ky(c,null,y,m),c.child=m;m;)m.flags=m.flags&-3|4096,m=m.sibling;else{if(Gi(),y===x){c=ta(l,c,m);break e}oo(l,c,y,m)}c=c.child}return c;case 5:return Py(c),l===null&&Vh(c),y=c.type,x=c.pendingProps,P=l!==null?l.memoizedProps:null,D=x.children,Z(y,x)?D=null:P!==null&&Z(y,P)&&(c.flags|=32),rb(l,c),oo(l,c,D,m),c.child;case 6:return l===null&&Vh(c),null;case 13:return ib(l,c,m);case 4:return em(c,c.stateNode.containerInfo),y=c.pendingProps,l===null?c.child=Yi(c,null,y,m):oo(l,c,y,m),c.child;case 11:return y=c.type,x=c.pendingProps,x=c.elementType===y?x:rs(y,x),Zy(l,c,y,x,m);case 7:return oo(l,c,c.pendingProps,m),c.child;case 8:return oo(l,c,c.pendingProps.children,m),c.child;case 12:return oo(l,c,c.pendingProps.children,m),c.child;case 10:e:{if(y=c.type._context,x=c.pendingProps,P=c.memoizedProps,D=x.value,hy(c,y,D),P!==null)if(rn(P.value,D)){if(P.children===x.children&&!tn.current){c=ta(l,c,m);break e}}else for(P=c.child,P!==null&&(P.return=c);P!==null;){var Y=P.dependencies;if(Y!==null){D=P.child;for(var se=Y.firstContext;se!==null;){if(se.context===y){if(P.tag===1){se=ea(-1,m&-m),se.tag=2;var Oe=P.updateQueue;if(Oe!==null){Oe=Oe.shared;var ct=Oe.pending;ct===null?se.next=se:(se.next=ct.next,ct.next=se),Oe.pending=se}}P.lanes|=m,se=P.alternate,se!==null&&(se.lanes|=m),Yh(P.return,m,c),Y.lanes|=m;break}se=se.next}}else if(P.tag===10)D=P.type===c.type?null:P.child;else if(P.tag===18){if(D=P.return,D===null)throw Error(i(341));D.lanes|=m,Y=D.alternate,Y!==null&&(Y.lanes|=m),Yh(D,m,c),D=P.sibling}else D=P.child;if(D!==null)D.return=P;else for(D=P;D!==null;){if(D===c){D=null;break}if(P=D.sibling,P!==null){P.return=D.return,D=P;break}D=D.return}P=D}oo(l,c,x.children,m),c=c.child}return c;case 9:return x=c.type,y=c.pendingProps.children,Ki(c,m),x=$o(x),y=y(x),c.flags|=1,oo(l,c,y,m),c.child;case 14:return y=c.type,x=rs(y,c.pendingProps),x=rs(y.type,x),eb(l,c,y,x,m);case 15:return tb(l,c,c.type,c.pendingProps,m);case 17:return y=c.type,x=c.pendingProps,x=c.elementType===y?x:rs(y,x),rd(l,c),c.tag=1,Vn(y)?(l=!0,Un(c)):l=!1,Ki(c,m),wy(c,y,x),Zh(c,y,x,m),mm(null,c,y,!0,l,m);case 19:return cb(l,c,m);case 22:return nb(l,c,m)}throw Error(i(156,c.tag))};function Db(l,c){return Ae(l,c)}function eE(l,c,m,y){this.tag=l,this.key=m,this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null,this.index=0,this.ref=null,this.pendingProps=c,this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null,this.mode=y,this.subtreeFlags=this.flags=0,this.deletions=null,this.childLanes=this.lanes=0,this.alternate=null}function Fo(l,c,m,y){return new eE(l,c,m,y)}function Lm(l){return l=l.prototype,!(!l||!l.isReactComponent)}function tE(l){if(typeof l=="function")return Lm(l)?1:0;if(l!=null){if(l=l.$$typeof,l===w)return 11;if(l===k)return 14}return 2}function Da(l,c){var m=l.alternate;return m===null?(m=Fo(l.tag,c,l.key,l.mode),m.elementType=l.elementType,m.type=l.type,m.stateNode=l.stateNode,m.alternate=l,l.alternate=m):(m.pendingProps=c,m.type=l.type,m.flags=0,m.subtreeFlags=0,m.deletions=null),m.flags=l.flags&14680064,m.childLanes=l.childLanes,m.lanes=l.lanes,m.child=l.child,m.memoizedProps=l.memoizedProps,m.memoizedState=l.memoizedState,m.updateQueue=l.updateQueue,c=l.dependencies,m.dependencies=c===null?null:{lanes:c.lanes,firstContext:c.firstContext},m.sibling=l.sibling,m.index=l.index,m.ref=l.ref,m}function wd(l,c,m,y,x,P){var D=2;if(y=l,typeof l=="function")Lm(l)&&(D=1);else if(typeof l=="string")D=5;else e:switch(l){case h:return hi(m.children,x,P,c);case g:D=8,x|=8;break;case v:return l=Fo(12,m,c,x|2),l.elementType=v,l.lanes=P,l;case C:return l=Fo(13,m,c,x),l.elementType=C,l.lanes=P,l;case _:return l=Fo(19,m,c,x),l.elementType=_,l.lanes=P,l;case E:return Sd(m,x,P,c);default:if(typeof l=="object"&&l!==null)switch(l.$$typeof){case b:D=10;break e;case S:D=9;break e;case w:D=11;break e;case k:D=14;break e;case j:D=16,y=null;break e}throw Error(i(130,l==null?l:typeof l,""))}return c=Fo(D,m,c,x),c.elementType=l,c.type=y,c.lanes=P,c}function hi(l,c,m,y){return l=Fo(7,l,y,c),l.lanes=m,l}function Sd(l,c,m,y){return l=Fo(22,l,y,c),l.elementType=E,l.lanes=m,l.stateNode={isHidden:!1},l}function Bm(l,c,m){return l=Fo(6,l,null,c),l.lanes=m,l}function Fm(l,c,m){return c=Fo(4,l.children!==null?l.children:[],l.key,c),c.lanes=m,c.stateNode={containerInfo:l.containerInfo,pendingChildren:null,implementation:l.implementation},c}function nE(l,c,m,y,x){this.tag=c,this.containerInfo=l,this.finishedWork=this.pingCache=this.current=this.pendingChildren=null,this.timeoutHandle=ne,this.callbackNode=this.pendingContext=this.context=null,this.callbackPriority=0,this.eventTimes=Mt(0),this.expirationTimes=Mt(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=Mt(0),this.identifierPrefix=y,this.onRecoverableError=x,Re&&(this.mutableSourceEagerHydrationData=null)}function Tb(l,c,m,y,x,P,D,Y,se){return l=new nE(l,c,m,Y,se),c===1?(c=1,P===!0&&(c|=8)):c=0,P=Fo(3,null,null,c),l.current=P,P.stateNode=l,P.memoizedState={element:y,isDehydrated:m,cache:null,transitions:null,pendingSuspenseBoundaries:null},Xh(P),l}function Ab(l){if(!l)return xn;l=l._reactInternals;e:{if(A(l)!==l||l.tag!==1)throw Error(i(170));var c=l;do{switch(c.tag){case 3:c=c.stateNode.context;break e;case 1:if(Vn(c.type)){c=c.stateNode.__reactInternalMemoizedMergedChildContext;break e}}c=c.return}while(c!==null);throw Error(i(171))}if(l.tag===1){var m=l.type;if(Vn(m))return kn(l,m,c)}return c}function Nb(l){var c=l._reactInternals;if(c===void 0)throw typeof l.render=="function"?Error(i(188)):(l=Object.keys(l).join(","),Error(i(268,l)));return l=ee(c),l===null?null:l.stateNode}function $b(l,c){if(l=l.memoizedState,l!==null&&l.dehydrated!==null){var m=l.retryLane;l.retryLane=m!==0&&m=Oe&&P>=Vt&&x<=ct&&D<=Je){l.splice(c,1);break}else if(y!==Oe||m.width!==se.width||JeD){if(!(P!==Vt||m.height!==se.height||ctx)){Oe>y&&(se.width+=Oe-y,se.x=y),ctP&&(se.height+=Vt-P,se.y=P),Jem&&(m=D)),D ")+` + +No matching component was found for: + `)+l.join(" > ")}return null},n.getPublicRootInstance=function(l){if(l=l.current,!l.child)return null;switch(l.child.tag){case 5:return K(l.child.stateNode);default:return l.child.stateNode}},n.injectIntoDevTools=function(l){if(l={bundleType:l.bundleType,version:l.version,rendererPackageName:l.rendererPackageName,rendererConfig:l.rendererConfig,overrideHookState:null,overrideHookStateDeletePath:null,overrideHookStateRenamePath:null,overrideProps:null,overridePropsDeletePath:null,overridePropsRenamePath:null,setErrorHandler:null,setSuspenseHandler:null,scheduleUpdate:null,currentDispatcherRef:u.ReactCurrentDispatcher,findHostInstanceByFiber:rE,findFiberByHostInstance:l.findFiberByHostInstance||oE,findHostInstancesForRefresh:null,scheduleRefresh:null,scheduleRoot:null,setRefreshHandler:null,getCurrentFiber:null,reconcilerVersion:"18.2.0"},typeof __REACT_DEVTOOLS_GLOBAL_HOOK__>"u")l=!1;else{var c=__REACT_DEVTOOLS_GLOBAL_HOOK__;if(c.isDisabled||!c.supportsFiber)l=!0;else{try{Fn=c.inject(l),an=c}catch{}l=!!c.checkDCE}}return l},n.isAlreadyRendering=function(){return!1},n.observeVisibleRects=function(l,c,m,y){if(!gt)throw Error(i(363));l=Im(l,c);var x=Ft(l,m,y).disconnect;return{disconnect:function(){x()}}},n.registerMutableSourceForHydration=function(l,c){var m=c._getVersion;m=m(c._source),l.mutableSourceEagerHydrationData==null?l.mutableSourceEagerHydrationData=[c,m]:l.mutableSourceEagerHydrationData.push(c,m)},n.runWithPriority=function(l,c){var m=Se;try{return Se=l,c()}finally{Se=m}},n.shouldError=function(){return null},n.shouldSuspend=function(){return!1},n.updateContainer=function(l,c,m,y){var x=c.current,P=Yr(),D=Ma(x);return m=Ab(m),c.context===null?c.context=m:c.pendingContext=m,c=ea(P,D),c.payload={element:l},y=y===void 0?null:y,y!==null&&(c.callback=y),l=Ia(x,c,D),l!==null&&(Bo(l,x,D,P),Gu(l,x,D)),D},n};uI.exports=Zee;var ete=uI.exports;const tte=vu(ete);var dI={exports:{}},Ui={};/** + * @license React + * react-reconciler-constants.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */Ui.ConcurrentRoot=1;Ui.ContinuousEventPriority=4;Ui.DefaultEventPriority=16;Ui.DiscreteEventPriority=1;Ui.IdleEventPriority=536870912;Ui.LegacyRoot=0;dI.exports=Ui;var fI=dI.exports;const KC={children:!0,ref:!0,key:!0,style:!0,forwardedRef:!0,unstable_applyCache:!0,unstable_applyDrawHitFromCache:!0};let YC=!1,QC=!1;const ay=".react-konva-event",nte=`ReactKonva: You have a Konva node with draggable = true and position defined but no onDragMove or onDragEnd events are handled. +Position of a node will be changed during drag&drop, so you should update state of the react app as well. +Consider to add onDragMove or onDragEnd events. +For more info see: https://github.com/konvajs/react-konva/issues/256 +`,rte=`ReactKonva: You are using "zIndex" attribute for a Konva node. +react-konva may get confused with ordering. Just define correct order of elements in your render function of a component. +For more info see: https://github.com/konvajs/react-konva/issues/194 +`,ote={};function Bh(e,t,n=ote){if(!YC&&"zIndex"in t&&(console.warn(rte),YC=!0),!QC&&t.draggable){var r=t.x!==void 0||t.y!==void 0,o=t.onDragEnd||t.onDragMove;r&&!o&&(console.warn(nte),QC=!0)}for(var s in n)if(!KC[s]){var i=s.slice(0,2)==="on",u=n[s]!==t[s];if(i&&u){var d=s.substr(2).toLowerCase();d.substr(0,7)==="content"&&(d="content"+d.substr(7,1).toUpperCase()+d.substr(8)),e.off(d,n[s])}var p=!t.hasOwnProperty(s);p&&e.setAttr(s,void 0)}var h=t._useStrictMode,g={},v=!1;const b={};for(var s in t)if(!KC[s]){var i=s.slice(0,2)==="on",S=n[s]!==t[s];if(i&&S){var d=s.substr(2).toLowerCase();d.substr(0,7)==="content"&&(d="content"+d.substr(7,1).toUpperCase()+d.substr(8)),t[s]&&(b[d]=t[s])}!i&&(t[s]!==n[s]||h&&t[s]!==e.getAttr(s))&&(v=!0,g[s]=t[s])}v&&(e.setAttrs(g),ai(e));for(var d in b)e.on(d+ay,b[d])}function ai(e){if(!X7.Konva.autoDrawEnabled){var t=e.getLayer()||e.getStage();t&&t.batchDraw()}}const pI={},ste={};pu.Node.prototype._applyProps=Bh;function ate(e,t){if(typeof t=="string"){console.error(`Do not use plain text as child of Konva.Node. You are using text: ${t}`);return}e.add(t),ai(e)}function ite(e,t,n){let r=pu[e];r||(console.error(`Konva has no node with the type ${e}. Group will be used instead. If you use minimal version of react-konva, just import required nodes into Konva: "import "konva/lib/shapes/${e}" If you want to render DOM elements as part of canvas tree take a look into this demo: https://konvajs.github.io/docs/react/DOM_Portal.html`),r=pu.Group);const o={},s={};for(var i in t){var u=i.slice(0,2)==="on";u?s[i]=t[i]:o[i]=t[i]}const d=new r(o);return Bh(d,s),d}function lte(e,t,n){console.error(`Text components are not supported for now in ReactKonva. Your text is: "${e}"`)}function cte(e,t,n){return!1}function ute(e){return e}function dte(){return null}function fte(){return null}function pte(e,t,n,r){return ste}function hte(){}function mte(e){}function gte(e,t){return!1}function vte(){return pI}function yte(){return pI}const bte=setTimeout,xte=clearTimeout,wte=-1;function Ste(e,t){return!1}const Cte=!1,_te=!0,kte=!0;function Pte(e,t){t.parent===e?t.moveToTop():e.add(t),ai(e)}function jte(e,t){t.parent===e?t.moveToTop():e.add(t),ai(e)}function hI(e,t,n){t._remove(),e.add(t),t.setZIndex(n.getZIndex()),ai(e)}function Ite(e,t,n){hI(e,t,n)}function Ete(e,t){t.destroy(),t.off(ay),ai(e)}function Ote(e,t){t.destroy(),t.off(ay),ai(e)}function Mte(e,t,n){console.error(`Text components are not yet supported in ReactKonva. You text is: "${n}"`)}function Rte(e,t,n){}function Dte(e,t,n,r,o){Bh(e,o,r)}function Tte(e){e.hide(),ai(e)}function Ate(e){}function Nte(e,t){(t.visible==null||t.visible)&&e.show()}function $te(e,t){}function zte(e){}function Lte(){}const Bte=()=>fI.DefaultEventPriority,Fte=Object.freeze(Object.defineProperty({__proto__:null,appendChild:Pte,appendChildToContainer:jte,appendInitialChild:ate,cancelTimeout:xte,clearContainer:zte,commitMount:Rte,commitTextUpdate:Mte,commitUpdate:Dte,createInstance:ite,createTextInstance:lte,detachDeletedInstance:Lte,finalizeInitialChildren:cte,getChildHostContext:yte,getCurrentEventPriority:Bte,getPublicInstance:ute,getRootHostContext:vte,hideInstance:Tte,hideTextInstance:Ate,idlePriority:pf.unstable_IdlePriority,insertBefore:hI,insertInContainerBefore:Ite,isPrimaryRenderer:Cte,noTimeout:wte,now:pf.unstable_now,prepareForCommit:dte,preparePortalMount:fte,prepareUpdate:pte,removeChild:Ete,removeChildFromContainer:Ote,resetAfterCommit:hte,resetTextContent:mte,run:pf.unstable_runWithPriority,scheduleTimeout:bte,shouldDeprioritizeSubtree:gte,shouldSetTextContent:Ste,supportsMutation:kte,unhideInstance:Nte,unhideTextInstance:$te,warnsIfNotActing:_te},Symbol.toStringTag,{value:"Module"}));var Hte=Object.defineProperty,Wte=Object.defineProperties,Vte=Object.getOwnPropertyDescriptors,XC=Object.getOwnPropertySymbols,Ute=Object.prototype.hasOwnProperty,Gte=Object.prototype.propertyIsEnumerable,JC=(e,t,n)=>t in e?Hte(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,ZC=(e,t)=>{for(var n in t||(t={}))Ute.call(t,n)&&JC(e,n,t[n]);if(XC)for(var n of XC(t))Gte.call(t,n)&&JC(e,n,t[n]);return e},qte=(e,t)=>Wte(e,Vte(t));function mI(e,t,n){if(!e)return;if(n(e)===!0)return e;let r=t?e.return:e.child;for(;r;){const o=mI(r,t,n);if(o)return o;r=t?null:r.sibling}}function gI(e){try{return Object.defineProperties(e,{_currentRenderer:{get(){return null},set(){}},_currentRenderer2:{get(){return null},set(){}}})}catch{return e}}const iy=gI(f.createContext(null));class vI extends f.Component{render(){return f.createElement(iy.Provider,{value:this._reactInternals},this.props.children)}}const{ReactCurrentOwner:e4,ReactCurrentDispatcher:t4}=f.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;function Kte(){const e=f.useContext(iy);if(e===null)throw new Error("its-fine: useFiber must be called within a !");const t=f.useId();return f.useMemo(()=>{for(const r of[e4==null?void 0:e4.current,e,e==null?void 0:e.alternate]){if(!r)continue;const o=mI(r,!1,s=>{let i=s.memoizedState;for(;i;){if(i.memoizedState===t)return!0;i=i.next}});if(o)return o}},[e,t])}function Yte(){var e,t;const n=Kte(),[r]=f.useState(()=>new Map);r.clear();let o=n;for(;o;){const s=(e=o.type)==null?void 0:e._context;s&&s!==iy&&!r.has(s)&&r.set(s,(t=t4==null?void 0:t4.current)==null?void 0:t.readContext(gI(s))),o=o.return}return r}function Qte(){const e=Yte();return f.useMemo(()=>Array.from(e.keys()).reduce((t,n)=>r=>f.createElement(t,null,f.createElement(n.Provider,qte(ZC({},r),{value:e.get(n)}))),t=>f.createElement(vI,ZC({},t))),[e])}function Xte(e){const t=N.useRef({});return N.useLayoutEffect(()=>{t.current=e}),N.useLayoutEffect(()=>()=>{t.current={}},[]),t.current}const Jte=e=>{const t=N.useRef(),n=N.useRef(),r=N.useRef(),o=Xte(e),s=Qte(),i=u=>{const{forwardedRef:d}=e;d&&(typeof d=="function"?d(u):d.current=u)};return N.useLayoutEffect(()=>(n.current=new pu.Stage({width:e.width,height:e.height,container:t.current}),i(n.current),r.current=Hc.createContainer(n.current,fI.LegacyRoot,!1,null),Hc.updateContainer(N.createElement(s,{},e.children),r.current),()=>{pu.isBrowser&&(i(null),Hc.updateContainer(null,r.current,null),n.current.destroy())}),[]),N.useLayoutEffect(()=>{i(n.current),Bh(n.current,e,o),Hc.updateContainer(N.createElement(s,{},e.children),r.current,null)}),N.createElement("div",{ref:t,id:e.id,accessKey:e.accessKey,className:e.className,role:e.role,style:e.style,tabIndex:e.tabIndex,title:e.title})},Tc="Layer",wa="Group",qs="Rect",mi="Circle",Hp="Line",yI="Image",Zte="Transformer",Hc=tte(Fte);Hc.injectIntoDevTools({findHostInstanceByFiber:()=>null,bundleType:0,version:N.version,rendererPackageName:"react-konva"});const ene=N.forwardRef((e,t)=>N.createElement(vI,{},N.createElement(Jte,{...e,forwardedRef:t}))),tne=ve([en,Xn],(e,t)=>{const{tool:n,isMovingBoundingBox:r}=e;return{tool:n,isStaging:t,isMovingBoundingBox:r}},{memoizeOptions:{resultEqualityCheck:Qt}}),nne=()=>{const e=te(),{tool:t,isStaging:n,isMovingBoundingBox:r}=L(tne);return{handleDragStart:f.useCallback(()=>{(t==="move"||n)&&!r&&e(Mf(!0))},[e,r,n,t]),handleDragMove:f.useCallback(o=>{if(!((t==="move"||n)&&!r))return;const s={x:o.target.x(),y:o.target.y()};e(e3(s))},[e,r,n,t]),handleDragEnd:f.useCallback(()=>{(t==="move"||n)&&!r&&e(Mf(!1))},[e,r,n,t])}},rne=ve([en,ur,Xn],(e,t,n)=>{const{cursorPosition:r,shouldLockBoundingBox:o,shouldShowBoundingBox:s,tool:i,isMaskEnabled:u,shouldSnapToGrid:d}=e;return{activeTabName:t,isCursorOnCanvas:!!r,shouldLockBoundingBox:o,shouldShowBoundingBox:s,tool:i,isStaging:n,isMaskEnabled:u,shouldSnapToGrid:d}},{memoizeOptions:{resultEqualityCheck:Qt}}),one=()=>{const e=te(),{activeTabName:t,shouldShowBoundingBox:n,tool:r,isStaging:o,isMaskEnabled:s,shouldSnapToGrid:i}=L(rne),u=f.useRef(null),d=t3(),p=()=>e(mv());Ke(["shift+c"],()=>{p()},{enabled:()=>!o,preventDefault:!0},[]);const h=()=>e(Su(!s));Ke(["h"],()=>{h()},{enabled:()=>!o,preventDefault:!0},[s]),Ke(["n"],()=>{e(eu(!i))},{enabled:!0,preventDefault:!0},[i]),Ke("esc",()=>{e(J7())},{enabled:()=>!0,preventDefault:!0}),Ke("shift+h",()=>{e(Z7(!n))},{enabled:()=>!o,preventDefault:!0},[t,n]),Ke(["space"],g=>{g.repeat||(d==null||d.container().focus(),r!=="move"&&(u.current=r,e(Hs("move"))),r==="move"&&u.current&&u.current!=="move"&&(e(Hs(u.current)),u.current="move"))},{keyup:!0,keydown:!0,preventDefault:!0},[r,u])},ly=e=>{const t=e.getPointerPosition(),n=e.getAbsoluteTransform().copy();if(!t||!n)return;const r=n.invert().point(t);return{x:r.x,y:r.y}},bI=()=>{const e=te(),t=ha(),n=t3();return{updateColorUnderCursor:()=>{if(!n||!t)return;const r=n.getPointerPosition();if(!r)return;const o=eO.pixelRatio,[s,i,u,d]=t.getContext().getImageData(r.x*o,r.y*o,1,1).data;e(tO({r:s,g:i,b:u,a:d}))},commitColorUnderCursor:()=>{e(nO())}}},sne=ve([ur,en,Xn],(e,t,n)=>{const{tool:r}=t;return{tool:r,activeTabName:e,isStaging:n}},{memoizeOptions:{resultEqualityCheck:Qt}}),ane=e=>{const t=te(),{tool:n,isStaging:r}=L(sne),{commitColorUnderCursor:o}=bI();return f.useCallback(s=>{if(!e.current)return;if(e.current.container().focus(),n==="move"||r){t(Mf(!0));return}if(n==="colorPicker"){o();return}const i=ly(e.current);i&&(s.evt.preventDefault(),t(n3(!0)),t(rO([i.x,i.y])))},[e,n,r,t,o])},ine=ve([ur,en,Xn],(e,t,n)=>{const{tool:r,isDrawing:o}=t;return{tool:r,isDrawing:o,activeTabName:e,isStaging:n}},{memoizeOptions:{resultEqualityCheck:Qt}}),lne=(e,t,n)=>{const r=te(),{isDrawing:o,tool:s,isStaging:i}=L(ine),{updateColorUnderCursor:u}=bI();return f.useCallback(()=>{if(!e.current)return;const d=ly(e.current);if(d){if(r(oO(d)),n.current=d,s==="colorPicker"){u();return}!o||s==="move"||i||(t.current=!0,r(r3([d.x,d.y])))}},[t,r,o,i,n,e,s,u])},cne=()=>{const e=te();return f.useCallback(()=>{e(sO())},[e])},une=ve([ur,en,Xn],(e,t,n)=>{const{tool:r,isDrawing:o}=t;return{tool:r,isDrawing:o,activeTabName:e,isStaging:n}},{memoizeOptions:{resultEqualityCheck:Qt}}),dne=(e,t)=>{const n=te(),{tool:r,isDrawing:o,isStaging:s}=L(une);return f.useCallback(()=>{if(r==="move"||s){n(Mf(!1));return}if(!t.current&&o&&e.current){const i=ly(e.current);if(!i)return;n(r3([i.x,i.y]))}else t.current=!1;n(n3(!1))},[t,n,o,s,e,r])},fne=ve([en],e=>{const{isMoveStageKeyHeld:t,stageScale:n}=e;return{isMoveStageKeyHeld:t,stageScale:n}},{memoizeOptions:{resultEqualityCheck:Qt}}),pne=e=>{const t=te(),{isMoveStageKeyHeld:n,stageScale:r}=L(fne);return f.useCallback(o=>{if(!e.current||n)return;o.evt.preventDefault();const s=e.current.getPointerPosition();if(!s)return;const i={x:(s.x-e.current.x())/r,y:(s.y-e.current.y())/r};let u=o.evt.deltaY;o.evt.ctrlKey&&(u=-u);const d=Vs(r*lO**u,iO,aO),p={x:s.x-i.x*d,y:s.y-i.y*d};t(cO(d)),t(e3(p))},[e,n,r,t])},hne=ve(en,e=>{const{boundingBoxCoordinates:t,boundingBoxDimensions:n,stageDimensions:r,stageScale:o,shouldDarkenOutsideBoundingBox:s,stageCoordinates:i}=e;return{boundingBoxCoordinates:t,boundingBoxDimensions:n,shouldDarkenOutsideBoundingBox:s,stageCoordinates:i,stageDimensions:r,stageScale:o}},{memoizeOptions:{resultEqualityCheck:Qt}}),mne=()=>{const{boundingBoxCoordinates:e,boundingBoxDimensions:t,shouldDarkenOutsideBoundingBox:n,stageCoordinates:r,stageDimensions:o,stageScale:s}=L(hne);return a.jsxs(wa,{children:[a.jsx(qs,{offsetX:r.x/s,offsetY:r.y/s,height:o.height/s,width:o.width/s,fill:"rgba(0,0,0,0.4)",listening:!1,visible:n}),a.jsx(qs,{x:e.x,y:e.y,width:t.width,height:t.height,fill:"rgb(255,255,255)",listening:!1,visible:n,globalCompositeOperation:"destination-out"})]})},gne=ve([en],e=>{const{stageScale:t,stageCoordinates:n,stageDimensions:r}=e;return{stageScale:t,stageCoordinates:n,stageDimensions:r}},{memoizeOptions:{resultEqualityCheck:Qt}}),vne=()=>{const{stageScale:e,stageCoordinates:t,stageDimensions:n}=L(gne),{colorMode:r}=Ro(),[o,s]=f.useState([]),[i,u]=Yl("colors",["base.800","base.200"]),d=f.useCallback(p=>p/e,[e]);return f.useLayoutEffect(()=>{const{width:p,height:h}=n,{x:g,y:v}=t,b={x1:0,y1:0,x2:p,y2:h,offset:{x:d(g),y:d(v)}},S={x:Math.ceil(d(g)/64)*64,y:Math.ceil(d(v)/64)*64},w={x1:-S.x,y1:-S.y,x2:d(p)-S.x+64,y2:d(h)-S.y+64},_={x1:Math.min(b.x1,w.x1),y1:Math.min(b.y1,w.y1),x2:Math.max(b.x2,w.x2),y2:Math.max(b.y2,w.y2)},k=_.x2-_.x1,j=_.y2-_.y1,E=Math.round(k/64)+1,I=Math.round(j/64)+1,O=jx(0,E).map(T=>a.jsx(Hp,{x:_.x1+T*64,y:_.y1,points:[0,0,0,j],stroke:r==="dark"?i:u,strokeWidth:1},`x_${T}`)),M=jx(0,I).map(T=>a.jsx(Hp,{x:_.x1,y:_.y1+T*64,points:[0,0,k,0],stroke:r==="dark"?i:u,strokeWidth:1},`y_${T}`));s(O.concat(M))},[e,t,n,d,r,i,u]),a.jsx(wa,{children:o})},yne=ve([Mo,en],(e,t)=>{const{progressImage:n,sessionId:r}=e,{sessionId:o,boundingBox:s}=t.layerState.stagingArea;return{boundingBox:s,progressImage:r===o?n:void 0}},{memoizeOptions:{resultEqualityCheck:Qt}}),bne=e=>{const{...t}=e,{progressImage:n,boundingBox:r}=L(yne),[o,s]=f.useState(null);return f.useEffect(()=>{if(!n)return;const i=new Image;i.onload=()=>{s(i)},i.src=n.dataURL},[n]),n&&r&&o?a.jsx(yI,{x:r.x,y:r.y,width:r.width,height:r.height,image:o,listening:!1,...t}):null},Pi=e=>{const{r:t,g:n,b:r,a:o}=e;return`rgba(${t}, ${n}, ${r}, ${o})`},xne=ve(en,e=>{const{maskColor:t,stageCoordinates:n,stageDimensions:r,stageScale:o}=e;return{stageCoordinates:n,stageDimensions:r,stageScale:o,maskColorString:Pi(t)}}),n4=e=>`data:image/svg+xml;utf8, + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`.replaceAll("black",e),wne=e=>{const{...t}=e,{maskColorString:n,stageCoordinates:r,stageDimensions:o,stageScale:s}=L(xne),[i,u]=f.useState(null),[d,p]=f.useState(0),h=f.useRef(null),g=f.useCallback(()=>{p(d+1),setTimeout(g,500)},[d]);return f.useEffect(()=>{if(i)return;const v=new Image;v.onload=()=>{u(v)},v.src=n4(n)},[i,n]),f.useEffect(()=>{i&&(i.src=n4(n))},[i,n]),f.useEffect(()=>{const v=setInterval(()=>p(b=>(b+1)%5),50);return()=>clearInterval(v)},[]),!i||!ol(r.x)||!ol(r.y)||!ol(s)||!ol(o.width)||!ol(o.height)?null:a.jsx(qs,{ref:h,offsetX:r.x/s,offsetY:r.y/s,height:o.height/s,width:o.width/s,fillPatternImage:i,fillPatternOffsetY:ol(d)?d:0,fillPatternRepeat:"repeat",fillPatternScale:{x:1/s,y:1/s},listening:!0,globalCompositeOperation:"source-in",...t})},Sne=ve([en],e=>({objects:e.layerState.objects}),{memoizeOptions:{resultEqualityCheck:Qt}}),Cne=e=>{const{...t}=e,{objects:n}=L(Sne);return a.jsx(wa,{listening:!1,...t,children:n.filter(uO).map((r,o)=>a.jsx(Hp,{points:r.points,stroke:"rgb(0,0,0)",strokeWidth:r.strokeWidth*2,tension:0,lineCap:"round",lineJoin:"round",shadowForStrokeEnabled:!1,listening:!1,globalCompositeOperation:r.tool==="brush"?"source-over":"destination-out"},o))})};var gi=f,_ne=function(t,n,r){const o=gi.useRef("loading"),s=gi.useRef(),[i,u]=gi.useState(0),d=gi.useRef(),p=gi.useRef(),h=gi.useRef();return(d.current!==t||p.current!==n||h.current!==r)&&(o.current="loading",s.current=void 0,d.current=t,p.current=n,h.current=r),gi.useLayoutEffect(function(){if(!t)return;var g=document.createElement("img");function v(){o.current="loaded",s.current=g,u(Math.random())}function b(){o.current="failed",s.current=void 0,u(Math.random())}return g.addEventListener("load",v),g.addEventListener("error",b),n&&(g.crossOrigin=n),r&&(g.referrerPolicy=r),g.src=t,function(){g.removeEventListener("load",v),g.removeEventListener("error",b)}},[t,n,r]),[s.current,o.current]};const kne=vu(_ne),xI=e=>{const{width:t,height:n,x:r,y:o,imageName:s}=e.canvasImage,{currentData:i,isError:u}=gs(s??qo.skipToken),[d]=kne((i==null?void 0:i.image_url)??"",dO.get()?"use-credentials":"anonymous");return u?a.jsx(qs,{x:r,y:o,width:t,height:n,fill:"red"}):a.jsx(yI,{x:r,y:o,image:d,listening:!1})},Pne=ve([en],e=>{const{layerState:{objects:t}}=e;return{objects:t}},{memoizeOptions:{resultEqualityCheck:Qt}}),jne=()=>{const{objects:e}=L(Pne);return e?a.jsx(wa,{name:"outpainting-objects",listening:!1,children:e.map((t,n)=>{if(fO(t))return a.jsx(xI,{canvasImage:t},n);if(pO(t)){const r=a.jsx(Hp,{points:t.points,stroke:t.color?Pi(t.color):"rgb(0,0,0)",strokeWidth:t.strokeWidth*2,tension:0,lineCap:"round",lineJoin:"round",shadowForStrokeEnabled:!1,listening:!1,globalCompositeOperation:t.tool==="brush"?"source-over":"destination-out"},n);return t.clip?a.jsx(wa,{clipX:t.clip.x,clipY:t.clip.y,clipWidth:t.clip.width,clipHeight:t.clip.height,children:r},n):r}else{if(hO(t))return a.jsx(qs,{x:t.x,y:t.y,width:t.width,height:t.height,fill:Pi(t.color)},n);if(mO(t))return a.jsx(qs,{x:t.x,y:t.y,width:t.width,height:t.height,fill:"rgb(255, 255, 255)",globalCompositeOperation:"destination-out"},n)}})}):null},Ine=ve([en],e=>{const{layerState:t,shouldShowStagingImage:n,shouldShowStagingOutline:r,boundingBoxCoordinates:{x:o,y:s},boundingBoxDimensions:{width:i,height:u}}=e,{selectedImageIndex:d,images:p}=t.stagingArea;return{currentStagingAreaImage:p.length>0&&d!==void 0?p[d]:void 0,isOnFirstImage:d===0,isOnLastImage:d===p.length-1,shouldShowStagingImage:n,shouldShowStagingOutline:r,x:o,y:s,width:i,height:u}},{memoizeOptions:{resultEqualityCheck:Qt}}),Ene=e=>{const{...t}=e,{currentStagingAreaImage:n,shouldShowStagingImage:r,shouldShowStagingOutline:o,x:s,y:i,width:u,height:d}=L(Ine);return a.jsxs(wa,{...t,children:[r&&n&&a.jsx(xI,{canvasImage:n}),o&&a.jsxs(wa,{children:[a.jsx(qs,{x:s,y:i,width:u,height:d,strokeWidth:1,stroke:"white",strokeScaleEnabled:!1}),a.jsx(qs,{x:s,y:i,width:u,height:d,dash:[4,4],strokeWidth:1,stroke:"black",strokeScaleEnabled:!1})]})]})},One=ve([en],e=>{const{layerState:{stagingArea:{images:t,selectedImageIndex:n,sessionId:r}},shouldShowStagingOutline:o,shouldShowStagingImage:s}=e;return{currentStagingAreaImage:t.length>0?t[n]:void 0,isOnFirstImage:n===0,isOnLastImage:n===t.length-1,shouldShowStagingImage:s,shouldShowStagingOutline:o,sessionId:r}},{memoizeOptions:{resultEqualityCheck:Qt}}),Mne=()=>{const e=te(),{isOnFirstImage:t,isOnLastImage:n,currentStagingAreaImage:r,shouldShowStagingImage:o,sessionId:s}=L(One),{t:i}=fe(),u=f.useCallback(()=>{e(yx(!0))},[e]),d=f.useCallback(()=>{e(yx(!1))},[e]);Ke(["left"],()=>{p()},{enabled:()=>!0,preventDefault:!0}),Ke(["right"],()=>{h()},{enabled:()=>!0,preventDefault:!0}),Ke(["enter"],()=>{g()},{enabled:()=>!0,preventDefault:!0});const p=f.useCallback(()=>e(gO()),[e]),h=f.useCallback(()=>e(vO()),[e]),g=f.useCallback(()=>e(yO(s)),[e,s]);return r?a.jsx(F,{pos:"absolute",bottom:4,w:"100%",align:"center",justify:"center",filter:"drop-shadow(0 0.5rem 1rem rgba(0,0,0))",onMouseOver:u,onMouseOut:d,children:a.jsxs(Yn,{isAttached:!0,children:[a.jsx(je,{tooltip:`${i("unifiedCanvas.previous")} (Left)`,"aria-label":`${i("unifiedCanvas.previous")} (Left)`,icon:a.jsx(r$,{}),onClick:p,colorScheme:"accent",isDisabled:t}),a.jsx(je,{tooltip:`${i("unifiedCanvas.next")} (Right)`,"aria-label":`${i("unifiedCanvas.next")} (Right)`,icon:a.jsx(o$,{}),onClick:h,colorScheme:"accent",isDisabled:n}),a.jsx(je,{tooltip:`${i("unifiedCanvas.accept")} (Enter)`,"aria-label":`${i("unifiedCanvas.accept")} (Enter)`,icon:a.jsx(a$,{}),onClick:g,colorScheme:"accent"}),a.jsx(je,{tooltip:i("unifiedCanvas.showHide"),"aria-label":i("unifiedCanvas.showHide"),"data-alert":!o,icon:o?a.jsx(m$,{}):a.jsx(h$,{}),onClick:()=>e(bO(!o)),colorScheme:"accent"}),a.jsx(je,{tooltip:i("unifiedCanvas.saveToGallery"),"aria-label":i("unifiedCanvas.saveToGallery"),icon:a.jsx(ph,{}),onClick:()=>e(xO({imageName:r.imageName})),colorScheme:"accent"}),a.jsx(je,{tooltip:i("unifiedCanvas.discardAll"),"aria-label":i("unifiedCanvas.discardAll"),icon:a.jsx(Tu,{style:{transform:"rotate(45deg)"}}),onClick:()=>e(wO()),colorScheme:"error",fontSize:20})]})}):null},wl=e=>Math.round(e*100)/100,Rne=ve([en],e=>{const{cursorPosition:t}=e,{cursorX:n,cursorY:r}=t?{cursorX:t.x,cursorY:t.y}:{cursorX:-1,cursorY:-1};return{cursorCoordinatesString:`(${wl(n)}, ${wl(r)})`}},{memoizeOptions:{resultEqualityCheck:Qt}});function Dne(){const{cursorCoordinatesString:e}=L(Rne),{t}=fe();return a.jsx(ze,{children:`${t("unifiedCanvas.cursorPosition")}: ${e}`})}const Z0="var(--invokeai-colors-warning-500)",Tne=ve([en],e=>{const{stageDimensions:{width:t,height:n},stageCoordinates:{x:r,y:o},boundingBoxDimensions:{width:s,height:i},scaledBoundingBoxDimensions:{width:u,height:d},boundingBoxCoordinates:{x:p,y:h},stageScale:g,shouldShowCanvasDebugInfo:v,layer:b,boundingBoxScaleMethod:S,shouldPreserveMaskedArea:w}=e;let C="inherit";return(S==="none"&&(s<512||i<512)||S==="manual"&&u*d<512*512)&&(C=Z0),{activeLayerColor:b==="mask"?Z0:"inherit",activeLayerString:b.charAt(0).toUpperCase()+b.slice(1),boundingBoxColor:C,boundingBoxCoordinatesString:`(${wl(p)}, ${wl(h)})`,boundingBoxDimensionsString:`${s}×${i}`,scaledBoundingBoxDimensionsString:`${u}×${d}`,canvasCoordinatesString:`${wl(r)}×${wl(o)}`,canvasDimensionsString:`${t}×${n}`,canvasScaleString:Math.round(g*100),shouldShowCanvasDebugInfo:v,shouldShowBoundingBox:S!=="auto",shouldShowScaledBoundingBox:S!=="none",shouldPreserveMaskedArea:w}},{memoizeOptions:{resultEqualityCheck:Qt}}),Ane=()=>{const{activeLayerColor:e,activeLayerString:t,boundingBoxColor:n,boundingBoxCoordinatesString:r,boundingBoxDimensionsString:o,scaledBoundingBoxDimensionsString:s,shouldShowScaledBoundingBox:i,canvasCoordinatesString:u,canvasDimensionsString:d,canvasScaleString:p,shouldShowCanvasDebugInfo:h,shouldShowBoundingBox:g,shouldPreserveMaskedArea:v}=L(Tne),{t:b}=fe();return a.jsxs(F,{sx:{flexDirection:"column",position:"absolute",top:0,insetInlineStart:0,opacity:.65,display:"flex",fontSize:"sm",padding:1,px:2,minWidth:48,margin:1,borderRadius:"base",pointerEvents:"none",bg:"base.200",_dark:{bg:"base.800"}},children:[a.jsx(ze,{style:{color:e},children:`${b("unifiedCanvas.activeLayer")}: ${t}`}),a.jsx(ze,{children:`${b("unifiedCanvas.canvasScale")}: ${p}%`}),v&&a.jsx(ze,{style:{color:Z0},children:"Preserve Masked Area: On"}),g&&a.jsx(ze,{style:{color:n},children:`${b("unifiedCanvas.boundingBox")}: ${o}`}),i&&a.jsx(ze,{style:{color:n},children:`${b("unifiedCanvas.scaledBoundingBox")}: ${s}`}),h&&a.jsxs(a.Fragment,{children:[a.jsx(ze,{children:`${b("unifiedCanvas.boundingBoxPosition")}: ${r}`}),a.jsx(ze,{children:`${b("unifiedCanvas.canvasDimensions")}: ${d}`}),a.jsx(ze,{children:`${b("unifiedCanvas.canvasPosition")}: ${u}`}),a.jsx(Dne,{})]})]})},Nne=ve([en,Jr],(e,t)=>{const{boundingBoxCoordinates:n,boundingBoxDimensions:r,stageScale:o,isDrawing:s,isTransformingBoundingBox:i,isMovingBoundingBox:u,tool:d,shouldSnapToGrid:p}=e,{aspectRatio:h}=t;return{boundingBoxCoordinates:n,boundingBoxDimensions:r,isDrawing:s,isMovingBoundingBox:u,isTransformingBoundingBox:i,stageScale:o,shouldSnapToGrid:p,tool:d,hitStrokeWidth:20/o,aspectRatio:h}},{memoizeOptions:{resultEqualityCheck:Qt}}),$ne=e=>{const{...t}=e,n=te(),{boundingBoxCoordinates:r,boundingBoxDimensions:o,isDrawing:s,isMovingBoundingBox:i,isTransformingBoundingBox:u,stageScale:d,shouldSnapToGrid:p,tool:h,hitStrokeWidth:g,aspectRatio:v}=L(Nne),b=f.useRef(null),S=f.useRef(null),[w,C]=f.useState(!1);f.useEffect(()=>{var B;!b.current||!S.current||(b.current.nodes([S.current]),(B=b.current.getLayer())==null||B.batchDraw())},[]);const _=64*d;Ke("N",()=>{n(eu(!p))});const k=f.useCallback(B=>{if(!p){n(Um({x:Math.floor(B.target.x()),y:Math.floor(B.target.y())}));return}const H=B.target.x(),G=B.target.y(),K=cs(H,64),R=cs(G,64);B.target.x(K),B.target.y(R),n(Um({x:K,y:R}))},[n,p]),j=f.useCallback(()=>{if(!S.current)return;const B=S.current,H=B.scaleX(),G=B.scaleY(),K=Math.round(B.width()*H),R=Math.round(B.height()*G),U=Math.round(B.x()),V=Math.round(B.y());if(v){const J=cs(K/v,64);n(Bs({width:K,height:J}))}else n(Bs({width:K,height:R}));n(Um({x:p?Pd(U,64):U,y:p?Pd(V,64):V})),B.scaleX(1),B.scaleY(1)},[n,p,v]),E=f.useCallback((B,H,G)=>{const K=B.x%_,R=B.y%_;return{x:Pd(H.x,_)+K,y:Pd(H.y,_)+R}},[_]),I=()=>{n(Gm(!0))},O=()=>{n(Gm(!1)),n(qm(!1)),n(jd(!1)),C(!1)},M=()=>{n(qm(!0))},T=()=>{n(Gm(!1)),n(qm(!1)),n(jd(!1)),C(!1)},A=()=>{C(!0)},z=()=>{!u&&!i&&C(!1)},$=()=>{n(jd(!0))},ee=()=>{n(jd(!1))};return a.jsxs(wa,{...t,children:[a.jsx(qs,{height:o.height,width:o.width,x:r.x,y:r.y,onMouseEnter:$,onMouseOver:$,onMouseLeave:ee,onMouseOut:ee}),a.jsx(qs,{draggable:!0,fillEnabled:!1,height:o.height,hitStrokeWidth:g,listening:!s&&h==="move",onDragStart:M,onDragEnd:T,onDragMove:k,onMouseDown:M,onMouseOut:z,onMouseOver:A,onMouseEnter:A,onMouseUp:T,onTransform:j,onTransformEnd:O,ref:S,stroke:w?"rgba(255,255,255,0.7)":"white",strokeWidth:(w?8:1)/d,width:o.width,x:r.x,y:r.y}),a.jsx(Zte,{anchorCornerRadius:3,anchorDragBoundFunc:E,anchorFill:"rgba(212,216,234,1)",anchorSize:15,anchorStroke:"rgb(42,42,42)",borderDash:[4,4],borderEnabled:!0,borderStroke:"black",draggable:!1,enabledAnchors:h==="move"?void 0:[],flipEnabled:!1,ignoreStroke:!0,keepRatio:!1,listening:!s&&h==="move",onDragStart:M,onDragEnd:T,onMouseDown:I,onMouseUp:O,onTransformEnd:O,ref:b,rotateEnabled:!1})]})},zne=ve(en,e=>{const{cursorPosition:t,brushSize:n,colorPickerColor:r,maskColor:o,brushColor:s,tool:i,layer:u,shouldShowBrush:d,isMovingBoundingBox:p,isTransformingBoundingBox:h,stageScale:g,stageDimensions:v,boundingBoxCoordinates:b,boundingBoxDimensions:S,shouldRestrictStrokesToBox:w}=e,C=w?{clipX:b.x,clipY:b.y,clipWidth:S.width,clipHeight:S.height}:{};return{cursorPosition:t,brushX:t?t.x:v.width/2,brushY:t?t.y:v.height/2,radius:n/2,colorPickerOuterRadius:bx/g,colorPickerInnerRadius:(bx-Yg+1)/g,maskColorString:Pi({...o,a:.5}),brushColorString:Pi(s),colorPickerColorString:Pi(r),tool:i,layer:u,shouldShowBrush:d,shouldDrawBrushPreview:!(p||h||!t)&&d,strokeWidth:1.5/g,dotRadius:1.5/g,clip:C}},{memoizeOptions:{resultEqualityCheck:Qt}}),Lne=e=>{const{...t}=e,{brushX:n,brushY:r,radius:o,maskColorString:s,tool:i,layer:u,shouldDrawBrushPreview:d,dotRadius:p,strokeWidth:h,brushColorString:g,colorPickerColorString:v,colorPickerInnerRadius:b,colorPickerOuterRadius:S,clip:w}=L(zne);return d?a.jsxs(wa,{listening:!1,...w,...t,children:[i==="colorPicker"?a.jsxs(a.Fragment,{children:[a.jsx(mi,{x:n,y:r,radius:S,stroke:g,strokeWidth:Yg,strokeScaleEnabled:!1}),a.jsx(mi,{x:n,y:r,radius:b,stroke:v,strokeWidth:Yg,strokeScaleEnabled:!1})]}):a.jsxs(a.Fragment,{children:[a.jsx(mi,{x:n,y:r,radius:o,fill:u==="mask"?s:g,globalCompositeOperation:i==="eraser"?"destination-out":"source-out"}),a.jsx(mi,{x:n,y:r,radius:o,stroke:"rgba(255,255,255,0.4)",strokeWidth:h*2,strokeEnabled:!0,listening:!1}),a.jsx(mi,{x:n,y:r,radius:o,stroke:"rgba(0,0,0,1)",strokeWidth:h,strokeEnabled:!0,listening:!1})]}),a.jsx(mi,{x:n,y:r,radius:p*2,fill:"rgba(255,255,255,0.4)",listening:!1}),a.jsx(mi,{x:n,y:r,radius:p,fill:"rgba(0,0,0,1)",listening:!1})]}):null},Bne=ve([en,Xn],(e,t)=>{const{isMaskEnabled:n,stageScale:r,shouldShowBoundingBox:o,isTransformingBoundingBox:s,isMouseOverBoundingBox:i,isMovingBoundingBox:u,stageDimensions:d,stageCoordinates:p,tool:h,isMovingStage:g,shouldShowIntermediates:v,shouldShowGrid:b,shouldRestrictStrokesToBox:S,shouldAntialias:w}=e;let C="none";return h==="move"||t?g?C="grabbing":C="grab":s?C=void 0:S&&!i&&(C="default"),{isMaskEnabled:n,isModifyingBoundingBox:s||u,shouldShowBoundingBox:o,shouldShowGrid:b,stageCoordinates:p,stageCursor:C,stageDimensions:d,stageScale:r,tool:h,isStaging:t,shouldShowIntermediates:v,shouldAntialias:w}},it),Fne=He(ene,{shouldForwardProp:e=>!["sx"].includes(e)}),r4=()=>{const{isMaskEnabled:e,isModifyingBoundingBox:t,shouldShowBoundingBox:n,shouldShowGrid:r,stageCoordinates:o,stageCursor:s,stageDimensions:i,stageScale:u,tool:d,isStaging:p,shouldShowIntermediates:h,shouldAntialias:g}=L(Bne);one();const v=f.useRef(null),b=f.useRef(null),S=f.useCallback(z=>{CO(z),v.current=z},[]),w=f.useCallback(z=>{SO(z),b.current=z},[]),C=f.useRef({x:0,y:0}),_=f.useRef(!1),k=pne(v),j=ane(v),E=dne(v,_),I=lne(v,_,C),O=cne(),{handleDragStart:M,handleDragMove:T,handleDragEnd:A}=nne();return a.jsx(F,{sx:{position:"relative",height:"100%",width:"100%",borderRadius:"base"},children:a.jsxs(ze,{sx:{position:"relative"},children:[a.jsxs(Fne,{tabIndex:-1,ref:S,sx:{outline:"none",overflow:"hidden",cursor:s||void 0,canvas:{outline:"none"}},x:o.x,y:o.y,width:i.width,height:i.height,scale:{x:u,y:u},onTouchStart:j,onTouchMove:I,onTouchEnd:E,onMouseDown:j,onMouseLeave:O,onMouseMove:I,onMouseUp:E,onDragStart:M,onDragMove:T,onDragEnd:A,onContextMenu:z=>z.evt.preventDefault(),onWheel:k,draggable:(d==="move"||p)&&!t,children:[a.jsx(Tc,{id:"grid",visible:r,children:a.jsx(vne,{})}),a.jsx(Tc,{id:"base",ref:w,listening:!1,imageSmoothingEnabled:g,children:a.jsx(jne,{})}),a.jsxs(Tc,{id:"mask",visible:e,listening:!1,children:[a.jsx(Cne,{visible:!0,listening:!1}),a.jsx(wne,{listening:!1})]}),a.jsx(Tc,{children:a.jsx(mne,{})}),a.jsxs(Tc,{id:"preview",imageSmoothingEnabled:g,children:[!p&&a.jsx(Lne,{visible:d!=="move",listening:!1}),a.jsx(Ene,{visible:p}),h&&a.jsx(bne,{}),a.jsx($ne,{visible:n&&!p})]})]}),a.jsx(Ane,{}),a.jsx(Mne,{})]})})},Hne=ve(en,_O,ur,(e,t,n)=>{const{doesCanvasNeedScaling:r,isCanvasInitialized:o}=e;return{doesCanvasNeedScaling:r,activeTabName:n,initialCanvasImage:t,isCanvasInitialized:o}}),o4=()=>{const e=te(),{doesCanvasNeedScaling:t,activeTabName:n,initialCanvasImage:r,isCanvasInitialized:o}=L(Hne),s=f.useRef(null);return f.useLayoutEffect(()=>{window.setTimeout(()=>{if(!s.current)return;const{clientWidth:i,clientHeight:u}=s.current;e(kO({width:i,height:u})),e(o?PO():Kp()),e(w4(!1))},0)},[e,r,t,n,o]),a.jsx(F,{ref:s,sx:{flexDirection:"column",alignItems:"center",justifyContent:"center",gap:4,width:"100%",height:"100%"},children:a.jsx(Jl,{thickness:"2px",size:"xl"})})};function wI(e,t,n=250){const[r,o]=f.useState(0);return f.useEffect(()=>{const s=setTimeout(()=>{r===1&&e(),o(0)},n);return r===2&&t(),()=>clearTimeout(s)},[r,e,t,n]),()=>o(s=>s+1)}const Wne=He(aI,{baseStyle:{paddingInline:4},shouldForwardProp:e=>!["pickerColor"].includes(e)}),Lg={width:6,height:6,borderColor:"base.100"},Vne=e=>{const{styleClass:t="",...n}=e;return a.jsx(Wne,{sx:{".react-colorful__hue-pointer":Lg,".react-colorful__saturation-pointer":Lg,".react-colorful__alpha-pointer":Lg},className:t,...n})},Wp=f.memo(Vne),Une=ve([en,Xn],(e,t)=>{const{maskColor:n,layer:r,isMaskEnabled:o,shouldPreserveMaskedArea:s}=e;return{layer:r,maskColor:n,maskColorString:Pi(n),isMaskEnabled:o,shouldPreserveMaskedArea:s,isStaging:t}},{memoizeOptions:{resultEqualityCheck:Qt}}),Gne=()=>{const e=te(),{t}=fe(),{layer:n,maskColor:r,isMaskEnabled:o,shouldPreserveMaskedArea:s,isStaging:i}=L(Une);Ke(["q"],()=>{u()},{enabled:()=>!i,preventDefault:!0},[n]),Ke(["shift+c"],()=>{d()},{enabled:()=>!i,preventDefault:!0},[]),Ke(["h"],()=>{p()},{enabled:()=>!i,preventDefault:!0},[o]);const u=()=>{e(Rf(n==="mask"?"base":"mask"))},d=()=>e(mv()),p=()=>e(Su(!o));return a.jsx(zi,{triggerComponent:a.jsx(Yn,{children:a.jsx(je,{"aria-label":t("unifiedCanvas.maskingOptions"),tooltip:t("unifiedCanvas.maskingOptions"),icon:a.jsx(_$,{}),isChecked:n==="mask",isDisabled:i})}),children:a.jsxs(F,{direction:"column",gap:2,children:[a.jsx(Bn,{label:`${t("unifiedCanvas.enableMask")} (H)`,isChecked:o,onChange:p}),a.jsx(Bn,{label:t("unifiedCanvas.preserveMaskedArea"),isChecked:s,onChange:h=>e(o3(h.target.checked))}),a.jsx(Wp,{sx:{paddingTop:2,paddingBottom:2},pickerColor:r,onChange:h=>e(s3(h))}),a.jsxs(Zt,{size:"sm",leftIcon:a.jsx(yo,{}),onClick:d,children:[t("unifiedCanvas.clearMask")," (Shift+C)"]})]})})},qne=ve([en,ur,Mo],(e,t,n)=>{const{futureLayerStates:r}=e;return{canRedo:r.length>0&&!n.isProcessing,activeTabName:t}},{memoizeOptions:{resultEqualityCheck:Qt}});function SI(){const e=te(),{canRedo:t,activeTabName:n}=L(qne),{t:r}=fe(),o=()=>{e(jO())};return Ke(["meta+shift+z","ctrl+shift+z","control+y","meta+y"],()=>{o()},{enabled:()=>t,preventDefault:!0},[n,t]),a.jsx(je,{"aria-label":`${r("unifiedCanvas.redo")} (Ctrl+Shift+Z)`,tooltip:`${r("unifiedCanvas.redo")} (Ctrl+Shift+Z)`,icon:a.jsx(I$,{}),onClick:o,isDisabled:!t})}const CI=()=>{const e=L(Xn),t=te(),{t:n}=fe();return a.jsxs(ny,{title:n("unifiedCanvas.clearCanvasHistory"),acceptCallback:()=>t(IO()),acceptButtonText:n("unifiedCanvas.clearHistory"),triggerComponent:a.jsx(Zt,{size:"sm",leftIcon:a.jsx(yo,{}),isDisabled:e,children:n("unifiedCanvas.clearCanvasHistory")}),children:[a.jsx("p",{children:n("unifiedCanvas.clearCanvasHistoryMessage")}),a.jsx("br",{}),a.jsx("p",{children:n("unifiedCanvas.clearCanvasHistoryConfirm")})]})},Kne=ve([en],e=>{const{shouldAutoSave:t,shouldCropToBoundingBoxOnSave:n,shouldDarkenOutsideBoundingBox:r,shouldShowCanvasDebugInfo:o,shouldShowGrid:s,shouldShowIntermediates:i,shouldSnapToGrid:u,shouldRestrictStrokesToBox:d,shouldAntialias:p}=e;return{shouldAutoSave:t,shouldCropToBoundingBoxOnSave:n,shouldDarkenOutsideBoundingBox:r,shouldShowCanvasDebugInfo:o,shouldShowGrid:s,shouldShowIntermediates:i,shouldSnapToGrid:u,shouldRestrictStrokesToBox:d,shouldAntialias:p}},{memoizeOptions:{resultEqualityCheck:Qt}}),Yne=()=>{const e=te(),{t}=fe(),{shouldAutoSave:n,shouldCropToBoundingBoxOnSave:r,shouldDarkenOutsideBoundingBox:o,shouldShowCanvasDebugInfo:s,shouldShowGrid:i,shouldShowIntermediates:u,shouldSnapToGrid:d,shouldRestrictStrokesToBox:p,shouldAntialias:h}=L(Kne);Ke(["n"],()=>{e(eu(!d))},{enabled:!0,preventDefault:!0},[d]);const g=v=>e(eu(v.target.checked));return a.jsx(zi,{isLazy:!1,triggerComponent:a.jsx(je,{tooltip:t("unifiedCanvas.canvasSettings"),"aria-label":t("unifiedCanvas.canvasSettings"),icon:a.jsx(Qv,{})}),children:a.jsxs(F,{direction:"column",gap:2,children:[a.jsx(Bn,{label:t("unifiedCanvas.showIntermediates"),isChecked:u,onChange:v=>e(a3(v.target.checked))}),a.jsx(Bn,{label:t("unifiedCanvas.showGrid"),isChecked:i,onChange:v=>e(i3(v.target.checked))}),a.jsx(Bn,{label:t("unifiedCanvas.snapToGrid"),isChecked:d,onChange:g}),a.jsx(Bn,{label:t("unifiedCanvas.darkenOutsideSelection"),isChecked:o,onChange:v=>e(l3(v.target.checked))}),a.jsx(Bn,{label:t("unifiedCanvas.autoSaveToGallery"),isChecked:n,onChange:v=>e(c3(v.target.checked))}),a.jsx(Bn,{label:t("unifiedCanvas.saveBoxRegionOnly"),isChecked:r,onChange:v=>e(u3(v.target.checked))}),a.jsx(Bn,{label:t("unifiedCanvas.limitStrokesToBox"),isChecked:p,onChange:v=>e(d3(v.target.checked))}),a.jsx(Bn,{label:t("unifiedCanvas.showCanvasDebugInfo"),isChecked:s,onChange:v=>e(f3(v.target.checked))}),a.jsx(Bn,{label:t("unifiedCanvas.antialiasing"),isChecked:h,onChange:v=>e(p3(v.target.checked))}),a.jsx(CI,{})]})})},Qne=ve([en,Xn,Mo],(e,t,n)=>{const{isProcessing:r}=n,{tool:o,brushColor:s,brushSize:i}=e;return{tool:o,isStaging:t,isProcessing:r,brushColor:s,brushSize:i}},{memoizeOptions:{resultEqualityCheck:Qt}}),Xne=()=>{const e=te(),{tool:t,brushColor:n,brushSize:r,isStaging:o}=L(Qne),{t:s}=fe();Ke(["b"],()=>{i()},{enabled:()=>!o,preventDefault:!0},[]),Ke(["e"],()=>{u()},{enabled:()=>!o,preventDefault:!0},[t]),Ke(["c"],()=>{d()},{enabled:()=>!o,preventDefault:!0},[t]),Ke(["shift+f"],()=>{p()},{enabled:()=>!o,preventDefault:!0}),Ke(["delete","backspace"],()=>{h()},{enabled:()=>!o,preventDefault:!0}),Ke(["BracketLeft"],()=>{e(_l(Math.max(r-5,5)))},{enabled:()=>!o,preventDefault:!0},[r]),Ke(["BracketRight"],()=>{e(_l(Math.min(r+5,500)))},{enabled:()=>!o,preventDefault:!0},[r]),Ke(["Shift+BracketLeft"],()=>{e(kl({...n,a:Vs(n.a-.05,.05,1)}))},{enabled:()=>!o,preventDefault:!0},[n]),Ke(["Shift+BracketRight"],()=>{e(kl({...n,a:Vs(n.a+.05,.05,1)}))},{enabled:()=>!o,preventDefault:!0},[n]);const i=()=>e(Hs("brush")),u=()=>e(Hs("eraser")),d=()=>e(Hs("colorPicker")),p=()=>e(h3()),h=()=>e(m3());return a.jsxs(Yn,{isAttached:!0,children:[a.jsx(je,{"aria-label":`${s("unifiedCanvas.brush")} (B)`,tooltip:`${s("unifiedCanvas.brush")} (B)`,icon:a.jsx(z5,{}),isChecked:t==="brush"&&!o,onClick:i,isDisabled:o}),a.jsx(je,{"aria-label":`${s("unifiedCanvas.eraser")} (E)`,tooltip:`${s("unifiedCanvas.eraser")} (E)`,icon:a.jsx(T5,{}),isChecked:t==="eraser"&&!o,isDisabled:o,onClick:u}),a.jsx(je,{"aria-label":`${s("unifiedCanvas.fillBoundingBox")} (Shift+F)`,tooltip:`${s("unifiedCanvas.fillBoundingBox")} (Shift+F)`,icon:a.jsx(N5,{}),isDisabled:o,onClick:p}),a.jsx(je,{"aria-label":`${s("unifiedCanvas.eraseBoundingBox")} (Del/Backspace)`,tooltip:`${s("unifiedCanvas.eraseBoundingBox")} (Del/Backspace)`,icon:a.jsx(Tu,{style:{transform:"rotate(45deg)"}}),isDisabled:o,onClick:h}),a.jsx(je,{"aria-label":`${s("unifiedCanvas.colorPicker")} (C)`,tooltip:`${s("unifiedCanvas.colorPicker")} (C)`,icon:a.jsx(A5,{}),isChecked:t==="colorPicker"&&!o,isDisabled:o,onClick:d}),a.jsx(zi,{triggerComponent:a.jsx(je,{"aria-label":s("unifiedCanvas.brushOptions"),tooltip:s("unifiedCanvas.brushOptions"),icon:a.jsx(Kv,{})}),children:a.jsxs(F,{minWidth:60,direction:"column",gap:4,width:"100%",children:[a.jsx(F,{gap:4,justifyContent:"space-between",children:a.jsx(St,{label:s("unifiedCanvas.brushSize"),value:r,withInput:!0,onChange:g=>e(_l(g)),sliderNumberInputProps:{max:500}})}),a.jsx(Wp,{sx:{width:"100%",paddingTop:2,paddingBottom:2},pickerColor:n,onChange:g=>e(kl(g))})]})})]})},Jne=ve([en,ur,Mo],(e,t,n)=>{const{pastLayerStates:r}=e;return{canUndo:r.length>0&&!n.isProcessing,activeTabName:t}},{memoizeOptions:{resultEqualityCheck:Qt}});function _I(){const e=te(),{t}=fe(),{canUndo:n,activeTabName:r}=L(Jne),o=()=>{e(EO())};return Ke(["meta+z","ctrl+z"],()=>{o()},{enabled:()=>n,preventDefault:!0},[r,n]),a.jsx(je,{"aria-label":`${t("unifiedCanvas.undo")} (Ctrl+Z)`,tooltip:`${t("unifiedCanvas.undo")} (Ctrl+Z)`,icon:a.jsx(Yv,{}),onClick:o,isDisabled:!n})}const Zne=ve([Mo,en,Xn],(e,t,n)=>{const{isProcessing:r}=e,{tool:o,shouldCropToBoundingBoxOnSave:s,layer:i,isMaskEnabled:u}=t;return{isProcessing:r,isStaging:n,isMaskEnabled:u,tool:o,layer:i,shouldCropToBoundingBoxOnSave:s}},{memoizeOptions:{resultEqualityCheck:Qt}}),ere=()=>{const e=te(),{isProcessing:t,isStaging:n,isMaskEnabled:r,layer:o,tool:s}=L(Zne),i=ha(),{t:u}=fe(),{isClipboardAPIAvailable:d}=b1(),{openUploader:p}=fh();Ke(["v"],()=>{h()},{enabled:()=>!n,preventDefault:!0},[]),Ke(["r"],()=>{v()},{enabled:()=>!0,preventDefault:!0},[i]),Ke(["shift+m"],()=>{S()},{enabled:()=>!n,preventDefault:!0},[i,t]),Ke(["shift+s"],()=>{w()},{enabled:()=>!n,preventDefault:!0},[i,t]),Ke(["meta+c","ctrl+c"],()=>{C()},{enabled:()=>!n&&d,preventDefault:!0},[i,t,d]),Ke(["shift+d"],()=>{_()},{enabled:()=>!n,preventDefault:!0},[i,t]);const h=()=>e(Hs("move")),g=wI(()=>v(!1),()=>v(!0)),v=(j=!1)=>{const E=ha();if(!E)return;const I=E.getClientRect({skipTransform:!0});e(g3({contentRect:I,shouldScaleTo1:j}))},b=()=>{e(S3()),e(Kp())},S=()=>{e(v3())},w=()=>{e(y3())},C=()=>{d&&e(b3())},_=()=>{e(x3())},k=j=>{const E=j;e(Rf(E)),E==="mask"&&!r&&e(Su(!0))};return a.jsxs(F,{sx:{alignItems:"center",gap:2,flexWrap:"wrap"},children:[a.jsx(ze,{w:24,children:a.jsx(Mr,{tooltip:`${u("unifiedCanvas.layer")} (Q)`,value:o,data:w3,onChange:k,disabled:n})}),a.jsx(Gne,{}),a.jsx(Xne,{}),a.jsxs(Yn,{isAttached:!0,children:[a.jsx(je,{"aria-label":`${u("unifiedCanvas.move")} (V)`,tooltip:`${u("unifiedCanvas.move")} (V)`,icon:a.jsx(M5,{}),isChecked:s==="move"||n,onClick:h}),a.jsx(je,{"aria-label":`${u("unifiedCanvas.resetView")} (R)`,tooltip:`${u("unifiedCanvas.resetView")} (R)`,icon:a.jsx(D5,{}),onClick:g})]}),a.jsxs(Yn,{isAttached:!0,children:[a.jsx(je,{"aria-label":`${u("unifiedCanvas.mergeVisible")} (Shift+M)`,tooltip:`${u("unifiedCanvas.mergeVisible")} (Shift+M)`,icon:a.jsx(qv,{}),onClick:S,isDisabled:n}),a.jsx(je,{"aria-label":`${u("unifiedCanvas.saveToGallery")} (Shift+S)`,tooltip:`${u("unifiedCanvas.saveToGallery")} (Shift+S)`,icon:a.jsx(ph,{}),onClick:w,isDisabled:n}),d&&a.jsx(je,{"aria-label":`${u("unifiedCanvas.copyToClipboard")} (Cmd/Ctrl+C)`,tooltip:`${u("unifiedCanvas.copyToClipboard")} (Cmd/Ctrl+C)`,icon:a.jsx(rc,{}),onClick:C,isDisabled:n}),a.jsx(je,{"aria-label":`${u("unifiedCanvas.downloadAsImage")} (Shift+D)`,tooltip:`${u("unifiedCanvas.downloadAsImage")} (Shift+D)`,icon:a.jsx(Gv,{}),onClick:_,isDisabled:n})]}),a.jsxs(Yn,{isAttached:!0,children:[a.jsx(_I,{}),a.jsx(SI,{})]}),a.jsxs(Yn,{isAttached:!0,children:[a.jsx(je,{"aria-label":`${u("common.upload")}`,tooltip:`${u("common.upload")}`,icon:a.jsx(Au,{}),onClick:p,isDisabled:n}),a.jsx(je,{"aria-label":`${u("unifiedCanvas.clearCanvas")}`,tooltip:`${u("unifiedCanvas.clearCanvas")}`,icon:a.jsx(yo,{}),onClick:b,colorScheme:"error",isDisabled:n})]}),a.jsx(Yn,{isAttached:!0,children:a.jsx(Yne,{})})]})};function tre(){const e=te(),t=L(o=>o.canvas.brushSize),{t:n}=fe(),r=L(Xn);return Ke(["BracketLeft"],()=>{e(_l(Math.max(t-5,5)))},{enabled:()=>!r,preventDefault:!0},[t]),Ke(["BracketRight"],()=>{e(_l(Math.min(t+5,500)))},{enabled:()=>!r,preventDefault:!0},[t]),a.jsx(St,{label:n("unifiedCanvas.brushSize"),value:t,withInput:!0,onChange:o=>e(_l(o)),sliderNumberInputProps:{max:500},isCompact:!0})}const nre=ve([en,Xn],(e,t)=>{const{brushColor:n,maskColor:r,layer:o}=e;return{brushColor:n,maskColor:r,layer:o,isStaging:t}},{memoizeOptions:{resultEqualityCheck:Qt}});function rre(){const e=te(),{brushColor:t,maskColor:n,layer:r,isStaging:o}=L(nre),s=()=>{if(r==="base")return`rgba(${t.r},${t.g},${t.b},${t.a})`;if(r==="mask")return`rgba(${n.r},${n.g},${n.b},${n.a})`};return Ke(["shift+BracketLeft"],()=>{e(kl({...t,a:Vs(t.a-.05,.05,1)}))},{enabled:()=>!o,preventDefault:!0},[t]),Ke(["shift+BracketRight"],()=>{e(kl({...t,a:Vs(t.a+.05,.05,1)}))},{enabled:()=>!o,preventDefault:!0},[t]),a.jsx(zi,{triggerComponent:a.jsx(ze,{sx:{width:7,height:7,minWidth:7,minHeight:7,borderRadius:"full",bg:s(),cursor:"pointer"}}),children:a.jsxs(F,{minWidth:60,direction:"column",gap:4,width:"100%",children:[r==="base"&&a.jsx(Wp,{sx:{width:"100%",paddingTop:2,paddingBottom:2},pickerColor:t,onChange:i=>e(kl(i))}),r==="mask"&&a.jsx(Wp,{sx:{width:"100%",paddingTop:2,paddingBottom:2},pickerColor:n,onChange:i=>e(s3(i))})]})})}function kI(){return a.jsxs(F,{columnGap:4,alignItems:"center",children:[a.jsx(tre,{}),a.jsx(rre,{})]})}function ore(){const e=te(),t=L(r=>r.canvas.shouldRestrictStrokesToBox),{t:n}=fe();return a.jsx(Bn,{label:n("unifiedCanvas.betaLimitToBox"),isChecked:t,onChange:r=>e(d3(r.target.checked))})}function sre(){return a.jsxs(F,{gap:4,alignItems:"center",children:[a.jsx(kI,{}),a.jsx(ore,{})]})}function are(){const e=te(),{t}=fe(),n=()=>e(mv());return a.jsx(Zt,{size:"sm",leftIcon:a.jsx(yo,{}),onClick:n,tooltip:`${t("unifiedCanvas.clearMask")} (Shift+C)`,children:t("unifiedCanvas.betaClear")})}function ire(){const e=L(o=>o.canvas.isMaskEnabled),t=te(),{t:n}=fe(),r=()=>t(Su(!e));return a.jsx(Bn,{label:`${n("unifiedCanvas.enableMask")} (H)`,isChecked:e,onChange:r})}function lre(){const e=te(),{t}=fe(),n=L(r=>r.canvas.shouldPreserveMaskedArea);return a.jsx(Bn,{label:t("unifiedCanvas.betaPreserveMasked"),isChecked:n,onChange:r=>e(o3(r.target.checked))})}function cre(){return a.jsxs(F,{gap:4,alignItems:"center",children:[a.jsx(kI,{}),a.jsx(ire,{}),a.jsx(lre,{}),a.jsx(are,{})]})}function ure(){const e=L(r=>r.canvas.shouldDarkenOutsideBoundingBox),t=te(),{t:n}=fe();return a.jsx(Bn,{label:n("unifiedCanvas.betaDarkenOutside"),isChecked:e,onChange:r=>t(l3(r.target.checked))})}function dre(){const e=L(r=>r.canvas.shouldShowGrid),t=te(),{t:n}=fe();return a.jsx(Bn,{label:n("unifiedCanvas.showGrid"),isChecked:e,onChange:r=>t(i3(r.target.checked))})}function fre(){const e=L(o=>o.canvas.shouldSnapToGrid),t=te(),{t:n}=fe(),r=o=>t(eu(o.target.checked));return a.jsx(Bn,{label:`${n("unifiedCanvas.snapToGrid")} (N)`,isChecked:e,onChange:r})}function pre(){return a.jsxs(F,{alignItems:"center",gap:4,children:[a.jsx(dre,{}),a.jsx(fre,{}),a.jsx(ure,{})]})}const hre=ve([en],e=>{const{tool:t,layer:n}=e;return{tool:t,layer:n}},{memoizeOptions:{resultEqualityCheck:Qt}});function mre(){const{tool:e,layer:t}=L(hre);return a.jsxs(F,{height:8,minHeight:8,maxHeight:8,alignItems:"center",children:[t=="base"&&["brush","eraser","colorPicker"].includes(e)&&a.jsx(sre,{}),t=="mask"&&["brush","eraser","colorPicker"].includes(e)&&a.jsx(cre,{}),e=="move"&&a.jsx(pre,{})]})}const gre=ve([en],e=>{const{shouldAutoSave:t,shouldCropToBoundingBoxOnSave:n,shouldShowCanvasDebugInfo:r,shouldShowIntermediates:o,shouldAntialias:s}=e;return{shouldAutoSave:t,shouldCropToBoundingBoxOnSave:n,shouldShowCanvasDebugInfo:r,shouldShowIntermediates:o,shouldAntialias:s}},{memoizeOptions:{resultEqualityCheck:Qt}}),vre=()=>{const e=te(),{t}=fe(),{shouldAutoSave:n,shouldCropToBoundingBoxOnSave:r,shouldShowCanvasDebugInfo:o,shouldShowIntermediates:s,shouldAntialias:i}=L(gre);return a.jsx(zi,{isLazy:!1,triggerComponent:a.jsx(je,{tooltip:t("unifiedCanvas.canvasSettings"),tooltipProps:{placement:"bottom"},"aria-label":t("unifiedCanvas.canvasSettings"),icon:a.jsx(Qv,{})}),children:a.jsxs(F,{direction:"column",gap:2,children:[a.jsx(Bn,{label:t("unifiedCanvas.showIntermediates"),isChecked:s,onChange:u=>e(a3(u.target.checked))}),a.jsx(Bn,{label:t("unifiedCanvas.autoSaveToGallery"),isChecked:n,onChange:u=>e(c3(u.target.checked))}),a.jsx(Bn,{label:t("unifiedCanvas.saveBoxRegionOnly"),isChecked:r,onChange:u=>e(u3(u.target.checked))}),a.jsx(Bn,{label:t("unifiedCanvas.showCanvasDebugInfo"),isChecked:o,onChange:u=>e(f3(u.target.checked))}),a.jsx(Bn,{label:t("unifiedCanvas.antialiasing"),isChecked:i,onChange:u=>e(p3(u.target.checked))}),a.jsx(CI,{})]})})};function yre(){const e=L(Xn),t=ha(),{isClipboardAPIAvailable:n}=b1(),r=L(u=>u.system.isProcessing),o=te(),{t:s}=fe();Ke(["meta+c","ctrl+c"],()=>{i()},{enabled:()=>!e&&n,preventDefault:!0},[t,r,n]);const i=f.useCallback(()=>{n&&o(b3())},[o,n]);return n?a.jsx(je,{"aria-label":`${s("unifiedCanvas.copyToClipboard")} (Cmd/Ctrl+C)`,tooltip:`${s("unifiedCanvas.copyToClipboard")} (Cmd/Ctrl+C)`,icon:a.jsx(rc,{}),onClick:i,isDisabled:e}):null}function bre(){const e=te(),{t}=fe(),n=ha(),r=L(Xn);Ke(["shift+d"],()=>{o()},{enabled:()=>!r,preventDefault:!0},[n]);const o=()=>{e(x3())};return a.jsx(je,{"aria-label":`${t("unifiedCanvas.downloadAsImage")} (Shift+D)`,tooltip:`${t("unifiedCanvas.downloadAsImage")} (Shift+D)`,icon:a.jsx(Gv,{}),onClick:o,isDisabled:r})}function xre(){const e=L(Xn),{openUploader:t}=fh(),{t:n}=fe();return a.jsx(je,{"aria-label":n("common.upload"),tooltip:n("common.upload"),icon:a.jsx(Au,{}),onClick:t,isDisabled:e})}const wre=ve([en,Xn],(e,t)=>{const{layer:n,isMaskEnabled:r}=e;return{layer:n,isMaskEnabled:r,isStaging:t}},{memoizeOptions:{resultEqualityCheck:Qt}});function Sre(){const e=te(),{t}=fe(),{layer:n,isMaskEnabled:r,isStaging:o}=L(wre),s=()=>{e(Rf(n==="mask"?"base":"mask"))};Ke(["q"],()=>{s()},{enabled:()=>!o,preventDefault:!0},[n]);const i=u=>{const d=u;e(Rf(d)),d==="mask"&&!r&&e(Su(!0))};return a.jsx(Do,{tooltip:`${t("unifiedCanvas.layer")} (Q)`,"aria-label":`${t("unifiedCanvas.layer")} (Q)`,value:n,data:w3,onChange:i,disabled:o,w:"full"})}function Cre(){const e=te(),{t}=fe(),n=ha(),r=L(Xn),o=L(i=>i.system.isProcessing);Ke(["shift+m"],()=>{s()},{enabled:()=>!r,preventDefault:!0},[n,o]);const s=()=>{e(v3())};return a.jsx(je,{"aria-label":`${t("unifiedCanvas.mergeVisible")} (Shift+M)`,tooltip:`${t("unifiedCanvas.mergeVisible")} (Shift+M)`,icon:a.jsx(qv,{}),onClick:s,isDisabled:r})}function _re(){const e=L(s=>s.canvas.tool),t=L(Xn),n=te(),{t:r}=fe();Ke(["v"],()=>{o()},{enabled:()=>!t,preventDefault:!0},[]);const o=()=>n(Hs("move"));return a.jsx(je,{"aria-label":`${r("unifiedCanvas.move")} (V)`,tooltip:`${r("unifiedCanvas.move")} (V)`,icon:a.jsx(M5,{}),isChecked:e==="move"||t,onClick:o})}function kre(){const e=L(s=>s.ui.shouldPinParametersPanel),t=L(s=>s.ui.shouldShowParametersPanel),n=te(),{t:r}=fe(),o=()=>{n(gv(!0)),e&&n(vo())};return!e||!t?a.jsxs(F,{flexDirection:"column",gap:2,children:[a.jsx(je,{tooltip:`${r("parameters.showOptionsPanel")} (O)`,tooltipProps:{placement:"top"},"aria-label":r("parameters.showOptionsPanel"),onClick:o,children:a.jsx(Kv,{})}),a.jsx(F,{children:a.jsx(ey,{iconButton:!0})}),a.jsx(F,{children:a.jsx(Dh,{width:"100%",height:"40px",btnGroupWidth:"100%"})})]}):null}function Pre(){const e=te(),{t}=fe(),n=L(Xn),r=()=>{e(S3()),e(Kp())};return a.jsx(je,{"aria-label":t("unifiedCanvas.clearCanvas"),tooltip:t("unifiedCanvas.clearCanvas"),icon:a.jsx(yo,{}),onClick:r,isDisabled:n,colorScheme:"error"})}function jre(){const e=ha(),t=te(),{t:n}=fe();Ke(["r"],()=>{o()},{enabled:()=>!0,preventDefault:!0},[e]);const r=wI(()=>o(!1),()=>o(!0)),o=(s=!1)=>{const i=ha();if(!i)return;const u=i.getClientRect({skipTransform:!0});t(g3({contentRect:u,shouldScaleTo1:s}))};return a.jsx(je,{"aria-label":`${n("unifiedCanvas.resetView")} (R)`,tooltip:`${n("unifiedCanvas.resetView")} (R)`,icon:a.jsx(D5,{}),onClick:r})}function Ire(){const e=L(Xn),t=ha(),n=L(i=>i.system.isProcessing),r=te(),{t:o}=fe();Ke(["shift+s"],()=>{s()},{enabled:()=>!e,preventDefault:!0},[t,n]);const s=()=>{r(y3())};return a.jsx(je,{"aria-label":`${o("unifiedCanvas.saveToGallery")} (Shift+S)`,tooltip:`${o("unifiedCanvas.saveToGallery")} (Shift+S)`,icon:a.jsx(ph,{}),onClick:s,isDisabled:e})}const Ere=ve([en,Xn,Mo],(e,t,n)=>{const{isProcessing:r}=n,{tool:o}=e;return{tool:o,isStaging:t,isProcessing:r}},{memoizeOptions:{resultEqualityCheck:Qt}}),Ore=()=>{const e=te(),{t}=fe(),{tool:n,isStaging:r}=L(Ere);Ke(["b"],()=>{o()},{enabled:()=>!r,preventDefault:!0},[]),Ke(["e"],()=>{s()},{enabled:()=>!r,preventDefault:!0},[n]),Ke(["c"],()=>{i()},{enabled:()=>!r,preventDefault:!0},[n]),Ke(["shift+f"],()=>{u()},{enabled:()=>!r,preventDefault:!0}),Ke(["delete","backspace"],()=>{d()},{enabled:()=>!r,preventDefault:!0});const o=()=>e(Hs("brush")),s=()=>e(Hs("eraser")),i=()=>e(Hs("colorPicker")),u=()=>e(h3()),d=()=>e(m3());return a.jsxs(F,{flexDirection:"column",gap:2,children:[a.jsxs(Yn,{children:[a.jsx(je,{"aria-label":`${t("unifiedCanvas.brush")} (B)`,tooltip:`${t("unifiedCanvas.brush")} (B)`,icon:a.jsx(z5,{}),isChecked:n==="brush"&&!r,onClick:o,isDisabled:r}),a.jsx(je,{"aria-label":`${t("unifiedCanvas.eraser")} (E)`,tooltip:`${t("unifiedCanvas.eraser")} (B)`,icon:a.jsx(T5,{}),isChecked:n==="eraser"&&!r,isDisabled:r,onClick:s})]}),a.jsxs(Yn,{children:[a.jsx(je,{"aria-label":`${t("unifiedCanvas.fillBoundingBox")} (Shift+F)`,tooltip:`${t("unifiedCanvas.fillBoundingBox")} (Shift+F)`,icon:a.jsx(N5,{}),isDisabled:r,onClick:u}),a.jsx(je,{"aria-label":`${t("unifiedCanvas.eraseBoundingBox")} (Del/Backspace)`,tooltip:`${t("unifiedCanvas.eraseBoundingBox")} (Del/Backspace)`,icon:a.jsx(Tu,{style:{transform:"rotate(45deg)"}}),isDisabled:r,onClick:d})]}),a.jsx(je,{"aria-label":`${t("unifiedCanvas.colorPicker")} (C)`,tooltip:`${t("unifiedCanvas.colorPicker")} (C)`,icon:a.jsx(A5,{}),isChecked:n==="colorPicker"&&!r,isDisabled:r,onClick:i,width:"max-content"})]})},Mre=()=>a.jsxs(F,{flexDirection:"column",rowGap:2,width:"min-content",children:[a.jsx(Sre,{}),a.jsx(Ore,{}),a.jsxs(F,{gap:2,children:[a.jsx(_re,{}),a.jsx(jre,{})]}),a.jsxs(F,{columnGap:2,children:[a.jsx(Cre,{}),a.jsx(Ire,{})]}),a.jsxs(F,{columnGap:2,children:[a.jsx(yre,{}),a.jsx(bre,{})]}),a.jsxs(F,{gap:2,children:[a.jsx(_I,{}),a.jsx(SI,{})]}),a.jsxs(F,{gap:2,children:[a.jsx(xre,{}),a.jsx(Pre,{})]}),a.jsx(vre,{}),a.jsx(kre,{})]}),Rre=ve([en,Jr],(e,t)=>{const{doesCanvasNeedScaling:n}=e,{shouldUseCanvasBetaLayout:r}=t;return{doesCanvasNeedScaling:n,shouldUseCanvasBetaLayout:r}},it),Bg={id:"canvas-intial-image",actionType:"SET_CANVAS_INITIAL_IMAGE"},Dre=()=>{const e=te(),{doesCanvasNeedScaling:t,shouldUseCanvasBetaLayout:n}=L(Rre),{isOver:r,setNodeRef:o,active:s}=sv({id:"unifiedCanvas",data:Bg});return f.useLayoutEffect(()=>{const i=()=>{e(vo())};return window.addEventListener("resize",i),()=>window.removeEventListener("resize",i)},[e]),n?a.jsx(ze,{layerStyle:"first",ref:o,tabIndex:0,sx:{w:"full",h:"full",p:4,borderRadius:"base"},children:a.jsxs(F,{sx:{w:"full",h:"full",gap:4},children:[a.jsx(Mre,{}),a.jsxs(F,{sx:{flexDir:"column",w:"full",h:"full",gap:4,position:"relative"},children:[a.jsx(mre,{}),a.jsxs(ze,{sx:{w:"full",h:"full",position:"relative"},children:[t?a.jsx(o4,{}):a.jsx(r4,{}),Cf(Bg,s)&&a.jsx(Kf,{isOver:r,label:"Set Canvas Initial Image"})]})]})]})}):a.jsx(ze,{ref:o,tabIndex:-1,sx:{layerStyle:"first",w:"full",h:"full",p:4,borderRadius:"base"},children:a.jsxs(F,{sx:{flexDirection:"column",alignItems:"center",gap:4,w:"full",h:"full"},children:[a.jsx(ere,{}),a.jsx(F,{sx:{flexDirection:"column",alignItems:"center",justifyContent:"center",gap:4,w:"full",h:"full"},children:a.jsxs(ze,{sx:{w:"full",h:"full",position:"relative"},children:[t?a.jsx(o4,{}):a.jsx(r4,{}),Cf(Bg,s)&&a.jsx(Kf,{isOver:r,label:"Set Canvas Initial Image"})]})})]})})},Tre=f.memo(Dre),Are=ve([Rt],({generation:e})=>{const{infillMethod:t}=e;return{infillMethod:t}},it),Nre=()=>{const e=te(),{infillMethod:t}=L(Are),{data:n,isLoading:r}=OO(),o=n==null?void 0:n.infill_methods,{t:s}=fe(),i=f.useCallback(u=>{e(MO(u))},[e]);return a.jsx(Do,{disabled:(o==null?void 0:o.length)===0,placeholder:r?"Loading...":void 0,label:s("parameters.infillMethod"),value:t,data:o??[],onChange:i})},$re=f.memo(Nre),zre=ve([Jo],e=>{const{tileSize:t,infillMethod:n}=e;return{tileSize:t,infillMethod:n}},it),Lre=()=>{const e=te(),{tileSize:t,infillMethod:n}=L(zre),{t:r}=fe(),o=f.useCallback(i=>{e(xx(i))},[e]),s=f.useCallback(()=>{e(xx(32))},[e]);return a.jsx(St,{isDisabled:n!=="tile",label:r("parameters.tileSize"),min:16,max:64,sliderNumberInputProps:{max:256},value:t,onChange:o,withInput:!0,withSliderMarks:!0,withReset:!0,handleReset:s})},Bre=f.memo(Lre),Fre=ve([en],e=>{const{boundingBoxScaleMethod:t}=e;return{boundingBoxScale:t}},it),Hre=()=>{const e=te(),{boundingBoxScale:t}=L(Fre),{t:n}=fe(),r=o=>{e(DO(o))};return a.jsx(Mr,{label:n("parameters.scaleBeforeProcessing"),data:RO,value:t,onChange:r})},Wre=f.memo(Hre),Vre=ve([Jo,Mo,en],(e,t,n)=>{const{scaledBoundingBoxDimensions:r,boundingBoxScaleMethod:o}=n;return{scaledBoundingBoxDimensions:r,isManual:o==="manual"}},it),Ure=()=>{const e=te(),{isManual:t,scaledBoundingBoxDimensions:n}=L(Vre),{t:r}=fe(),o=i=>{e(Df({...n,height:Math.floor(i)}))},s=()=>{e(Df({...n,height:Math.floor(512)}))};return a.jsx(St,{isDisabled:!t,label:r("parameters.scaledHeight"),min:64,max:1024,step:64,value:n.height,onChange:o,sliderNumberInputProps:{max:4096},withSliderMarks:!0,withInput:!0,withReset:!0,handleReset:s})},Gre=f.memo(Ure),qre=ve([en],e=>{const{boundingBoxScaleMethod:t,scaledBoundingBoxDimensions:n}=e;return{scaledBoundingBoxDimensions:n,isManual:t==="manual"}},it),Kre=()=>{const e=te(),{isManual:t,scaledBoundingBoxDimensions:n}=L(qre),{t:r}=fe(),o=i=>{e(Df({...n,width:Math.floor(i)}))},s=()=>{e(Df({...n,width:Math.floor(512)}))};return a.jsx(St,{isDisabled:!t,label:r("parameters.scaledWidth"),min:64,max:1024,step:64,value:n.width,onChange:o,sliderNumberInputProps:{max:4096},withSliderMarks:!0,withInput:!0,withReset:!0,handleReset:s})},Yre=f.memo(Kre),Qre=()=>{const{t:e}=fe();return a.jsx(To,{label:e("parameters.infillScalingHeader"),children:a.jsxs(F,{sx:{gap:2,flexDirection:"column"},children:[a.jsx($re,{}),a.jsx(Bre,{}),a.jsx(Wre,{}),a.jsx(Yre,{}),a.jsx(Gre,{})]})})},Xre=f.memo(Qre);function Jre(){const e=te(),t=L(r=>r.generation.seamBlur),{t:n}=fe();return a.jsx(St,{label:n("parameters.seamBlur"),min:0,max:64,sliderNumberInputProps:{max:512},value:t,onChange:r=>{e(wx(r))},withInput:!0,withSliderMarks:!0,withReset:!0,handleReset:()=>{e(wx(16))}})}function Zre(){const e=te(),{t}=fe(),n=L(r=>r.generation.seamSize);return a.jsx(St,{label:t("parameters.seamSize"),min:1,max:256,sliderNumberInputProps:{max:512},value:n,onChange:r=>{e(Sx(r))},withInput:!0,withSliderMarks:!0,withReset:!0,handleReset:()=>e(Sx(96))})}function eoe(){const{t:e}=fe(),t=L(r=>r.generation.seamSteps),n=te();return a.jsx(St,{label:e("parameters.seamSteps"),min:1,max:100,sliderNumberInputProps:{max:999},value:t,onChange:r=>{n(Cx(r))},withInput:!0,withSliderMarks:!0,withReset:!0,handleReset:()=>{n(Cx(30))}})}function toe(){const e=te(),{t}=fe(),n=L(r=>r.generation.seamStrength);return a.jsx(St,{label:t("parameters.seamStrength"),min:.01,max:.99,step:.01,value:n,onChange:r=>{e(_x(r))},withInput:!0,withSliderMarks:!0,withReset:!0,handleReset:()=>{e(_x(.7))}})}const noe=()=>{const{t:e}=fe();return a.jsxs(To,{label:e("parameters.seamCorrectionHeader"),children:[a.jsx(Zre,{}),a.jsx(Jre,{}),a.jsx(toe,{}),a.jsx(eoe,{})]})},roe=f.memo(noe),ooe=ve([en,Xn,Jr],(e,t,n)=>{const{boundingBoxDimensions:r}=e,{aspectRatio:o}=n;return{boundingBoxDimensions:r,isStaging:t,aspectRatio:o}},it),soe=()=>{const e=te(),{boundingBoxDimensions:t,isStaging:n,aspectRatio:r}=L(ooe),{t:o}=fe(),s=u=>{if(e(Bs({...t,height:Math.floor(u)})),r){const d=cs(u*r,64);e(Bs({width:d,height:Math.floor(u)}))}},i=()=>{if(e(Bs({...t,height:Math.floor(512)})),r){const u=cs(512*r,64);e(Bs({width:u,height:Math.floor(512)}))}};return a.jsx(St,{label:o("parameters.boundingBoxHeight"),min:64,max:1024,step:64,value:t.height,onChange:s,isDisabled:n,sliderNumberInputProps:{max:4096},withSliderMarks:!0,withInput:!0,withReset:!0,handleReset:i})},aoe=f.memo(soe),ioe=ve([en,Xn,Jr],(e,t,n)=>{const{boundingBoxDimensions:r}=e,{aspectRatio:o}=n;return{boundingBoxDimensions:r,isStaging:t,aspectRatio:o}},it),loe=()=>{const e=te(),{boundingBoxDimensions:t,isStaging:n,aspectRatio:r}=L(ioe),{t:o}=fe(),s=u=>{if(e(Bs({...t,width:Math.floor(u)})),r){const d=cs(u/r,64);e(Bs({width:Math.floor(u),height:d}))}},i=()=>{if(e(Bs({...t,width:Math.floor(512)})),r){const u=cs(512/r,64);e(Bs({width:Math.floor(512),height:u}))}};return a.jsx(St,{label:o("parameters.boundingBoxWidth"),min:64,max:1024,step:64,value:t.width,onChange:s,isDisabled:n,sliderNumberInputProps:{max:4096},withSliderMarks:!0,withInput:!0,withReset:!0,handleReset:i})},coe=f.memo(loe);function s4(){const e=te(),{t}=fe();return a.jsxs(F,{sx:{gap:2,p:4,borderRadius:4,flexDirection:"column",w:"full",bg:"base.150",_dark:{bg:"base.750"}},children:[a.jsxs(F,{alignItems:"center",gap:2,children:[a.jsx(nt,{sx:{fontSize:"sm",width:"full",color:"base.700",_dark:{color:"base.300"}},children:t("parameters.aspectRatio")}),a.jsx($i,{}),a.jsx(Uj,{}),a.jsx(je,{tooltip:t("ui.swapSizes"),"aria-label":t("ui.swapSizes"),size:"sm",icon:a.jsx(V_,{}),fontSize:20,onClick:()=>e(TO())})]}),a.jsx(coe,{}),a.jsx(aoe,{})]})}const uoe=ve(Rt,({ui:e,generation:t})=>{const{shouldUseSliders:n}=e,{shouldRandomizeSeed:r}=t;return{shouldUseSliders:n,activeLabel:r?void 0:"Manual Seed"}},it),doe=()=>{const{shouldUseSliders:e,activeLabel:t}=L(uoe);return a.jsx(To,{label:"General",activeLabel:t,defaultIsOpen:!0,children:a.jsxs(F,{sx:{flexDirection:"column",gap:3},children:[e?a.jsxs(a.Fragment,{children:[a.jsx(Wl,{}),a.jsx(Ul,{}),a.jsx(Hl,{}),a.jsx(Vl,{}),a.jsx(ze,{pt:2,children:a.jsx(Gl,{})}),a.jsx(s4,{})]}):a.jsxs(a.Fragment,{children:[a.jsxs(F,{gap:3,children:[a.jsx(Wl,{}),a.jsx(Ul,{}),a.jsx(Hl,{})]}),a.jsx(Vl,{}),a.jsx(ze,{pt:2,children:a.jsx(Gl,{})}),a.jsx(s4,{})]}),a.jsx(Gj,{})]})})},foe=f.memo(doe),poe=()=>a.jsxs(a.Fragment,{children:[a.jsx(X1,{}),a.jsx(K1,{}),a.jsx(ty,{}),a.jsx(foe,{}),a.jsx(G1,{}),a.jsx(V1,{}),a.jsx(W1,{}),a.jsx(Z1,{}),a.jsx(J1,{}),a.jsx(roe,{}),a.jsx(Xre,{}),a.jsx(U1,{})]}),PI=f.memo(poe),hoe=()=>a.jsxs(F,{sx:{gap:4,w:"full",h:"full"},children:[a.jsx(H1,{children:a.jsx(PI,{})}),a.jsx(Tre,{})]}),moe=f.memo(hoe),goe=[{id:"txt2img",translationKey:"common.txt2img",icon:a.jsx(mo,{as:v$,sx:{boxSize:6,pointerEvents:"none"}}),content:a.jsx(Xee,{})},{id:"img2img",translationKey:"common.img2img",icon:a.jsx(mo,{as:oc,sx:{boxSize:6,pointerEvents:"none"}}),content:a.jsx(tJ,{})},{id:"unifiedCanvas",translationKey:"common.unifiedCanvas",icon:a.jsx(mo,{as:QB,sx:{boxSize:6,pointerEvents:"none"}}),content:a.jsx(moe,{})},{id:"nodes",translationKey:"common.nodes",icon:a.jsx(mo,{as:YB,sx:{boxSize:6,pointerEvents:"none"}}),content:a.jsx(Uee,{})},{id:"modelManager",translationKey:"modelManager.modelManager",icon:a.jsx(mo,{as:l$,sx:{boxSize:6,pointerEvents:"none"}}),content:a.jsx(QJ,{})}],voe=ve(Wi,e=>{const{disabledTabs:t}=e;return goe.filter(n=>!t.includes(n.id))},{memoizeOptions:{resultEqualityCheck:Qt}}),yoe=300,Fg=20,jI=["modelManager"],boe=()=>{const e=L(AO),t=L(ur),n=L(voe),{shouldPinGallery:r,shouldPinParametersPanel:o,shouldShowGallery:s}=L(S=>S.ui),{t:i}=fe(),u=te();Ke("f",()=>{u(NO()),(r||o)&&u(vo())},[r,o]);const d=f.useCallback(()=>{t==="unifiedCanvas"&&u(vo())},[u,t]),p=f.useCallback(S=>{S.target instanceof HTMLElement&&S.target.blur()},[]),h=f.useMemo(()=>n.map(S=>a.jsx(_n,{hasArrow:!0,label:String(i(S.translationKey)),placement:"end",children:a.jsxs(dh,{onClick:p,children:[a.jsx(O3,{children:String(i(S.translationKey))}),S.icon]})},S.id)),[n,i,p]),g=f.useMemo(()=>n.map(S=>a.jsx(ch,{children:S.content},S.id)),[n]),{ref:v,minSizePct:b}=VK(yoe,Fg,"app");return a.jsxs(ih,{defaultIndex:e,index:e,onChange:S=>{u(gl(S))},sx:{flexGrow:1,gap:4},isLazy:!0,children:[a.jsxs(lh,{sx:{pt:2,gap:4,flexDir:"column"},children:[h,a.jsx($i,{}),a.jsx(PK,{})]}),a.jsxs(B1,{id:"app",autoSaveId:"app",direction:"horizontal",style:{height:"100%",width:"100%"},children:[a.jsx(fu,{id:"main",children:a.jsx(uh,{style:{height:"100%",width:"100%"},children:g})}),r&&s&&!jI.includes(t)&&a.jsxs(a.Fragment,{children:[a.jsx(Mj,{}),a.jsx(fu,{ref:v,onResize:d,id:"gallery",order:3,defaultSize:b>Fg?b:Fg,minSize:b,maxSize:50,children:a.jsx(H_,{})})]})]})]})},xoe=f.memo(boe),woe=ve([ur,Jr],(e,t)=>{const{shouldPinGallery:n,shouldShowGallery:r}=t;return{shouldPinGallery:n,shouldShowGalleryButton:jI.includes(e)?!1:!r}},{memoizeOptions:{resultEqualityCheck:Qt}}),Soe=()=>{const{t:e}=fe(),{shouldPinGallery:t,shouldShowGalleryButton:n}=L(woe),r=te(),o=()=>{r(Kg(!0)),t&&r(vo())};return n?a.jsx(je,{tooltip:"Show Gallery (G)",tooltipProps:{placement:"top"},"aria-label":e("accessibility.showGallery"),onClick:o,sx:{pos:"absolute",top:"50%",transform:"translate(0, -50%)",p:0,insetInlineEnd:0,px:3,h:48,w:8,borderStartEndRadius:0,borderEndEndRadius:0,shadow:"2xl"},children:a.jsx(XB,{})}):null},Coe=f.memo(Soe),Hg={borderStartStartRadius:0,borderEndStartRadius:0,shadow:"2xl"},_oe=ve([Jr,ur],(e,t)=>{const{shouldPinParametersPanel:n,shouldUseCanvasBetaLayout:r,shouldShowParametersPanel:o}=e,s=r&&t==="unifiedCanvas",i=!s&&(!n||!o),u=!s&&!o&&["txt2img","img2img","unifiedCanvas"].includes(t);return{shouldPinParametersPanel:n,shouldShowParametersPanelButton:u,shouldShowProcessButtons:i}},{memoizeOptions:{resultEqualityCheck:Qt}}),koe=()=>{const e=te(),{t}=fe(),{shouldShowProcessButtons:n,shouldShowParametersPanelButton:r,shouldPinParametersPanel:o}=L(_oe),s=()=>{e(gv(!0)),o&&e(vo())};return r?a.jsxs(F,{pos:"absolute",transform:"translate(0, -50%)",minW:8,top:"50%",insetInlineStart:"4.5rem",direction:"column",gap:2,children:[a.jsx(je,{tooltip:"Show Options Panel (O)",tooltipProps:{placement:"top"},"aria-label":t("accessibility.showOptionsPanel"),onClick:s,sx:Hg,children:a.jsx(Kv,{})}),n&&a.jsxs(a.Fragment,{children:[a.jsx(ey,{iconButton:!0,sx:Hg}),a.jsx(Dh,{sx:Hg})]})]}):null},Poe=f.memo(koe),joe=ve([Jr,ur],(e,t)=>{const{shouldPinParametersPanel:n,shouldShowParametersPanel:r}=e;return{activeTabName:t,shouldPinParametersPanel:n,shouldShowParametersPanel:r}},it),Ioe=()=>{const e=te(),{shouldPinParametersPanel:t,shouldShowParametersPanel:n,activeTabName:r}=L(joe),o=()=>{e(gv(!1))},s=f.useMemo(()=>r==="txt2img"?a.jsx(cI,{}):r==="img2img"?a.jsx(qj,{}):r==="unifiedCanvas"?a.jsx(PI,{}):null,[r]);return t?null:a.jsx(I5,{direction:"left",isResizable:!1,isOpen:n,onClose:o,children:a.jsxs(F,{sx:{flexDir:"column",h:"full",w:F1,gap:2,position:"relative",flexShrink:0,overflowY:"auto"},children:[a.jsxs(F,{paddingTop:1.5,paddingBottom:4,justifyContent:"space-between",alignItems:"center",children:[a.jsx(U_,{}),a.jsx(Oj,{})]}),a.jsx(F,{sx:{gap:2,flexDirection:"column",h:"full",w:"full"},children:s})]})})},Eoe=f.memo(Ioe),Ooe=e=>{const{imagesUsage:t}=e;return!t||!E4(t)?null:a.jsxs(a.Fragment,{children:[a.jsx(nt,{children:"An image from this board is currently in use in the following features:"}),a.jsxs(th,{sx:{paddingInlineStart:6},children:[t.isInitialImage&&a.jsx(Io,{children:"Image to Image"}),t.isCanvasImage&&a.jsx(Io,{children:"Unified Canvas"}),t.isControlNetImage&&a.jsx(Io,{children:"ControlNet"}),t.isNodesImage&&a.jsx(Io,{children:"Node Editor"})]}),a.jsx(nt,{children:"If you delete images from this board, those features will immediately be reset."})]})},Moe=()=>{const{t:e}=fe(),{isOpen:t,onClose:n,board:r,handleDeleteBoardImages:o,handleDeleteBoardOnly:s,imagesUsage:i}=f.useContext(C4),u=f.useRef(null);return a.jsx(Ou,{isOpen:t,leastDestructiveRef:u,onClose:n,isCentered:!0,children:a.jsx(va,{children:r&&a.jsxs(Mu,{children:[a.jsx(ga,{fontSize:"lg",fontWeight:"bold",children:"Delete Board"}),a.jsx(ya,{children:a.jsxs(F,{direction:"column",gap:3,children:[a.jsx(Ooe,{imagesUsage:i}),a.jsx(ni,{}),a.jsx(nt,{children:e("common.areYouSure")}),a.jsxs(nt,{fontWeight:"bold",children:["This board has ",r.image_count," image(s) that will be deleted."]})]})}),a.jsxs(ma,{gap:3,children:[a.jsx(Zt,{ref:u,onClick:n,children:"Cancel"}),a.jsx(Zt,{colorScheme:"warning",onClick:()=>s(r.board_id),children:"Delete Board Only"}),a.jsx(Zt,{colorScheme:"error",onClick:()=>o(r.board_id),children:"Delete Board and Images"})]})]})})})},Roe=f.memo(Moe),Doe=()=>{const{data:e,isFetching:t}=lv(),{isOpen:n,onClose:r,handleAddToBoard:o,image:s}=f.useContext(_4),[i,u]=f.useState(),d=f.useRef(null),p=e==null?void 0:e.find(h=>h.board_id===(s==null?void 0:s.board_id));return a.jsx(Ou,{isOpen:n,leastDestructiveRef:d,onClose:r,isCentered:!0,children:a.jsx(va,{children:a.jsxs(Mu,{children:[a.jsx(ga,{fontSize:"lg",fontWeight:"bold",children:p?"Move Image to Board":"Add Image to Board"}),a.jsx(ya,{children:a.jsx(ze,{children:a.jsxs(F,{direction:"column",gap:3,children:[p&&a.jsxs(nt,{children:["Moving this image from"," ",a.jsx("strong",{children:p.board_name})," to"]}),t?a.jsx(Jl,{}):a.jsx(Mr,{placeholder:"Select Board",onChange:h=>u(h),value:i,data:(e??[]).map(h=>({label:h.board_name,value:h.board_id}))})]})})}),a.jsxs(ma,{children:[a.jsx(Zt,{onClick:r,children:"Cancel"}),a.jsx(Zt,{isDisabled:!i,colorScheme:"accent",onClick:()=>{i&&o(i)},ml:3,children:p?"Move":"Add"})]})]})})})},Toe=f.memo(Doe),Aoe=ve([e=>e.hotkeys,e=>e.ui],(e,t)=>{const{shift:n}=e,{shouldPinParametersPanel:r,shouldPinGallery:o}=t;return{shift:n,shouldPinGallery:o,shouldPinParametersPanel:r}},{memoizeOptions:{resultEqualityCheck:Qt}}),Noe=()=>{const e=te(),{shift:t,shouldPinParametersPanel:n,shouldPinGallery:r}=L(Aoe),o=L(ur);return Ke("*",()=>{C5("shift")?!t&&e(Ko(!0)):t&&e(Ko(!1))},{keyup:!0,keydown:!0},[t]),Ke("o",()=>{e($O()),o==="unifiedCanvas"&&n&&e(vo())}),Ke(["shift+o"],()=>{e(zO()),o==="unifiedCanvas"&&e(vo())}),Ke("g",()=>{e(LO()),o==="unifiedCanvas"&&r&&e(vo())}),Ke(["shift+g"],()=>{e(I4()),o==="unifiedCanvas"&&e(vo())}),Ke("1",()=>{e(gl("txt2img"))}),Ke("2",()=>{e(gl("img2img"))}),Ke("3",()=>{e(gl("unifiedCanvas"))}),Ke("4",()=>{e(gl("nodes"))}),null},$oe=f.memo(Noe),zoe={},Loe=({config:e=zoe,headerComponent:t})=>{const n=L(M4),r=BO(),o=te();return f.useEffect(()=>{vr.changeLanguage(n)},[n]),f.useEffect(()=>{r.info({namespace:"App",data:e},"Received config"),o(FO(e))},[o,e,r]),f.useEffect(()=>{o(HO())},[o]),a.jsxs(a.Fragment,{children:[a.jsxs(Ei,{w:"100vw",h:"100vh",position:"relative",overflow:"hidden",children:[a.jsx(DN,{children:a.jsxs(Ei,{sx:{gap:4,p:4,gridAutoRows:"min-content auto",w:"full",h:"full"},children:[t||a.jsx(CK,{}),a.jsx(F,{sx:{gap:4,w:"full",h:"full"},children:a.jsx(xoe,{})})]})}),a.jsx(TB,{}),a.jsx(Eoe,{}),a.jsx(xf,{children:a.jsx(Poe,{})}),a.jsx(xf,{children:a.jsx(Coe,{})})]}),a.jsx(BB,{}),a.jsx(Toe,{}),a.jsx(Roe,{}),a.jsx(WO,{}),a.jsx($oe,{})]})},Uoe=f.memo(Loe);export{Uoe as default}; diff --git a/invokeai/frontend/web/dist/assets/MantineProvider-bb0be923.js b/invokeai/frontend/web/dist/assets/MantineProvider-bb0be923.js new file mode 100644 index 0000000000..8b5faf026c --- /dev/null +++ b/invokeai/frontend/web/dist/assets/MantineProvider-bb0be923.js @@ -0,0 +1 @@ +import{gl as J,W as g,gj as P,s as x,gs as K}from"./index-adc79457.js";function b(r,e){return t=>t.colorMode==="dark"?e:r}function oe(r){const{orientation:e,vertical:t,horizontal:n}=r;return e?e==="vertical"?t:n:{}}function s(r,e={}){let t=!1;function n(){if(!t){t=!0;return}throw new Error("[anatomy] .part(...) should only be called once. Did you mean to use .extend(...) ?")}function a(...d){n();for(const u of d)e[u]=c(u);return s(r,e)}function o(...d){for(const u of d)u in e||(e[u]=c(u));return s(r,e)}function i(){return Object.fromEntries(Object.entries(e).map(([u,k])=>[u,k.selector]))}function l(){return Object.fromEntries(Object.entries(e).map(([u,k])=>[u,k.className]))}function c(d){const A=`chakra-${(["container","root"].includes(d??"")?[r]:[r,d]).filter(Boolean).join("__")}`;return{className:A,selector:`.${A}`,toString:()=>d}}return{parts:a,toPart:c,extend:o,selectors:i,classnames:l,get keys(){return Object.keys(e)},__type:{}}}var ae=s("accordion").parts("root","container","button","panel").extend("icon");s("alert").parts("title","description","container").extend("icon","spinner");s("avatar").parts("label","badge","container").extend("excessLabel","group");s("breadcrumb").parts("link","item","container").extend("separator");s("button").parts();var ie=s("checkbox").parts("control","icon","container").extend("label");s("progress").parts("track","filledTrack").extend("label");s("drawer").parts("overlay","dialogContainer","dialog").extend("header","closeButton","body","footer");s("editable").parts("preview","input","textarea");s("form").parts("container","requiredIndicator","helperText");s("formError").parts("text","icon");var se=s("input").parts("addon","field","element");s("list").parts("container","item","icon");var Q=s("menu").parts("button","list","item").extend("groupTitle","command","divider"),le=s("modal").parts("overlay","dialogContainer","dialog").extend("header","closeButton","body","footer"),ce=s("numberinput").parts("root","field","stepperGroup","stepper");s("pininput").parts("field");var fe=s("popover").parts("content","header","body","footer").extend("popper","arrow","closeButton"),de=s("progress").parts("label","filledTrack","track");s("radio").parts("container","control","label");var ue=s("select").parts("field","icon"),pe=s("slider").parts("container","track","thumb","filledTrack","mark");s("stat").parts("container","label","helpText","number","icon");var be=s("switch").parts("container","track","thumb");s("table").parts("table","thead","tbody","tr","th","td","tfoot","caption");var ge=s("tabs").parts("root","tab","tablist","tabpanel","tabpanels","indicator");s("tag").parts("container","label","closeButton");s("card").parts("container","header","body","footer");const{definePartsStyle:Z,defineMultiStyleConfig:rr}=J(Q.keys),er=Z(r=>({button:{fontWeight:500,bg:b("base.300","base.500")(r),color:b("base.900","base.100")(r),_hover:{bg:b("base.400","base.600")(r),color:b("base.900","base.50")(r),fontWeight:600}},list:{zIndex:9999,color:b("base.900","base.150")(r),bg:b("base.200","base.800")(r),shadow:"dark-lg",border:"none"},item:{fontSize:"sm",bg:b("base.200","base.800")(r),_hover:{bg:b("base.300","base.700")(r)},_focus:{bg:b("base.400","base.600")(r)},svg:{opacity:.5}}})),me=rr({variants:{invokeAI:er},defaultProps:{variant:"invokeAI"}}),ye={variants:{enter:{visibility:"visible",opacity:1,scale:1,transition:{duration:.07,ease:[.4,0,.2,1]}},exit:{transitionEnd:{visibility:"hidden"},opacity:0,scale:.8,transition:{duration:.07,easings:"easeOut"}}}},tr={dark:["#C1C2C5","#A6A7AB","#909296","#5c5f66","#373A40","#2C2E33","#25262b","#1A1B1E","#141517","#101113"],gray:["#f8f9fa","#f1f3f5","#e9ecef","#dee2e6","#ced4da","#adb5bd","#868e96","#495057","#343a40","#212529"],red:["#fff5f5","#ffe3e3","#ffc9c9","#ffa8a8","#ff8787","#ff6b6b","#fa5252","#f03e3e","#e03131","#c92a2a"],pink:["#fff0f6","#ffdeeb","#fcc2d7","#faa2c1","#f783ac","#f06595","#e64980","#d6336c","#c2255c","#a61e4d"],grape:["#f8f0fc","#f3d9fa","#eebefa","#e599f7","#da77f2","#cc5de8","#be4bdb","#ae3ec9","#9c36b5","#862e9c"],violet:["#f3f0ff","#e5dbff","#d0bfff","#b197fc","#9775fa","#845ef7","#7950f2","#7048e8","#6741d9","#5f3dc4"],indigo:["#edf2ff","#dbe4ff","#bac8ff","#91a7ff","#748ffc","#5c7cfa","#4c6ef5","#4263eb","#3b5bdb","#364fc7"],blue:["#e7f5ff","#d0ebff","#a5d8ff","#74c0fc","#4dabf7","#339af0","#228be6","#1c7ed6","#1971c2","#1864ab"],cyan:["#e3fafc","#c5f6fa","#99e9f2","#66d9e8","#3bc9db","#22b8cf","#15aabf","#1098ad","#0c8599","#0b7285"],teal:["#e6fcf5","#c3fae8","#96f2d7","#63e6be","#38d9a9","#20c997","#12b886","#0ca678","#099268","#087f5b"],green:["#ebfbee","#d3f9d8","#b2f2bb","#8ce99a","#69db7c","#51cf66","#40c057","#37b24d","#2f9e44","#2b8a3e"],lime:["#f4fce3","#e9fac8","#d8f5a2","#c0eb75","#a9e34b","#94d82d","#82c91e","#74b816","#66a80f","#5c940d"],yellow:["#fff9db","#fff3bf","#ffec99","#ffe066","#ffd43b","#fcc419","#fab005","#f59f00","#f08c00","#e67700"],orange:["#fff4e6","#ffe8cc","#ffd8a8","#ffc078","#ffa94d","#ff922b","#fd7e14","#f76707","#e8590c","#d9480f"]};function nr(r){return()=>({fontFamily:r.fontFamily||"sans-serif"})}var or=Object.defineProperty,M=Object.getOwnPropertySymbols,ar=Object.prototype.hasOwnProperty,ir=Object.prototype.propertyIsEnumerable,I=(r,e,t)=>e in r?or(r,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[e]=t,R=(r,e)=>{for(var t in e||(e={}))ar.call(e,t)&&I(r,t,e[t]);if(M)for(var t of M(e))ir.call(e,t)&&I(r,t,e[t]);return r};function sr(r){return e=>({WebkitTapHighlightColor:"transparent",[e||"&:focus"]:R({},r.focusRing==="always"||r.focusRing==="auto"?r.focusRingStyles.styles(r):r.focusRingStyles.resetStyles(r)),[e?e.replace(":focus",":focus:not(:focus-visible)"):"&:focus:not(:focus-visible)"]:R({},r.focusRing==="auto"||r.focusRing==="never"?r.focusRingStyles.resetStyles(r):null)})}function _(r){return e=>typeof r.primaryShade=="number"?r.primaryShade:r.primaryShade[e||r.colorScheme]}function E(r){const e=_(r);return(t,n,a=!0,o=!0)=>{if(typeof t=="string"&&t.includes(".")){const[l,c]=t.split("."),y=parseInt(c,10);if(l in r.colors&&y>=0&&y<10)return r.colors[l][typeof n=="number"&&!o?n:y]}const i=typeof n=="number"?n:e();return t in r.colors?r.colors[t][i]:a?r.colors[r.primaryColor][i]:t}}function V(r){let e="";for(let t=1;t{const a={from:(n==null?void 0:n.from)||r.defaultGradient.from,to:(n==null?void 0:n.to)||r.defaultGradient.to,deg:(n==null?void 0:n.deg)||r.defaultGradient.deg};return`linear-gradient(${a.deg}deg, ${e(a.from,t(),!1)} 0%, ${e(a.to,t(),!1)} 100%)`}}function X(r){return e=>{if(typeof e=="number")return`${e/16}${r}`;if(typeof e=="string"){const t=e.replace("px","");if(!Number.isNaN(Number(t)))return`${Number(t)/16}${r}`}return e}}const m=X("rem"),O=X("em");function q({size:r,sizes:e,units:t}){return r in e?e[r]:typeof r=="number"?t==="em"?O(r):m(r):r||e.md}function $(r){return typeof r=="number"?r:typeof r=="string"&&r.includes("rem")?Number(r.replace("rem",""))*16:typeof r=="string"&&r.includes("em")?Number(r.replace("em",""))*16:Number(r)}function fr(r){return e=>`@media (min-width: ${O($(q({size:e,sizes:r.breakpoints})))})`}function dr(r){return e=>`@media (max-width: ${O($(q({size:e,sizes:r.breakpoints}))-1)})`}function ur(r){return/^#?([0-9A-F]{3}){1,2}$/i.test(r)}function pr(r){let e=r.replace("#","");if(e.length===3){const i=e.split("");e=[i[0],i[0],i[1],i[1],i[2],i[2]].join("")}const t=parseInt(e,16),n=t>>16&255,a=t>>8&255,o=t&255;return{r:n,g:a,b:o,a:1}}function br(r){const[e,t,n,a]=r.replace(/[^0-9,.]/g,"").split(",").map(Number);return{r:e,g:t,b:n,a:a||1}}function j(r){return ur(r)?pr(r):r.startsWith("rgb")?br(r):{r:0,g:0,b:0,a:1}}function v(r,e){if(typeof r!="string"||e>1||e<0)return"rgba(0, 0, 0, 1)";if(r.startsWith("var(--"))return r;const{r:t,g:n,b:a}=j(r);return`rgba(${t}, ${n}, ${a}, ${e})`}function gr(r=0){return{position:"absolute",top:m(r),right:m(r),left:m(r),bottom:m(r)}}function mr(r,e){if(typeof r=="string"&&r.startsWith("var(--"))return r;const{r:t,g:n,b:a,a:o}=j(r),i=1-e,l=c=>Math.round(c*i);return`rgba(${l(t)}, ${l(n)}, ${l(a)}, ${o})`}function yr(r,e){if(typeof r=="string"&&r.startsWith("var(--"))return r;const{r:t,g:n,b:a,a:o}=j(r),i=l=>Math.round(l+(255-l)*e);return`rgba(${i(t)}, ${i(n)}, ${i(a)}, ${o})`}function vr(r){return e=>{if(typeof e=="number")return m(e);const t=typeof r.defaultRadius=="number"?r.defaultRadius:r.radius[r.defaultRadius]||r.defaultRadius;return r.radius[e]||e||t}}function Sr(r,e){if(typeof r=="string"&&r.includes(".")){const[t,n]=r.split("."),a=parseInt(n,10);if(t in e.colors&&a>=0&&a<10)return{isSplittedColor:!0,key:t,shade:a}}return{isSplittedColor:!1}}function hr(r){const e=E(r),t=_(r),n=U(r);return({variant:a,color:o,gradient:i,primaryFallback:l})=>{const c=Sr(o,r);switch(a){case"light":return{border:"transparent",background:v(e(o,r.colorScheme==="dark"?8:0,l,!1),r.colorScheme==="dark"?.2:1),color:o==="dark"?r.colorScheme==="dark"?r.colors.dark[0]:r.colors.dark[9]:e(o,r.colorScheme==="dark"?2:t("light")),hover:v(e(o,r.colorScheme==="dark"?7:1,l,!1),r.colorScheme==="dark"?.25:.65)};case"subtle":return{border:"transparent",background:"transparent",color:o==="dark"?r.colorScheme==="dark"?r.colors.dark[0]:r.colors.dark[9]:e(o,r.colorScheme==="dark"?2:t("light")),hover:v(e(o,r.colorScheme==="dark"?8:0,l,!1),r.colorScheme==="dark"?.2:1)};case"outline":return{border:e(o,r.colorScheme==="dark"?5:t("light")),background:"transparent",color:e(o,r.colorScheme==="dark"?5:t("light")),hover:r.colorScheme==="dark"?v(e(o,5,l,!1),.05):v(e(o,0,l,!1),.35)};case"default":return{border:r.colorScheme==="dark"?r.colors.dark[4]:r.colors.gray[4],background:r.colorScheme==="dark"?r.colors.dark[6]:r.white,color:r.colorScheme==="dark"?r.white:r.black,hover:r.colorScheme==="dark"?r.colors.dark[5]:r.colors.gray[0]};case"white":return{border:"transparent",background:r.white,color:e(o,t()),hover:null};case"transparent":return{border:"transparent",color:o==="dark"?r.colorScheme==="dark"?r.colors.dark[0]:r.colors.dark[9]:e(o,r.colorScheme==="dark"?2:t("light")),background:"transparent",hover:null};case"gradient":return{background:n(i),color:r.white,border:"transparent",hover:null};default:{const y=t(),d=c.isSplittedColor?c.shade:y,u=c.isSplittedColor?c.key:o;return{border:"transparent",background:e(u,d,l),color:r.white,hover:e(u,d===9?8:d+1)}}}}}function _r(r){return e=>{const t=_(r)(e);return r.colors[r.primaryColor][t]}}function kr(r){return{"@media (hover: hover)":{"&:hover":r},"@media (hover: none)":{"&:active":r}}}function $r(r){return()=>({userSelect:"none",color:r.colorScheme==="dark"?r.colors.dark[3]:r.colors.gray[5]})}function wr(r){return()=>r.colorScheme==="dark"?r.colors.dark[2]:r.colors.gray[6]}const f={fontStyles:nr,themeColor:E,focusStyles:sr,linearGradient:lr,radialGradient:cr,smallerThan:dr,largerThan:fr,rgba:v,cover:gr,darken:mr,lighten:yr,radius:vr,variant:hr,primaryShade:_,hover:kr,gradient:U,primaryColor:_r,placeholderStyles:$r,dimmed:wr};var Pr=Object.defineProperty,xr=Object.defineProperties,Or=Object.getOwnPropertyDescriptors,T=Object.getOwnPropertySymbols,Cr=Object.prototype.hasOwnProperty,Er=Object.prototype.propertyIsEnumerable,F=(r,e,t)=>e in r?Pr(r,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[e]=t,jr=(r,e)=>{for(var t in e||(e={}))Cr.call(e,t)&&F(r,t,e[t]);if(T)for(var t of T(e))Er.call(e,t)&&F(r,t,e[t]);return r},zr=(r,e)=>xr(r,Or(e));function B(r){return zr(jr({},r),{fn:{fontStyles:f.fontStyles(r),themeColor:f.themeColor(r),focusStyles:f.focusStyles(r),largerThan:f.largerThan(r),smallerThan:f.smallerThan(r),radialGradient:f.radialGradient,linearGradient:f.linearGradient,gradient:f.gradient(r),rgba:f.rgba,cover:f.cover,lighten:f.lighten,darken:f.darken,primaryShade:f.primaryShade(r),radius:f.radius(r),variant:f.variant(r),hover:f.hover,primaryColor:f.primaryColor(r),placeholderStyles:f.placeholderStyles(r),dimmed:f.dimmed(r)}})}const Ar={dir:"ltr",primaryShade:{light:6,dark:8},focusRing:"auto",loader:"oval",colorScheme:"light",white:"#fff",black:"#000",defaultRadius:"sm",transitionTimingFunction:"ease",colors:tr,lineHeight:1.55,fontFamily:"-apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Helvetica, Arial, sans-serif, Apple Color Emoji, Segoe UI Emoji",fontFamilyMonospace:"ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, Liberation Mono, Courier New, monospace",primaryColor:"blue",respectReducedMotion:!0,cursorType:"default",defaultGradient:{from:"indigo",to:"cyan",deg:45},shadows:{xs:"0 0.0625rem 0.1875rem rgba(0, 0, 0, 0.05), 0 0.0625rem 0.125rem rgba(0, 0, 0, 0.1)",sm:"0 0.0625rem 0.1875rem rgba(0, 0, 0, 0.05), rgba(0, 0, 0, 0.05) 0 0.625rem 0.9375rem -0.3125rem, rgba(0, 0, 0, 0.04) 0 0.4375rem 0.4375rem -0.3125rem",md:"0 0.0625rem 0.1875rem rgba(0, 0, 0, 0.05), rgba(0, 0, 0, 0.05) 0 1.25rem 1.5625rem -0.3125rem, rgba(0, 0, 0, 0.04) 0 0.625rem 0.625rem -0.3125rem",lg:"0 0.0625rem 0.1875rem rgba(0, 0, 0, 0.05), rgba(0, 0, 0, 0.05) 0 1.75rem 1.4375rem -0.4375rem, rgba(0, 0, 0, 0.04) 0 0.75rem 0.75rem -0.4375rem",xl:"0 0.0625rem 0.1875rem rgba(0, 0, 0, 0.05), rgba(0, 0, 0, 0.05) 0 2.25rem 1.75rem -0.4375rem, rgba(0, 0, 0, 0.04) 0 1.0625rem 1.0625rem -0.4375rem"},fontSizes:{xs:"0.75rem",sm:"0.875rem",md:"1rem",lg:"1.125rem",xl:"1.25rem"},radius:{xs:"0.125rem",sm:"0.25rem",md:"0.5rem",lg:"1rem",xl:"2rem"},spacing:{xs:"0.625rem",sm:"0.75rem",md:"1rem",lg:"1.25rem",xl:"1.5rem"},breakpoints:{xs:"36em",sm:"48em",md:"62em",lg:"75em",xl:"88em"},headings:{fontFamily:"-apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Helvetica, Arial, sans-serif, Apple Color Emoji, Segoe UI Emoji",fontWeight:700,sizes:{h1:{fontSize:"2.125rem",lineHeight:1.3,fontWeight:void 0},h2:{fontSize:"1.625rem",lineHeight:1.35,fontWeight:void 0},h3:{fontSize:"1.375rem",lineHeight:1.4,fontWeight:void 0},h4:{fontSize:"1.125rem",lineHeight:1.45,fontWeight:void 0},h5:{fontSize:"1rem",lineHeight:1.5,fontWeight:void 0},h6:{fontSize:"0.875rem",lineHeight:1.5,fontWeight:void 0}}},other:{},components:{},activeStyles:{transform:"translateY(0.0625rem)"},datesLocale:"en",globalStyles:void 0,focusRingStyles:{styles:r=>({outlineOffset:"0.125rem",outline:`0.125rem solid ${r.colors[r.primaryColor][r.colorScheme==="dark"?7:5]}`}),resetStyles:()=>({outline:"none"}),inputStyles:r=>({outline:"none",borderColor:r.colors[r.primaryColor][typeof r.primaryShade=="object"?r.primaryShade[r.colorScheme]:r.primaryShade]})}},z=B(Ar);var Mr=Object.defineProperty,Ir=Object.defineProperties,Rr=Object.getOwnPropertyDescriptors,H=Object.getOwnPropertySymbols,Tr=Object.prototype.hasOwnProperty,Fr=Object.prototype.propertyIsEnumerable,W=(r,e,t)=>e in r?Mr(r,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[e]=t,Hr=(r,e)=>{for(var t in e||(e={}))Tr.call(e,t)&&W(r,t,e[t]);if(H)for(var t of H(e))Fr.call(e,t)&&W(r,t,e[t]);return r},Wr=(r,e)=>Ir(r,Rr(e));function Nr({theme:r}){return g.createElement(P,{styles:{"*, *::before, *::after":{boxSizing:"border-box"},html:{colorScheme:r.colorScheme==="dark"?"dark":"light"},body:Wr(Hr({},r.fn.fontStyles()),{backgroundColor:r.colorScheme==="dark"?r.colors.dark[7]:r.white,color:r.colorScheme==="dark"?r.colors.dark[0]:r.black,lineHeight:r.lineHeight,fontSize:r.fontSizes.md,WebkitFontSmoothing:"antialiased",MozOsxFontSmoothing:"grayscale"})}})}function S(r,e,t,n=m){Object.keys(e).forEach(a=>{r[`--mantine-${t}-${a}`]=n(e[a])})}function Gr({theme:r}){const e={"--mantine-color-white":r.white,"--mantine-color-black":r.black,"--mantine-transition-timing-function":r.transitionTimingFunction,"--mantine-line-height":`${r.lineHeight}`,"--mantine-font-family":r.fontFamily,"--mantine-font-family-monospace":r.fontFamilyMonospace,"--mantine-font-family-headings":r.headings.fontFamily,"--mantine-heading-font-weight":`${r.headings.fontWeight}`};S(e,r.shadows,"shadow"),S(e,r.fontSizes,"font-size"),S(e,r.radius,"radius"),S(e,r.spacing,"spacing"),S(e,r.breakpoints,"breakpoints",O),Object.keys(r.colors).forEach(n=>{r.colors[n].forEach((a,o)=>{e[`--mantine-color-${n}-${o}`]=a})});const t=r.headings.sizes;return Object.keys(t).forEach(n=>{e[`--mantine-${n}-font-size`]=t[n].fontSize,e[`--mantine-${n}-line-height`]=`${t[n].lineHeight}`}),g.createElement(P,{styles:{":root":e}})}var Dr=Object.defineProperty,Lr=Object.defineProperties,Vr=Object.getOwnPropertyDescriptors,N=Object.getOwnPropertySymbols,Ur=Object.prototype.hasOwnProperty,Xr=Object.prototype.propertyIsEnumerable,G=(r,e,t)=>e in r?Dr(r,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[e]=t,p=(r,e)=>{for(var t in e||(e={}))Ur.call(e,t)&&G(r,t,e[t]);if(N)for(var t of N(e))Xr.call(e,t)&&G(r,t,e[t]);return r},C=(r,e)=>Lr(r,Vr(e));function qr(r,e){var t;if(!e)return r;const n=Object.keys(r).reduce((a,o)=>{if(o==="headings"&&e.headings){const i=e.headings.sizes?Object.keys(r.headings.sizes).reduce((l,c)=>(l[c]=p(p({},r.headings.sizes[c]),e.headings.sizes[c]),l),{}):r.headings.sizes;return C(p({},a),{headings:C(p(p({},r.headings),e.headings),{sizes:i})})}if(o==="breakpoints"&&e.breakpoints){const i=p(p({},r.breakpoints),e.breakpoints);return C(p({},a),{breakpoints:Object.fromEntries(Object.entries(i).sort((l,c)=>$(l[1])-$(c[1])))})}return a[o]=typeof e[o]=="object"?p(p({},r[o]),e[o]):typeof e[o]=="number"||typeof e[o]=="boolean"||typeof e[o]=="function"?e[o]:e[o]||r[o],a},{});if(e!=null&&e.fontFamily&&!((t=e==null?void 0:e.headings)!=null&&t.fontFamily)&&(n.headings.fontFamily=e.fontFamily),!(n.primaryColor in n.colors))throw new Error("MantineProvider: Invalid theme.primaryColor, it accepts only key of theme.colors, learn more – https://mantine.dev/theming/colors/#primary-color");return n}function Br(r,e){return B(qr(r,e))}function Yr(r){return Object.keys(r).reduce((e,t)=>(r[t]!==void 0&&(e[t]=r[t]),e),{})}const Jr={html:{fontFamily:"sans-serif",lineHeight:"1.15",textSizeAdjust:"100%"},body:{margin:0},"article, aside, footer, header, nav, section, figcaption, figure, main":{display:"block"},h1:{fontSize:"2em"},hr:{boxSizing:"content-box",height:0,overflow:"visible"},pre:{fontFamily:"monospace, monospace",fontSize:"1em"},a:{background:"transparent",textDecorationSkip:"objects"},"a:active, a:hover":{outlineWidth:0},"abbr[title]":{borderBottom:"none",textDecoration:"underline"},"b, strong":{fontWeight:"bolder"},"code, kbp, samp":{fontFamily:"monospace, monospace",fontSize:"1em"},dfn:{fontStyle:"italic"},mark:{backgroundColor:"#ff0",color:"#000"},small:{fontSize:"80%"},"sub, sup":{fontSize:"75%",lineHeight:0,position:"relative",verticalAlign:"baseline"},sup:{top:"-0.5em"},sub:{bottom:"-0.25em"},"audio, video":{display:"inline-block"},"audio:not([controls])":{display:"none",height:0},img:{borderStyle:"none",verticalAlign:"middle"},"svg:not(:root)":{overflow:"hidden"},"button, input, optgroup, select, textarea":{fontFamily:"sans-serif",fontSize:"100%",lineHeight:"1.15",margin:0},"button, input":{overflow:"visible"},"button, select":{textTransform:"none"},"button, [type=reset], [type=submit]":{WebkitAppearance:"button"},"button::-moz-focus-inner, [type=button]::-moz-focus-inner, [type=reset]::-moz-focus-inner, [type=submit]::-moz-focus-inner":{borderStyle:"none",padding:0},"button:-moz-focusring, [type=button]:-moz-focusring, [type=reset]:-moz-focusring, [type=submit]:-moz-focusring":{outline:`${m(1)} dotted ButtonText`},legend:{boxSizing:"border-box",color:"inherit",display:"table",maxWidth:"100%",padding:0,whiteSpace:"normal"},progress:{display:"inline-block",verticalAlign:"baseline"},textarea:{overflow:"auto"},"[type=checkbox], [type=radio]":{boxSizing:"border-box",padding:0},"[type=number]::-webkit-inner-spin-button, [type=number]::-webkit-outer-spin-button":{height:"auto"},"[type=search]":{appearance:"none"},"[type=search]::-webkit-search-cancel-button, [type=search]::-webkit-search-decoration":{appearance:"none"},"::-webkit-file-upload-button":{appearance:"button",font:"inherit"},"details, menu":{display:"block"},summary:{display:"list-item"},canvas:{display:"inline-block"},template:{display:"none"}};function Kr(){return g.createElement(P,{styles:Jr})}var Qr=Object.defineProperty,D=Object.getOwnPropertySymbols,Zr=Object.prototype.hasOwnProperty,re=Object.prototype.propertyIsEnumerable,L=(r,e,t)=>e in r?Qr(r,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[e]=t,h=(r,e)=>{for(var t in e||(e={}))Zr.call(e,t)&&L(r,t,e[t]);if(D)for(var t of D(e))re.call(e,t)&&L(r,t,e[t]);return r};const w=x.createContext({theme:z});function Y(){var r;return((r=x.useContext(w))==null?void 0:r.theme)||z}function ve(r){const e=Y(),t=n=>{var a,o,i,l;return{styles:((a=e.components[n])==null?void 0:a.styles)||{},classNames:((o=e.components[n])==null?void 0:o.classNames)||{},variants:(i=e.components[n])==null?void 0:i.variants,sizes:(l=e.components[n])==null?void 0:l.sizes}};return Array.isArray(r)?r.map(t):[t(r)]}function Se(){var r;return(r=x.useContext(w))==null?void 0:r.emotionCache}function he(r,e,t){var n;const a=Y(),o=(n=a.components[r])==null?void 0:n.defaultProps,i=typeof o=="function"?o(a):o;return h(h(h({},e),i),Yr(t))}function ee({theme:r,emotionCache:e,withNormalizeCSS:t=!1,withGlobalStyles:n=!1,withCSSVariables:a=!1,inherit:o=!1,children:i}){const l=x.useContext(w),c=Br(z,o?h(h({},l.theme),r):r);return g.createElement(K,{theme:c},g.createElement(w.Provider,{value:{theme:c,emotionCache:e}},t&&g.createElement(Kr,null),n&&g.createElement(Nr,{theme:c}),a&&g.createElement(Gr,{theme:c}),typeof c.globalStyles=="function"&&g.createElement(P,{styles:c.globalStyles(c)}),i))}ee.displayName="@mantine/core/MantineProvider";export{ee as M,Y as a,ve as b,q as c,he as d,b as e,Yr as f,$ as g,ae as h,ie as i,se as j,le as k,de as l,ye as m,ce as n,oe as o,fe as p,pe as q,m as r,ue as s,be as t,Se as u,ge as v,me as w}; diff --git a/invokeai/frontend/web/dist/assets/ThemeLocaleProvider-529591b4.js b/invokeai/frontend/web/dist/assets/ThemeLocaleProvider-529591b4.js new file mode 100644 index 0000000000..09d6c18e23 --- /dev/null +++ b/invokeai/frontend/web/dist/assets/ThemeLocaleProvider-529591b4.js @@ -0,0 +1,302 @@ +import{v as g,gj as Ke,s as x,L as Ba,gk as Ea,ae as ca,ah as c,gl as b,gm as Da,gn as t,go as ja,gp as h,gq as ba,gr as Ra,gs as Ha,a_ as Wa,gt as La,Z as Va,gu as qa,gv as Oa,gw as Na,gx as Ga,aW as Ua}from"./index-adc79457.js";import{e as n,o as Sr,h as Ya,i as Ka,j as Xa,k as Za,n as Ja,p as Qa,l as et,s as rt,q as at,t as tt,v as ot,w as nt,M as it}from"./MantineProvider-bb0be923.js";var va=String.raw,ua=va` + :root, + :host { + --chakra-vh: 100vh; + } + + @supports (height: -webkit-fill-available) { + :root, + :host { + --chakra-vh: -webkit-fill-available; + } + } + + @supports (height: -moz-fill-available) { + :root, + :host { + --chakra-vh: -moz-fill-available; + } + } + + @supports (height: 100dvh) { + :root, + :host { + --chakra-vh: 100dvh; + } + } +`,lt=()=>g.jsx(Ke,{styles:ua}),st=({scope:e=""})=>g.jsx(Ke,{styles:va` + html { + line-height: 1.5; + -webkit-text-size-adjust: 100%; + font-family: system-ui, sans-serif; + -webkit-font-smoothing: antialiased; + text-rendering: optimizeLegibility; + -moz-osx-font-smoothing: grayscale; + touch-action: manipulation; + } + + body { + position: relative; + min-height: 100%; + margin: 0; + font-feature-settings: "kern"; + } + + ${e} :where(*, *::before, *::after) { + border-width: 0; + border-style: solid; + box-sizing: border-box; + word-wrap: break-word; + } + + main { + display: block; + } + + ${e} hr { + border-top-width: 1px; + box-sizing: content-box; + height: 0; + overflow: visible; + } + + ${e} :where(pre, code, kbd,samp) { + font-family: SFMono-Regular, Menlo, Monaco, Consolas, monospace; + font-size: 1em; + } + + ${e} a { + background-color: transparent; + color: inherit; + text-decoration: inherit; + } + + ${e} abbr[title] { + border-bottom: none; + text-decoration: underline; + -webkit-text-decoration: underline dotted; + text-decoration: underline dotted; + } + + ${e} :where(b, strong) { + font-weight: bold; + } + + ${e} small { + font-size: 80%; + } + + ${e} :where(sub,sup) { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; + } + + ${e} sub { + bottom: -0.25em; + } + + ${e} sup { + top: -0.5em; + } + + ${e} img { + border-style: none; + } + + ${e} :where(button, input, optgroup, select, textarea) { + font-family: inherit; + font-size: 100%; + line-height: 1.15; + margin: 0; + } + + ${e} :where(button, input) { + overflow: visible; + } + + ${e} :where(button, select) { + text-transform: none; + } + + ${e} :where( + button::-moz-focus-inner, + [type="button"]::-moz-focus-inner, + [type="reset"]::-moz-focus-inner, + [type="submit"]::-moz-focus-inner + ) { + border-style: none; + padding: 0; + } + + ${e} fieldset { + padding: 0.35em 0.75em 0.625em; + } + + ${e} legend { + box-sizing: border-box; + color: inherit; + display: table; + max-width: 100%; + padding: 0; + white-space: normal; + } + + ${e} progress { + vertical-align: baseline; + } + + ${e} textarea { + overflow: auto; + } + + ${e} :where([type="checkbox"], [type="radio"]) { + box-sizing: border-box; + padding: 0; + } + + ${e} input[type="number"]::-webkit-inner-spin-button, + ${e} input[type="number"]::-webkit-outer-spin-button { + -webkit-appearance: none !important; + } + + ${e} input[type="number"] { + -moz-appearance: textfield; + } + + ${e} input[type="search"] { + -webkit-appearance: textfield; + outline-offset: -2px; + } + + ${e} input[type="search"]::-webkit-search-decoration { + -webkit-appearance: none !important; + } + + ${e} ::-webkit-file-upload-button { + -webkit-appearance: button; + font: inherit; + } + + ${e} details { + display: block; + } + + ${e} summary { + display: list-item; + } + + template { + display: none; + } + + [hidden] { + display: none !important; + } + + ${e} :where( + blockquote, + dl, + dd, + h1, + h2, + h3, + h4, + h5, + h6, + hr, + figure, + p, + pre + ) { + margin: 0; + } + + ${e} button { + background: transparent; + padding: 0; + } + + ${e} fieldset { + margin: 0; + padding: 0; + } + + ${e} :where(ol, ul) { + margin: 0; + padding: 0; + } + + ${e} textarea { + resize: vertical; + } + + ${e} :where(button, [role="button"]) { + cursor: pointer; + } + + ${e} button::-moz-focus-inner { + border: 0 !important; + } + + ${e} table { + border-collapse: collapse; + } + + ${e} :where(h1, h2, h3, h4, h5, h6) { + font-size: inherit; + font-weight: inherit; + } + + ${e} :where(button, input, optgroup, select, textarea) { + padding: 0; + line-height: inherit; + color: inherit; + } + + ${e} :where(img, svg, video, canvas, audio, iframe, embed, object) { + display: block; + } + + ${e} :where(img, video) { + max-width: 100%; + height: auto; + } + + [data-js-focus-visible] + :focus:not([data-focus-visible-added]):not( + [data-focus-visible-disabled] + ) { + outline: none; + box-shadow: none; + } + + ${e} select::-ms-expand { + display: none; + } + + ${ua} + `}),_e={light:"chakra-ui-light",dark:"chakra-ui-dark"};function dt(e={}){const{preventTransition:r=!0}=e,a={setDataset:o=>{const i=r?a.preventTransition():void 0;document.documentElement.dataset.theme=o,document.documentElement.style.colorScheme=o,i==null||i()},setClassName(o){document.body.classList.add(o?_e.dark:_e.light),document.body.classList.remove(o?_e.light:_e.dark)},query(){return window.matchMedia("(prefers-color-scheme: dark)")},getSystemTheme(o){var i;return((i=a.query().matches)!=null?i:o==="dark")?"dark":"light"},addListener(o){const i=a.query(),l=s=>{o(s.matches?"dark":"light")};return typeof i.addListener=="function"?i.addListener(l):i.addEventListener("change",l),()=>{typeof i.removeListener=="function"?i.removeListener(l):i.removeEventListener("change",l)}},preventTransition(){const o=document.createElement("style");return o.appendChild(document.createTextNode("*{-webkit-transition:none!important;-moz-transition:none!important;-o-transition:none!important;-ms-transition:none!important;transition:none!important}")),document.head.appendChild(o),()=>{window.getComputedStyle(document.body),requestAnimationFrame(()=>{requestAnimationFrame(()=>{document.head.removeChild(o)})})}}};return a}var ct="chakra-ui-color-mode";function fa(e){return{ssr:!1,type:"localStorage",get(r){if(!(globalThis!=null&&globalThis.document))return r;let a;try{a=localStorage.getItem(e)||r}catch{}return a||r},set(r){try{localStorage.setItem(e,r)}catch{}}}}var bt=fa(ct),Cr=()=>{};function Ar(e,r){return e.type==="cookie"&&e.ssr?e.get(r):r}function ma(e){const{value:r,children:a,options:{useSystemColorMode:o,initialColorMode:i,disableTransitionOnChange:l}={},colorModeManager:s=bt}=e,d=i==="dark"?"dark":"light",[v,$]=x.useState(()=>Ar(s,d)),[p,S]=x.useState(()=>Ar(s)),{getSystemTheme:T,setClassName:V,setDataset:Qe,addListener:wr}=x.useMemo(()=>dt({preventTransition:l}),[l]),$e=i==="system"&&!v?p:v,F=x.useCallback(te=>{const ke=te==="system"?T():te;$(ke),V(ke==="dark"),Qe(ke),s.set(ke)},[s,T,V,Qe]);Ba(()=>{i==="system"&&S(T())},[]),x.useEffect(()=>{const te=s.get();if(te){F(te);return}if(i==="system"){F("system");return}F(d)},[s,d,i,F]);const zr=x.useCallback(()=>{F($e==="dark"?"light":"dark")},[$e,F]);x.useEffect(()=>{if(o)return wr(F)},[o,wr,F]);const Ma=x.useMemo(()=>({colorMode:r??$e,toggleColorMode:r?Cr:zr,setColorMode:r?Cr:F,forced:r!==void 0}),[$e,zr,F,r]);return g.jsx(Ea.Provider,{value:Ma,children:a})}ma.displayName="ColorModeProvider";var vt=["borders","breakpoints","colors","components","config","direction","fonts","fontSizes","fontWeights","letterSpacings","lineHeights","radii","shadows","sizes","space","styles","transition","zIndices"];function ut(e){return ca(e)?vt.every(r=>Object.prototype.hasOwnProperty.call(e,r)):!1}var ft={common:"background-color, border-color, color, fill, stroke, opacity, box-shadow, transform",colors:"background-color, border-color, color, fill, stroke",dimensions:"width, height",position:"left, right, top, bottom",background:"background-color, background-image, background-position"},mt={"ease-in":"cubic-bezier(0.4, 0, 1, 1)","ease-out":"cubic-bezier(0, 0, 0.2, 1)","ease-in-out":"cubic-bezier(0.4, 0, 0.2, 1)"},ht={"ultra-fast":"50ms",faster:"100ms",fast:"150ms",normal:"200ms",slow:"300ms",slower:"400ms","ultra-slow":"500ms"},gt={property:ft,easing:mt,duration:ht},yt=gt,pt={hide:-1,auto:"auto",base:0,docked:10,dropdown:1e3,sticky:1100,banner:1200,overlay:1300,modal:1400,popover:1500,skipLink:1600,toast:1700,tooltip:1800},St=pt,xt={none:0,"1px":"1px solid","2px":"2px solid","4px":"4px solid","8px":"8px solid"},$t=xt,kt={base:"0em",sm:"30em",md:"48em",lg:"62em",xl:"80em","2xl":"96em"},_t=kt,wt={transparent:"transparent",current:"currentColor",black:"#000000",white:"#FFFFFF",whiteAlpha:{50:"rgba(255, 255, 255, 0.04)",100:"rgba(255, 255, 255, 0.06)",200:"rgba(255, 255, 255, 0.08)",300:"rgba(255, 255, 255, 0.16)",400:"rgba(255, 255, 255, 0.24)",500:"rgba(255, 255, 255, 0.36)",600:"rgba(255, 255, 255, 0.48)",700:"rgba(255, 255, 255, 0.64)",800:"rgba(255, 255, 255, 0.80)",900:"rgba(255, 255, 255, 0.92)"},blackAlpha:{50:"rgba(0, 0, 0, 0.04)",100:"rgba(0, 0, 0, 0.06)",200:"rgba(0, 0, 0, 0.08)",300:"rgba(0, 0, 0, 0.16)",400:"rgba(0, 0, 0, 0.24)",500:"rgba(0, 0, 0, 0.36)",600:"rgba(0, 0, 0, 0.48)",700:"rgba(0, 0, 0, 0.64)",800:"rgba(0, 0, 0, 0.80)",900:"rgba(0, 0, 0, 0.92)"},gray:{50:"#F7FAFC",100:"#EDF2F7",200:"#E2E8F0",300:"#CBD5E0",400:"#A0AEC0",500:"#718096",600:"#4A5568",700:"#2D3748",800:"#1A202C",900:"#171923"},red:{50:"#FFF5F5",100:"#FED7D7",200:"#FEB2B2",300:"#FC8181",400:"#F56565",500:"#E53E3E",600:"#C53030",700:"#9B2C2C",800:"#822727",900:"#63171B"},orange:{50:"#FFFAF0",100:"#FEEBC8",200:"#FBD38D",300:"#F6AD55",400:"#ED8936",500:"#DD6B20",600:"#C05621",700:"#9C4221",800:"#7B341E",900:"#652B19"},yellow:{50:"#FFFFF0",100:"#FEFCBF",200:"#FAF089",300:"#F6E05E",400:"#ECC94B",500:"#D69E2E",600:"#B7791F",700:"#975A16",800:"#744210",900:"#5F370E"},green:{50:"#F0FFF4",100:"#C6F6D5",200:"#9AE6B4",300:"#68D391",400:"#48BB78",500:"#38A169",600:"#2F855A",700:"#276749",800:"#22543D",900:"#1C4532"},teal:{50:"#E6FFFA",100:"#B2F5EA",200:"#81E6D9",300:"#4FD1C5",400:"#38B2AC",500:"#319795",600:"#2C7A7B",700:"#285E61",800:"#234E52",900:"#1D4044"},blue:{50:"#ebf8ff",100:"#bee3f8",200:"#90cdf4",300:"#63b3ed",400:"#4299e1",500:"#3182ce",600:"#2b6cb0",700:"#2c5282",800:"#2a4365",900:"#1A365D"},cyan:{50:"#EDFDFD",100:"#C4F1F9",200:"#9DECF9",300:"#76E4F7",400:"#0BC5EA",500:"#00B5D8",600:"#00A3C4",700:"#0987A0",800:"#086F83",900:"#065666"},purple:{50:"#FAF5FF",100:"#E9D8FD",200:"#D6BCFA",300:"#B794F4",400:"#9F7AEA",500:"#805AD5",600:"#6B46C1",700:"#553C9A",800:"#44337A",900:"#322659"},pink:{50:"#FFF5F7",100:"#FED7E2",200:"#FBB6CE",300:"#F687B3",400:"#ED64A6",500:"#D53F8C",600:"#B83280",700:"#97266D",800:"#702459",900:"#521B41"},linkedin:{50:"#E8F4F9",100:"#CFEDFB",200:"#9BDAF3",300:"#68C7EC",400:"#34B3E4",500:"#00A0DC",600:"#008CC9",700:"#0077B5",800:"#005E93",900:"#004471"},facebook:{50:"#E8F4F9",100:"#D9DEE9",200:"#B7C2DA",300:"#6482C0",400:"#4267B2",500:"#385898",600:"#314E89",700:"#29487D",800:"#223B67",900:"#1E355B"},messenger:{50:"#D0E6FF",100:"#B9DAFF",200:"#A2CDFF",300:"#7AB8FF",400:"#2E90FF",500:"#0078FF",600:"#0063D1",700:"#0052AC",800:"#003C7E",900:"#002C5C"},whatsapp:{50:"#dffeec",100:"#b9f5d0",200:"#90edb3",300:"#65e495",400:"#3cdd78",500:"#22c35e",600:"#179848",700:"#0c6c33",800:"#01421c",900:"#001803"},twitter:{50:"#E5F4FD",100:"#C8E9FB",200:"#A8DCFA",300:"#83CDF7",400:"#57BBF5",500:"#1DA1F2",600:"#1A94DA",700:"#1681BF",800:"#136B9E",900:"#0D4D71"},telegram:{50:"#E3F2F9",100:"#C5E4F3",200:"#A2D4EC",300:"#7AC1E4",400:"#47A9DA",500:"#0088CC",600:"#007AB8",700:"#006BA1",800:"#005885",900:"#003F5E"}},zt=wt,Ct={none:"0",sm:"0.125rem",base:"0.25rem",md:"0.375rem",lg:"0.5rem",xl:"0.75rem","2xl":"1rem","3xl":"1.5rem",full:"9999px"},At=Ct,Pt={xs:"0 0 0 1px rgba(0, 0, 0, 0.05)",sm:"0 1px 2px 0 rgba(0, 0, 0, 0.05)",base:"0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06)",md:"0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06)",lg:"0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05)",xl:"0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04)","2xl":"0 25px 50px -12px rgba(0, 0, 0, 0.25)",outline:"0 0 0 3px rgba(66, 153, 225, 0.6)",inner:"inset 0 2px 4px 0 rgba(0,0,0,0.06)",none:"none","dark-lg":"rgba(0, 0, 0, 0.1) 0px 0px 0px 1px, rgba(0, 0, 0, 0.2) 0px 5px 10px, rgba(0, 0, 0, 0.4) 0px 15px 40px"},Tt=Pt,Ft={none:0,sm:"4px",base:"8px",md:"12px",lg:"16px",xl:"24px","2xl":"40px","3xl":"64px"},It=Ft,Mt={letterSpacings:{tighter:"-0.05em",tight:"-0.025em",normal:"0",wide:"0.025em",wider:"0.05em",widest:"0.1em"},lineHeights:{normal:"normal",none:1,shorter:1.25,short:1.375,base:1.5,tall:1.625,taller:"2",3:".75rem",4:"1rem",5:"1.25rem",6:"1.5rem",7:"1.75rem",8:"2rem",9:"2.25rem",10:"2.5rem"},fontWeights:{hairline:100,thin:200,light:300,normal:400,medium:500,semibold:600,bold:700,extrabold:800,black:900},fonts:{heading:'-apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"',body:'-apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"',mono:'SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace'},fontSizes:{"3xs":"0.45rem","2xs":"0.625rem",xs:"0.75rem",sm:"0.875rem",md:"1rem",lg:"1.125rem",xl:"1.25rem","2xl":"1.5rem","3xl":"1.875rem","4xl":"2.25rem","5xl":"3rem","6xl":"3.75rem","7xl":"4.5rem","8xl":"6rem","9xl":"8rem"}},ha=Mt,ga={px:"1px",.5:"0.125rem",1:"0.25rem",1.5:"0.375rem",2:"0.5rem",2.5:"0.625rem",3:"0.75rem",3.5:"0.875rem",4:"1rem",5:"1.25rem",6:"1.5rem",7:"1.75rem",8:"2rem",9:"2.25rem",10:"2.5rem",12:"3rem",14:"3.5rem",16:"4rem",20:"5rem",24:"6rem",28:"7rem",32:"8rem",36:"9rem",40:"10rem",44:"11rem",48:"12rem",52:"13rem",56:"14rem",60:"15rem",64:"16rem",72:"18rem",80:"20rem",96:"24rem"},Bt={max:"max-content",min:"min-content",full:"100%","3xs":"14rem","2xs":"16rem",xs:"20rem",sm:"24rem",md:"28rem",lg:"32rem",xl:"36rem","2xl":"42rem","3xl":"48rem","4xl":"56rem","5xl":"64rem","6xl":"72rem","7xl":"80rem","8xl":"90rem",prose:"60ch"},Et={sm:"640px",md:"768px",lg:"1024px",xl:"1280px"},Dt={...ga,...Bt,container:Et},ya=Dt,jt={breakpoints:_t,zIndices:St,radii:At,blur:It,colors:zt,...ha,sizes:ya,shadows:Tt,space:ga,borders:$t,transition:yt},{defineMultiStyleConfig:Rt,definePartsStyle:le}=b(["stepper","step","title","description","indicator","separator","icon","number"]),B=c("stepper-indicator-size"),K=c("stepper-icon-size"),X=c("stepper-title-font-size"),se=c("stepper-description-font-size"),oe=c("stepper-accent-color"),Ht=le(({colorScheme:e})=>({stepper:{display:"flex",justifyContent:"space-between",gap:"4","&[data-orientation=vertical]":{flexDirection:"column",alignItems:"flex-start"},"&[data-orientation=horizontal]":{flexDirection:"row",alignItems:"center"},[oe.variable]:`colors.${e}.500`,_dark:{[oe.variable]:`colors.${e}.200`}},title:{fontSize:X.reference,fontWeight:"medium"},description:{fontSize:se.reference,color:"chakra-subtle-text"},number:{fontSize:X.reference},step:{flexShrink:0,position:"relative",display:"flex",gap:"2","&[data-orientation=horizontal]":{alignItems:"center"},flex:"1","&:last-of-type:not([data-stretch])":{flex:"initial"}},icon:{flexShrink:0,width:K.reference,height:K.reference},indicator:{flexShrink:0,borderRadius:"full",width:B.reference,height:B.reference,display:"flex",justifyContent:"center",alignItems:"center","&[data-status=active]":{borderWidth:"2px",borderColor:oe.reference},"&[data-status=complete]":{bg:oe.reference,color:"chakra-inverse-text"},"&[data-status=incomplete]":{borderWidth:"2px"}},separator:{bg:"chakra-border-color",flex:"1","&[data-status=complete]":{bg:oe.reference},"&[data-orientation=horizontal]":{width:"100%",height:"2px",marginStart:"2"},"&[data-orientation=vertical]":{width:"2px",position:"absolute",height:"100%",maxHeight:`calc(100% - ${B.reference} - 8px)`,top:`calc(${B.reference} + 4px)`,insetStart:`calc(${B.reference} / 2 - 1px)`}}})),Wt=Rt({baseStyle:Ht,sizes:{xs:le({stepper:{[B.variable]:"sizes.4",[K.variable]:"sizes.3",[X.variable]:"fontSizes.xs",[se.variable]:"fontSizes.xs"}}),sm:le({stepper:{[B.variable]:"sizes.6",[K.variable]:"sizes.4",[X.variable]:"fontSizes.sm",[se.variable]:"fontSizes.xs"}}),md:le({stepper:{[B.variable]:"sizes.8",[K.variable]:"sizes.5",[X.variable]:"fontSizes.md",[se.variable]:"fontSizes.sm"}}),lg:le({stepper:{[B.variable]:"sizes.10",[K.variable]:"sizes.6",[X.variable]:"fontSizes.lg",[se.variable]:"fontSizes.md"}})},defaultProps:{size:"md",colorScheme:"blue"}});function f(e,r={}){let a=!1;function o(){if(!a){a=!0;return}throw new Error("[anatomy] .part(...) should only be called once. Did you mean to use .extend(...) ?")}function i(...p){o();for(const S of p)r[S]=v(S);return f(e,r)}function l(...p){for(const S of p)S in r||(r[S]=v(S));return f(e,r)}function s(){return Object.fromEntries(Object.entries(r).map(([S,T])=>[S,T.selector]))}function d(){return Object.fromEntries(Object.entries(r).map(([S,T])=>[S,T.className]))}function v(p){const V=`chakra-${(["container","root"].includes(p??"")?[e]:[e,p]).filter(Boolean).join("__")}`;return{className:V,selector:`.${V}`,toString:()=>p}}return{parts:i,toPart:v,extend:l,selectors:s,classnames:d,get keys(){return Object.keys(r)},__type:{}}}var Lt=f("accordion").parts("root","container","button","panel").extend("icon"),Vt=f("alert").parts("title","description","container").extend("icon","spinner"),qt=f("avatar").parts("label","badge","container").extend("excessLabel","group"),Ot=f("breadcrumb").parts("link","item","container").extend("separator");f("button").parts();var Nt=f("checkbox").parts("control","icon","container").extend("label");f("progress").parts("track","filledTrack").extend("label");var Gt=f("drawer").parts("overlay","dialogContainer","dialog").extend("header","closeButton","body","footer"),Ut=f("editable").parts("preview","input","textarea"),Yt=f("form").parts("container","requiredIndicator","helperText"),Kt=f("formError").parts("text","icon"),Xt=f("input").parts("addon","field","element"),Zt=f("list").parts("container","item","icon"),Jt=f("menu").parts("button","list","item").extend("groupTitle","command","divider"),Qt=f("modal").parts("overlay","dialogContainer","dialog").extend("header","closeButton","body","footer"),eo=f("numberinput").parts("root","field","stepperGroup","stepper");f("pininput").parts("field");var ro=f("popover").parts("content","header","body","footer").extend("popper","arrow","closeButton"),ao=f("progress").parts("label","filledTrack","track"),to=f("radio").parts("container","control","label"),oo=f("select").parts("field","icon"),no=f("slider").parts("container","track","thumb","filledTrack","mark"),io=f("stat").parts("container","label","helpText","number","icon"),lo=f("switch").parts("container","track","thumb"),so=f("table").parts("table","thead","tbody","tr","th","td","tfoot","caption"),co=f("tabs").parts("root","tab","tablist","tabpanel","tabpanels","indicator"),bo=f("tag").parts("container","label","closeButton"),vo=f("card").parts("container","header","body","footer");function O(e,r,a){return Math.min(Math.max(e,a),r)}class uo extends Error{constructor(r){super(`Failed to parse color: "${r}"`)}}var de=uo;function xr(e){if(typeof e!="string")throw new de(e);if(e.trim().toLowerCase()==="transparent")return[0,0,0,0];let r=e.trim();r=xo.test(e)?ho(e):e;const a=go.exec(r);if(a){const s=Array.from(a).slice(1);return[...s.slice(0,3).map(d=>parseInt(ge(d,2),16)),parseInt(ge(s[3]||"f",2),16)/255]}const o=yo.exec(r);if(o){const s=Array.from(o).slice(1);return[...s.slice(0,3).map(d=>parseInt(d,16)),parseInt(s[3]||"ff",16)/255]}const i=po.exec(r);if(i){const s=Array.from(i).slice(1);return[...s.slice(0,3).map(d=>parseInt(d,10)),parseFloat(s[3]||"1")]}const l=So.exec(r);if(l){const[s,d,v,$]=Array.from(l).slice(1).map(parseFloat);if(O(0,100,d)!==d)throw new de(e);if(O(0,100,v)!==v)throw new de(e);return[...$o(s,d,v),Number.isNaN($)?1:$]}throw new de(e)}function fo(e){let r=5381,a=e.length;for(;a;)r=r*33^e.charCodeAt(--a);return(r>>>0)%2341}const Pr=e=>parseInt(e.replace(/_/g,""),36),mo="1q29ehhb 1n09sgk7 1kl1ekf_ _yl4zsno 16z9eiv3 1p29lhp8 _bd9zg04 17u0____ _iw9zhe5 _to73___ _r45e31e _7l6g016 _jh8ouiv _zn3qba8 1jy4zshs 11u87k0u 1ro9yvyo 1aj3xael 1gz9zjz0 _3w8l4xo 1bf1ekf_ _ke3v___ _4rrkb__ 13j776yz _646mbhl _nrjr4__ _le6mbhl 1n37ehkb _m75f91n _qj3bzfz 1939yygw 11i5z6x8 _1k5f8xs 1509441m 15t5lwgf _ae2th1n _tg1ugcv 1lp1ugcv 16e14up_ _h55rw7n _ny9yavn _7a11xb_ 1ih442g9 _pv442g9 1mv16xof 14e6y7tu 1oo9zkds 17d1cisi _4v9y70f _y98m8kc 1019pq0v 12o9zda8 _348j4f4 1et50i2o _8epa8__ _ts6senj 1o350i2o 1mi9eiuo 1259yrp0 1ln80gnw _632xcoy 1cn9zldc _f29edu4 1n490c8q _9f9ziet 1b94vk74 _m49zkct 1kz6s73a 1eu9dtog _q58s1rz 1dy9sjiq __u89jo3 _aj5nkwg _ld89jo3 13h9z6wx _qa9z2ii _l119xgq _bs5arju 1hj4nwk9 1qt4nwk9 1ge6wau6 14j9zlcw 11p1edc_ _ms1zcxe _439shk6 _jt9y70f _754zsow 1la40eju _oq5p___ _x279qkz 1fa5r3rv _yd2d9ip _424tcku _8y1di2_ _zi2uabw _yy7rn9h 12yz980_ __39ljp6 1b59zg0x _n39zfzp 1fy9zest _b33k___ _hp9wq92 1il50hz4 _io472ub _lj9z3eo 19z9ykg0 _8t8iu3a 12b9bl4a 1ak5yw0o _896v4ku _tb8k8lv _s59zi6t _c09ze0p 1lg80oqn 1id9z8wb _238nba5 1kq6wgdi _154zssg _tn3zk49 _da9y6tc 1sg7cv4f _r12jvtt 1gq5fmkz 1cs9rvci _lp9jn1c _xw1tdnb 13f9zje6 16f6973h _vo7ir40 _bt5arjf _rc45e4t _hr4e100 10v4e100 _hc9zke2 _w91egv_ _sj2r1kk 13c87yx8 _vqpds__ _ni8ggk8 _tj9yqfb 1ia2j4r4 _7x9b10u 1fc9ld4j 1eq9zldr _5j9lhpx _ez9zl6o _md61fzm".split(" ").reduce((e,r)=>{const a=Pr(r.substring(0,3)),o=Pr(r.substring(3)).toString(16);let i="";for(let l=0;l<6-o.length;l++)i+="0";return e[a]=`${i}${o}`,e},{});function ho(e){const r=e.toLowerCase().trim(),a=mo[fo(r)];if(!a)throw new de(e);return`#${a}`}const ge=(e,r)=>Array.from(Array(r)).map(()=>e).join(""),go=new RegExp(`^#${ge("([a-f0-9])",3)}([a-f0-9])?$`,"i"),yo=new RegExp(`^#${ge("([a-f0-9]{2})",3)}([a-f0-9]{2})?$`,"i"),po=new RegExp(`^rgba?\\(\\s*(\\d+)\\s*${ge(",\\s*(\\d+)\\s*",2)}(?:,\\s*([\\d.]+))?\\s*\\)$`,"i"),So=/^hsla?\(\s*([\d.]+)\s*,\s*([\d.]+)%\s*,\s*([\d.]+)%(?:\s*,\s*([\d.]+))?\s*\)$/i,xo=/^[a-z]+$/i,Tr=e=>Math.round(e*255),$o=(e,r,a)=>{let o=a/100;if(r===0)return[o,o,o].map(Tr);const i=(e%360+360)%360/60,l=(1-Math.abs(2*o-1))*(r/100),s=l*(1-Math.abs(i%2-1));let d=0,v=0,$=0;i>=0&&i<1?(d=l,v=s):i>=1&&i<2?(d=s,v=l):i>=2&&i<3?(v=l,$=s):i>=3&&i<4?(v=s,$=l):i>=4&&i<5?(d=s,$=l):i>=5&&i<6&&(d=l,$=s);const p=o-l/2,S=d+p,T=v+p,V=$+p;return[S,T,V].map(Tr)};function ko(e,r,a,o){return`rgba(${O(0,255,e).toFixed()}, ${O(0,255,r).toFixed()}, ${O(0,255,a).toFixed()}, ${parseFloat(O(0,1,o).toFixed(3))})`}function _o(e,r){const[a,o,i,l]=xr(e);return ko(a,o,i,l-r)}function wo(e){const[r,a,o,i]=xr(e);let l=s=>{const d=O(0,255,s).toString(16);return d.length===1?`0${d}`:d};return`#${l(r)}${l(a)}${l(o)}${i<1?l(Math.round(i*255)):""}`}function zo(e,r,a,o,i){for(r=r.split?r.split("."):r,o=0;oObject.keys(e).length===0,Ne=(e,r,a)=>{const o=zo(e,`colors.${r}`,r);try{return wo(o),o}catch{return a??"#000000"}},P=(e,r,a)=>{var o;return(o=Da(e,"colors",r))!=null?o:a},Ao=e=>{const[r,a,o]=xr(e);return(r*299+a*587+o*114)/1e3},Po=e=>r=>{const a=Ne(r,e);return Ao(a)<128?"dark":"light"},To=e=>r=>Po(e)(r)==="dark",re=(e,r)=>a=>{const o=Ne(a,e);return _o(o,1-r)};function Fr(e="1rem",r="rgba(255, 255, 255, 0.15)"){return{backgroundImage:`linear-gradient( + 45deg, + ${r} 25%, + transparent 25%, + transparent 50%, + ${r} 50%, + ${r} 75%, + transparent 75%, + transparent + )`,backgroundSize:`${e} ${e}`}}var Fo=()=>`#${Math.floor(Math.random()*16777215).toString(16).padEnd(6,"0")}`;function Io(e){const r=Fo();return!e||Co(e)?r:e.string&&e.colors?Bo(e.string,e.colors):e.string&&!e.colors?Mo(e.string):e.colors&&!e.string?Eo(e.colors):r}function Mo(e){let r=0;if(e.length===0)return r.toString();for(let o=0;o>o*8&255;a+=`00${i.toString(16)}`.substr(-2)}return a}function Bo(e,r){let a=0;if(e.length===0)return r[0];for(let o=0;or.map(pa).join(` ${e} `).replace(/calc/g,""),Ir=(...e)=>`calc(${Xe("+",...e)})`,Mr=(...e)=>`calc(${Xe("-",...e)})`,hr=(...e)=>`calc(${Xe("*",...e)})`,Br=(...e)=>`calc(${Xe("/",...e)})`,Er=e=>{const r=pa(e);return r!=null&&!Number.isNaN(parseFloat(r))?String(r).startsWith("-")?String(r).slice(1):`-${r}`:hr(r,-1)},E=Object.assign(e=>({add:(...r)=>E(Ir(e,...r)),subtract:(...r)=>E(Mr(e,...r)),multiply:(...r)=>E(hr(e,...r)),divide:(...r)=>E(Br(e,...r)),negate:()=>E(Er(e)),toString:()=>e.toString()}),{add:Ir,subtract:Mr,multiply:hr,divide:Br,negate:Er});function Do(e){return!Number.isInteger(parseFloat(e.toString()))}function jo(e,r="-"){return e.replace(/\s+/g,r)}function Sa(e){const r=jo(e.toString());return r.includes("\\.")?e:Do(e)?r.replace(".","\\."):e}function Ro(e,r=""){return[r,Sa(e)].filter(Boolean).join("-")}function Ho(e,r){return`var(${Sa(e)}${r?`, ${r}`:""})`}function Wo(e,r=""){return`--${Ro(e,r)}`}function m(e,r){const a=Wo(e,r==null?void 0:r.prefix);return{variable:a,reference:Ho(a,Lo(r==null?void 0:r.fallback))}}function Lo(e){return typeof e=="string"?e:e==null?void 0:e.reference}var{defineMultiStyleConfig:Vo,definePartsStyle:je}=b(lo.keys),ve=m("switch-track-width"),N=m("switch-track-height"),er=m("switch-track-diff"),qo=E.subtract(ve,N),gr=m("switch-thumb-x"),ne=m("switch-bg"),Oo=t(e=>{const{colorScheme:r}=e;return{borderRadius:"full",p:"0.5",width:[ve.reference],height:[N.reference],transitionProperty:"common",transitionDuration:"fast",[ne.variable]:"colors.gray.300",_dark:{[ne.variable]:"colors.whiteAlpha.400"},_focusVisible:{boxShadow:"outline"},_disabled:{opacity:.4,cursor:"not-allowed"},_checked:{[ne.variable]:`colors.${r}.500`,_dark:{[ne.variable]:`colors.${r}.200`}},bg:ne.reference}}),No=t({bg:"white",transitionProperty:"transform",transitionDuration:"normal",borderRadius:"inherit",width:[N.reference],height:[N.reference],_checked:{transform:`translateX(${gr.reference})`}}),Go=je(e=>({container:{[er.variable]:qo,[gr.variable]:er.reference,_rtl:{[gr.variable]:E(er).negate().toString()}},track:Oo(e),thumb:No})),Uo={sm:je({container:{[ve.variable]:"1.375rem",[N.variable]:"sizes.3"}}),md:je({container:{[ve.variable]:"1.875rem",[N.variable]:"sizes.4"}}),lg:je({container:{[ve.variable]:"2.875rem",[N.variable]:"sizes.6"}})},Yo=Vo({baseStyle:Go,sizes:Uo,defaultProps:{size:"md",colorScheme:"blue"}}),{defineMultiStyleConfig:Ko,definePartsStyle:Z}=b(so.keys),Xo=Z({table:{fontVariantNumeric:"lining-nums tabular-nums",borderCollapse:"collapse",width:"full"},th:{fontFamily:"heading",fontWeight:"bold",textTransform:"uppercase",letterSpacing:"wider",textAlign:"start"},td:{textAlign:"start"},caption:{mt:4,fontFamily:"heading",textAlign:"center",fontWeight:"medium"}}),Ge=t({"&[data-is-numeric=true]":{textAlign:"end"}}),Zo=Z(e=>{const{colorScheme:r}=e;return{th:{color:n("gray.600","gray.400")(e),borderBottom:"1px",borderColor:n(`${r}.100`,`${r}.700`)(e),...Ge},td:{borderBottom:"1px",borderColor:n(`${r}.100`,`${r}.700`)(e),...Ge},caption:{color:n("gray.600","gray.100")(e)},tfoot:{tr:{"&:last-of-type":{th:{borderBottomWidth:0}}}}}}),Jo=Z(e=>{const{colorScheme:r}=e;return{th:{color:n("gray.600","gray.400")(e),borderBottom:"1px",borderColor:n(`${r}.100`,`${r}.700`)(e),...Ge},td:{borderBottom:"1px",borderColor:n(`${r}.100`,`${r}.700`)(e),...Ge},caption:{color:n("gray.600","gray.100")(e)},tbody:{tr:{"&:nth-of-type(odd)":{"th, td":{borderBottomWidth:"1px",borderColor:n(`${r}.100`,`${r}.700`)(e)},td:{background:n(`${r}.100`,`${r}.700`)(e)}}}},tfoot:{tr:{"&:last-of-type":{th:{borderBottomWidth:0}}}}}}),Qo={simple:Zo,striped:Jo,unstyled:t({})},en={sm:Z({th:{px:"4",py:"1",lineHeight:"4",fontSize:"xs"},td:{px:"4",py:"2",fontSize:"sm",lineHeight:"4"},caption:{px:"4",py:"2",fontSize:"xs"}}),md:Z({th:{px:"6",py:"3",lineHeight:"4",fontSize:"xs"},td:{px:"6",py:"4",lineHeight:"5"},caption:{px:"6",py:"2",fontSize:"sm"}}),lg:Z({th:{px:"8",py:"4",lineHeight:"5",fontSize:"sm"},td:{px:"8",py:"5",lineHeight:"6"},caption:{px:"6",py:"2",fontSize:"md"}})},rn=Ko({baseStyle:Xo,variants:Qo,sizes:en,defaultProps:{variant:"simple",size:"md",colorScheme:"gray"}}),_=c("tabs-color"),A=c("tabs-bg"),we=c("tabs-border-color"),{defineMultiStyleConfig:an,definePartsStyle:M}=b(co.keys),tn=t(e=>{const{orientation:r}=e;return{display:r==="vertical"?"flex":"block"}}),on=t(e=>{const{isFitted:r}=e;return{flex:r?1:void 0,transitionProperty:"common",transitionDuration:"normal",_focusVisible:{zIndex:1,boxShadow:"outline"},_disabled:{cursor:"not-allowed",opacity:.4}}}),nn=t(e=>{const{align:r="start",orientation:a}=e;return{justifyContent:{end:"flex-end",center:"center",start:"flex-start"}[r],flexDirection:a==="vertical"?"column":"row"}}),ln=t({p:4}),sn=M(e=>({root:tn(e),tab:on(e),tablist:nn(e),tabpanel:ln})),dn={sm:M({tab:{py:1,px:4,fontSize:"sm"}}),md:M({tab:{fontSize:"md",py:2,px:4}}),lg:M({tab:{fontSize:"lg",py:3,px:4}})},cn=M(e=>{const{colorScheme:r,orientation:a}=e,o=a==="vertical",i=o?"borderStart":"borderBottom",l=o?"marginStart":"marginBottom";return{tablist:{[i]:"2px solid",borderColor:"inherit"},tab:{[i]:"2px solid",borderColor:"transparent",[l]:"-2px",_selected:{[_.variable]:`colors.${r}.600`,_dark:{[_.variable]:`colors.${r}.300`},borderColor:"currentColor"},_active:{[A.variable]:"colors.gray.200",_dark:{[A.variable]:"colors.whiteAlpha.300"}},_disabled:{_active:{bg:"none"}},color:_.reference,bg:A.reference}}}),bn=M(e=>{const{colorScheme:r}=e;return{tab:{borderTopRadius:"md",border:"1px solid",borderColor:"transparent",mb:"-1px",[we.variable]:"transparent",_selected:{[_.variable]:`colors.${r}.600`,[we.variable]:"colors.white",_dark:{[_.variable]:`colors.${r}.300`,[we.variable]:"colors.gray.800"},borderColor:"inherit",borderBottomColor:we.reference},color:_.reference},tablist:{mb:"-1px",borderBottom:"1px solid",borderColor:"inherit"}}}),vn=M(e=>{const{colorScheme:r}=e;return{tab:{border:"1px solid",borderColor:"inherit",[A.variable]:"colors.gray.50",_dark:{[A.variable]:"colors.whiteAlpha.50"},mb:"-1px",_notLast:{marginEnd:"-1px"},_selected:{[A.variable]:"colors.white",[_.variable]:`colors.${r}.600`,_dark:{[A.variable]:"colors.gray.800",[_.variable]:`colors.${r}.300`},borderColor:"inherit",borderTopColor:"currentColor",borderBottomColor:"transparent"},color:_.reference,bg:A.reference},tablist:{mb:"-1px",borderBottom:"1px solid",borderColor:"inherit"}}}),un=M(e=>{const{colorScheme:r,theme:a}=e;return{tab:{borderRadius:"full",fontWeight:"semibold",color:"gray.600",_selected:{color:Ne(a,`${r}.700`),bg:Ne(a,`${r}.100`)}}}}),fn=M(e=>{const{colorScheme:r}=e;return{tab:{borderRadius:"full",fontWeight:"semibold",[_.variable]:"colors.gray.600",_dark:{[_.variable]:"inherit"},_selected:{[_.variable]:"colors.white",[A.variable]:`colors.${r}.600`,_dark:{[_.variable]:"colors.gray.800",[A.variable]:`colors.${r}.300`}},color:_.reference,bg:A.reference}}}),mn=M({}),hn={line:cn,enclosed:bn,"enclosed-colored":vn,"soft-rounded":un,"solid-rounded":fn,unstyled:mn},gn=an({baseStyle:sn,sizes:dn,variants:hn,defaultProps:{size:"md",variant:"line",colorScheme:"blue"}}),y=ja("badge",["bg","color","shadow"]),yn=t({px:1,textTransform:"uppercase",fontSize:"xs",borderRadius:"sm",fontWeight:"bold",bg:y.bg.reference,color:y.color.reference,boxShadow:y.shadow.reference}),pn=t(e=>{const{colorScheme:r,theme:a}=e,o=re(`${r}.500`,.6)(a);return{[y.bg.variable]:`colors.${r}.500`,[y.color.variable]:"colors.white",_dark:{[y.bg.variable]:o,[y.color.variable]:"colors.whiteAlpha.800"}}}),Sn=t(e=>{const{colorScheme:r,theme:a}=e,o=re(`${r}.200`,.16)(a);return{[y.bg.variable]:`colors.${r}.100`,[y.color.variable]:`colors.${r}.800`,_dark:{[y.bg.variable]:o,[y.color.variable]:`colors.${r}.200`}}}),xn=t(e=>{const{colorScheme:r,theme:a}=e,o=re(`${r}.200`,.8)(a);return{[y.color.variable]:`colors.${r}.500`,_dark:{[y.color.variable]:o},[y.shadow.variable]:`inset 0 0 0px 1px ${y.color.reference}`}}),$n={solid:pn,subtle:Sn,outline:xn},ue=h({baseStyle:yn,variants:$n,defaultProps:{variant:"subtle",colorScheme:"gray"}}),{defineMultiStyleConfig:kn,definePartsStyle:G}=b(bo.keys),Dr=c("tag-bg"),jr=c("tag-color"),rr=c("tag-shadow"),Re=c("tag-min-height"),He=c("tag-min-width"),We=c("tag-font-size"),Le=c("tag-padding-inline"),_n=t({fontWeight:"medium",lineHeight:1.2,outline:0,[jr.variable]:y.color.reference,[Dr.variable]:y.bg.reference,[rr.variable]:y.shadow.reference,color:jr.reference,bg:Dr.reference,boxShadow:rr.reference,borderRadius:"md",minH:Re.reference,minW:He.reference,fontSize:We.reference,px:Le.reference,_focusVisible:{[rr.variable]:"shadows.outline"}}),wn=t({lineHeight:1.2,overflow:"visible"}),zn=t({fontSize:"lg",w:"5",h:"5",transitionProperty:"common",transitionDuration:"normal",borderRadius:"full",marginStart:"1.5",marginEnd:"-1",opacity:.5,_disabled:{opacity:.4},_focusVisible:{boxShadow:"outline",bg:"rgba(0, 0, 0, 0.14)"},_hover:{opacity:.8},_active:{opacity:1}}),Cn=G({container:_n,label:wn,closeButton:zn}),An={sm:G({container:{[Re.variable]:"sizes.5",[He.variable]:"sizes.5",[We.variable]:"fontSizes.xs",[Le.variable]:"space.2"},closeButton:{marginEnd:"-2px",marginStart:"0.35rem"}}),md:G({container:{[Re.variable]:"sizes.6",[He.variable]:"sizes.6",[We.variable]:"fontSizes.sm",[Le.variable]:"space.2"}}),lg:G({container:{[Re.variable]:"sizes.8",[He.variable]:"sizes.8",[We.variable]:"fontSizes.md",[Le.variable]:"space.3"}})},Pn={subtle:G(e=>{var r;return{container:(r=ue.variants)==null?void 0:r.subtle(e)}}),solid:G(e=>{var r;return{container:(r=ue.variants)==null?void 0:r.solid(e)}}),outline:G(e=>{var r;return{container:(r=ue.variants)==null?void 0:r.outline(e)}})},Tn=kn({variants:Pn,baseStyle:Cn,sizes:An,defaultProps:{size:"md",variant:"subtle",colorScheme:"gray"}}),{definePartsStyle:D,defineMultiStyleConfig:Fn}=b(Xt.keys),In=D({field:{width:"100%",minWidth:0,outline:0,position:"relative",appearance:"none",transitionProperty:"common",transitionDuration:"normal",_disabled:{opacity:.4,cursor:"not-allowed"}}}),H={lg:t({fontSize:"lg",px:"4",h:"12",borderRadius:"md"}),md:t({fontSize:"md",px:"4",h:"10",borderRadius:"md"}),sm:t({fontSize:"sm",px:"3",h:"8",borderRadius:"sm"}),xs:t({fontSize:"xs",px:"2",h:"6",borderRadius:"sm"})},Mn={lg:D({field:H.lg,addon:H.lg}),md:D({field:H.md,addon:H.md}),sm:D({field:H.sm,addon:H.sm}),xs:D({field:H.xs,addon:H.xs})};function $r(e){const{focusBorderColor:r,errorBorderColor:a}=e;return{focusBorderColor:r||n("blue.500","blue.300")(e),errorBorderColor:a||n("red.500","red.300")(e)}}var Bn=D(e=>{const{theme:r}=e,{focusBorderColor:a,errorBorderColor:o}=$r(e);return{field:{border:"1px solid",borderColor:"inherit",bg:"inherit",_hover:{borderColor:n("gray.300","whiteAlpha.400")(e)},_readOnly:{boxShadow:"none !important",userSelect:"all"},_invalid:{borderColor:P(r,o),boxShadow:`0 0 0 1px ${P(r,o)}`},_focusVisible:{zIndex:1,borderColor:P(r,a),boxShadow:`0 0 0 1px ${P(r,a)}`}},addon:{border:"1px solid",borderColor:n("inherit","whiteAlpha.50")(e),bg:n("gray.100","whiteAlpha.300")(e)}}}),En=D(e=>{const{theme:r}=e,{focusBorderColor:a,errorBorderColor:o}=$r(e);return{field:{border:"2px solid",borderColor:"transparent",bg:n("gray.100","whiteAlpha.50")(e),_hover:{bg:n("gray.200","whiteAlpha.100")(e)},_readOnly:{boxShadow:"none !important",userSelect:"all"},_invalid:{borderColor:P(r,o)},_focusVisible:{bg:"transparent",borderColor:P(r,a)}},addon:{border:"2px solid",borderColor:"transparent",bg:n("gray.100","whiteAlpha.50")(e)}}}),Dn=D(e=>{const{theme:r}=e,{focusBorderColor:a,errorBorderColor:o}=$r(e);return{field:{borderBottom:"1px solid",borderColor:"inherit",borderRadius:"0",px:"0",bg:"transparent",_readOnly:{boxShadow:"none !important",userSelect:"all"},_invalid:{borderColor:P(r,o),boxShadow:`0px 1px 0px 0px ${P(r,o)}`},_focusVisible:{borderColor:P(r,a),boxShadow:`0px 1px 0px 0px ${P(r,a)}`}},addon:{borderBottom:"2px solid",borderColor:"inherit",borderRadius:"0",px:"0",bg:"transparent"}}}),jn=D({field:{bg:"transparent",px:"0",height:"auto"},addon:{bg:"transparent",px:"0",height:"auto"}}),Rn={outline:Bn,filled:En,flushed:Dn,unstyled:jn},u=Fn({baseStyle:In,sizes:Mn,variants:Rn,defaultProps:{size:"md",variant:"outline"}}),Rr,Hn=t({...(Rr=u.baseStyle)==null?void 0:Rr.field,paddingY:"2",minHeight:"20",lineHeight:"short",verticalAlign:"top"}),Hr,Wr,Wn={outline:t(e=>{var r,a;return(a=(r=u.variants)==null?void 0:r.outline(e).field)!=null?a:{}}),flushed:t(e=>{var r,a;return(a=(r=u.variants)==null?void 0:r.flushed(e).field)!=null?a:{}}),filled:t(e=>{var r,a;return(a=(r=u.variants)==null?void 0:r.filled(e).field)!=null?a:{}}),unstyled:(Wr=(Hr=u.variants)==null?void 0:Hr.unstyled.field)!=null?Wr:{}},Lr,Vr,qr,Or,Nr,Gr,Ur,Yr,Ln={xs:(Vr=(Lr=u.sizes)==null?void 0:Lr.xs.field)!=null?Vr:{},sm:(Or=(qr=u.sizes)==null?void 0:qr.sm.field)!=null?Or:{},md:(Gr=(Nr=u.sizes)==null?void 0:Nr.md.field)!=null?Gr:{},lg:(Yr=(Ur=u.sizes)==null?void 0:Ur.lg.field)!=null?Yr:{}},Vn=h({baseStyle:Hn,sizes:Ln,variants:Wn,defaultProps:{size:"md",variant:"outline"}}),ze=m("tooltip-bg"),ar=m("tooltip-fg"),qn=m("popper-arrow-bg"),On=t({bg:ze.reference,color:ar.reference,[ze.variable]:"colors.gray.700",[ar.variable]:"colors.whiteAlpha.900",_dark:{[ze.variable]:"colors.gray.300",[ar.variable]:"colors.gray.900"},[qn.variable]:ze.reference,px:"2",py:"0.5",borderRadius:"sm",fontWeight:"medium",fontSize:"sm",boxShadow:"md",maxW:"xs",zIndex:"tooltip"}),Nn=h({baseStyle:On}),{defineMultiStyleConfig:Gn,definePartsStyle:ce}=b(ao.keys),Un=t(e=>{const{colorScheme:r,theme:a,isIndeterminate:o,hasStripe:i}=e,l=n(Fr(),Fr("1rem","rgba(0,0,0,0.1)"))(e),s=n(`${r}.500`,`${r}.200`)(e),d=`linear-gradient( + to right, + transparent 0%, + ${P(a,s)} 50%, + transparent 100% + )`;return{...!o&&i&&l,...o?{bgImage:d}:{bgColor:s}}}),Yn=t({lineHeight:"1",fontSize:"0.25em",fontWeight:"bold",color:"white"}),Kn=t(e=>({bg:n("gray.100","whiteAlpha.300")(e)})),Xn=t(e=>({transitionProperty:"common",transitionDuration:"slow",...Un(e)})),Zn=ce(e=>({label:Yn,filledTrack:Xn(e),track:Kn(e)})),Jn={xs:ce({track:{h:"1"}}),sm:ce({track:{h:"2"}}),md:ce({track:{h:"3"}}),lg:ce({track:{h:"4"}})},Qn=Gn({sizes:Jn,baseStyle:Zn,defaultProps:{size:"md",colorScheme:"blue"}}),ei=e=>typeof e=="function";function k(e,...r){return ei(e)?e(...r):e}var{definePartsStyle:Ve,defineMultiStyleConfig:ri}=b(Nt.keys),fe=c("checkbox-size"),ai=t(e=>{const{colorScheme:r}=e;return{w:fe.reference,h:fe.reference,transitionProperty:"box-shadow",transitionDuration:"normal",border:"2px solid",borderRadius:"sm",borderColor:"inherit",color:"white",_checked:{bg:n(`${r}.500`,`${r}.200`)(e),borderColor:n(`${r}.500`,`${r}.200`)(e),color:n("white","gray.900")(e),_hover:{bg:n(`${r}.600`,`${r}.300`)(e),borderColor:n(`${r}.600`,`${r}.300`)(e)},_disabled:{borderColor:n("gray.200","transparent")(e),bg:n("gray.200","whiteAlpha.300")(e),color:n("gray.500","whiteAlpha.500")(e)}},_indeterminate:{bg:n(`${r}.500`,`${r}.200`)(e),borderColor:n(`${r}.500`,`${r}.200`)(e),color:n("white","gray.900")(e)},_disabled:{bg:n("gray.100","whiteAlpha.100")(e),borderColor:n("gray.100","transparent")(e)},_focusVisible:{boxShadow:"outline"},_invalid:{borderColor:n("red.500","red.300")(e)}}}),ti=t({_disabled:{cursor:"not-allowed"}}),oi=t({userSelect:"none",_disabled:{opacity:.4}}),ni=t({transitionProperty:"transform",transitionDuration:"normal"}),ii=Ve(e=>({icon:ni,container:ti,control:k(ai,e),label:oi})),li={sm:Ve({control:{[fe.variable]:"sizes.3"},label:{fontSize:"sm"},icon:{fontSize:"3xs"}}),md:Ve({control:{[fe.variable]:"sizes.4"},label:{fontSize:"md"},icon:{fontSize:"2xs"}}),lg:Ve({control:{[fe.variable]:"sizes.5"},label:{fontSize:"lg"},icon:{fontSize:"2xs"}})},Ue=ri({baseStyle:ii,sizes:li,defaultProps:{size:"md",colorScheme:"blue"}}),{defineMultiStyleConfig:si,definePartsStyle:qe}=b(to.keys),di=t(e=>{var r;const a=(r=k(Ue.baseStyle,e))==null?void 0:r.control;return{...a,borderRadius:"full",_checked:{...a==null?void 0:a._checked,_before:{content:'""',display:"inline-block",pos:"relative",w:"50%",h:"50%",borderRadius:"50%",bg:"currentColor"}}}}),ci=qe(e=>{var r,a,o,i;return{label:(a=(r=Ue).baseStyle)==null?void 0:a.call(r,e).label,container:(i=(o=Ue).baseStyle)==null?void 0:i.call(o,e).container,control:di(e)}}),bi={md:qe({control:{w:"4",h:"4"},label:{fontSize:"md"}}),lg:qe({control:{w:"5",h:"5"},label:{fontSize:"lg"}}),sm:qe({control:{width:"3",height:"3"},label:{fontSize:"sm"}})},vi=si({baseStyle:ci,sizes:bi,defaultProps:{size:"md",colorScheme:"blue"}}),{defineMultiStyleConfig:ui,definePartsStyle:fi}=b(oo.keys),Ce=c("select-bg"),Kr,mi=t({...(Kr=u.baseStyle)==null?void 0:Kr.field,appearance:"none",paddingBottom:"1px",lineHeight:"normal",bg:Ce.reference,[Ce.variable]:"colors.white",_dark:{[Ce.variable]:"colors.gray.700"},"> option, > optgroup":{bg:Ce.reference}}),hi=t({width:"6",height:"100%",insetEnd:"2",position:"relative",color:"currentColor",fontSize:"xl",_disabled:{opacity:.5}}),gi=fi({field:mi,icon:hi}),Ae=t({paddingInlineEnd:"8"}),Xr,Zr,Jr,Qr,ea,ra,aa,ta,yi={lg:{...(Xr=u.sizes)==null?void 0:Xr.lg,field:{...(Zr=u.sizes)==null?void 0:Zr.lg.field,...Ae}},md:{...(Jr=u.sizes)==null?void 0:Jr.md,field:{...(Qr=u.sizes)==null?void 0:Qr.md.field,...Ae}},sm:{...(ea=u.sizes)==null?void 0:ea.sm,field:{...(ra=u.sizes)==null?void 0:ra.sm.field,...Ae}},xs:{...(aa=u.sizes)==null?void 0:aa.xs,field:{...(ta=u.sizes)==null?void 0:ta.xs.field,...Ae},icon:{insetEnd:"1"}}},pi=ui({baseStyle:gi,sizes:yi,variants:u.variants,defaultProps:u.defaultProps}),tr=c("skeleton-start-color"),or=c("skeleton-end-color"),Si=t({[tr.variable]:"colors.gray.100",[or.variable]:"colors.gray.400",_dark:{[tr.variable]:"colors.gray.800",[or.variable]:"colors.gray.600"},background:tr.reference,borderColor:or.reference,opacity:.7,borderRadius:"sm"}),xi=h({baseStyle:Si}),nr=c("skip-link-bg"),$i=t({borderRadius:"md",fontWeight:"semibold",_focusVisible:{boxShadow:"outline",padding:"4",position:"fixed",top:"6",insetStart:"6",[nr.variable]:"colors.white",_dark:{[nr.variable]:"colors.gray.700"},bg:nr.reference}}),ki=h({baseStyle:$i}),{defineMultiStyleConfig:_i,definePartsStyle:Ze}=b(no.keys),ye=c("slider-thumb-size"),pe=c("slider-track-size"),L=c("slider-bg"),wi=t(e=>{const{orientation:r}=e;return{display:"inline-block",position:"relative",cursor:"pointer",_disabled:{opacity:.6,cursor:"default",pointerEvents:"none"},...Sr({orientation:r,vertical:{h:"100%"},horizontal:{w:"100%"}})}}),zi=t(e=>({...Sr({orientation:e.orientation,horizontal:{h:pe.reference},vertical:{w:pe.reference}}),overflow:"hidden",borderRadius:"sm",[L.variable]:"colors.gray.200",_dark:{[L.variable]:"colors.whiteAlpha.200"},_disabled:{[L.variable]:"colors.gray.300",_dark:{[L.variable]:"colors.whiteAlpha.300"}},bg:L.reference})),Ci=t(e=>{const{orientation:r}=e;return{...Sr({orientation:r,vertical:{left:"50%",transform:"translateX(-50%)",_active:{transform:"translateX(-50%) scale(1.15)"}},horizontal:{top:"50%",transform:"translateY(-50%)",_active:{transform:"translateY(-50%) scale(1.15)"}}}),w:ye.reference,h:ye.reference,display:"flex",alignItems:"center",justifyContent:"center",position:"absolute",outline:0,zIndex:1,borderRadius:"full",bg:"white",boxShadow:"base",border:"1px solid",borderColor:"transparent",transitionProperty:"transform",transitionDuration:"normal",_focusVisible:{boxShadow:"outline"},_disabled:{bg:"gray.300"}}}),Ai=t(e=>{const{colorScheme:r}=e;return{width:"inherit",height:"inherit",[L.variable]:`colors.${r}.500`,_dark:{[L.variable]:`colors.${r}.200`},bg:L.reference}}),Pi=Ze(e=>({container:wi(e),track:zi(e),thumb:Ci(e),filledTrack:Ai(e)})),Ti=Ze({container:{[ye.variable]:"sizes.4",[pe.variable]:"sizes.1"}}),Fi=Ze({container:{[ye.variable]:"sizes.3.5",[pe.variable]:"sizes.1"}}),Ii=Ze({container:{[ye.variable]:"sizes.2.5",[pe.variable]:"sizes.0.5"}}),Mi={lg:Ti,md:Fi,sm:Ii},Bi=_i({baseStyle:Pi,sizes:Mi,defaultProps:{size:"md",colorScheme:"blue"}}),q=m("spinner-size"),Ei=t({width:[q.reference],height:[q.reference]}),Di={xs:t({[q.variable]:"sizes.3"}),sm:t({[q.variable]:"sizes.4"}),md:t({[q.variable]:"sizes.6"}),lg:t({[q.variable]:"sizes.8"}),xl:t({[q.variable]:"sizes.12"})},ji=h({baseStyle:Ei,sizes:Di,defaultProps:{size:"md"}}),{defineMultiStyleConfig:Ri,definePartsStyle:xa}=b(io.keys),Hi=t({fontWeight:"medium"}),Wi=t({opacity:.8,marginBottom:"2"}),Li=t({verticalAlign:"baseline",fontWeight:"semibold"}),Vi=t({marginEnd:1,w:"3.5",h:"3.5",verticalAlign:"middle"}),qi=xa({container:{},label:Hi,helpText:Wi,number:Li,icon:Vi}),Oi={md:xa({label:{fontSize:"sm"},helpText:{fontSize:"sm"},number:{fontSize:"2xl"}})},Ni=Ri({baseStyle:qi,sizes:Oi,defaultProps:{size:"md"}}),ir=c("kbd-bg"),Gi=t({[ir.variable]:"colors.gray.100",_dark:{[ir.variable]:"colors.whiteAlpha.100"},bg:ir.reference,borderRadius:"md",borderWidth:"1px",borderBottomWidth:"3px",fontSize:"0.8em",fontWeight:"bold",lineHeight:"normal",px:"0.4em",whiteSpace:"nowrap"}),Ui=h({baseStyle:Gi}),Yi=t({transitionProperty:"common",transitionDuration:"fast",transitionTimingFunction:"ease-out",cursor:"pointer",textDecoration:"none",outline:"none",color:"inherit",_hover:{textDecoration:"underline"},_focusVisible:{boxShadow:"outline"}}),Ki=h({baseStyle:Yi}),{defineMultiStyleConfig:Xi,definePartsStyle:Zi}=b(Zt.keys),Ji=t({marginEnd:"2",display:"inline",verticalAlign:"text-bottom"}),Qi=Zi({icon:Ji}),el=Xi({baseStyle:Qi}),{defineMultiStyleConfig:rl,definePartsStyle:al}=b(Jt.keys),I=c("menu-bg"),lr=c("menu-shadow"),tl=t({[I.variable]:"#fff",[lr.variable]:"shadows.sm",_dark:{[I.variable]:"colors.gray.700",[lr.variable]:"shadows.dark-lg"},color:"inherit",minW:"3xs",py:"2",zIndex:1,borderRadius:"md",borderWidth:"1px",bg:I.reference,boxShadow:lr.reference}),ol=t({py:"1.5",px:"3",transitionProperty:"background",transitionDuration:"ultra-fast",transitionTimingFunction:"ease-in",_focus:{[I.variable]:"colors.gray.100",_dark:{[I.variable]:"colors.whiteAlpha.100"}},_active:{[I.variable]:"colors.gray.200",_dark:{[I.variable]:"colors.whiteAlpha.200"}},_expanded:{[I.variable]:"colors.gray.100",_dark:{[I.variable]:"colors.whiteAlpha.100"}},_disabled:{opacity:.4,cursor:"not-allowed"},bg:I.reference}),nl=t({mx:4,my:2,fontWeight:"semibold",fontSize:"sm"}),il=t({opacity:.6}),ll=t({border:0,borderBottom:"1px solid",borderColor:"inherit",my:"2",opacity:.6}),sl=t({transitionProperty:"common",transitionDuration:"normal"}),dl=al({button:sl,list:tl,item:ol,groupTitle:nl,command:il,divider:ll}),cl=rl({baseStyle:dl}),{defineMultiStyleConfig:bl,definePartsStyle:yr}=b(Qt.keys),sr=c("modal-bg"),dr=c("modal-shadow"),vl=t({bg:"blackAlpha.600",zIndex:"modal"}),ul=t(e=>{const{isCentered:r,scrollBehavior:a}=e;return{display:"flex",zIndex:"modal",justifyContent:"center",alignItems:r?"center":"flex-start",overflow:a==="inside"?"hidden":"auto",overscrollBehaviorY:"none"}}),fl=t(e=>{const{isCentered:r,scrollBehavior:a}=e;return{borderRadius:"md",color:"inherit",my:r?"auto":"16",mx:r?"auto":void 0,zIndex:"modal",maxH:a==="inside"?"calc(100% - 7.5rem)":void 0,[sr.variable]:"colors.white",[dr.variable]:"shadows.lg",_dark:{[sr.variable]:"colors.gray.700",[dr.variable]:"shadows.dark-lg"},bg:sr.reference,boxShadow:dr.reference}}),ml=t({px:"6",py:"4",fontSize:"xl",fontWeight:"semibold"}),hl=t({position:"absolute",top:"2",insetEnd:"3"}),gl=t(e=>{const{scrollBehavior:r}=e;return{px:"6",py:"2",flex:"1",overflow:r==="inside"?"auto":void 0}}),yl=t({px:"6",py:"4"}),pl=yr(e=>({overlay:vl,dialogContainer:k(ul,e),dialog:k(fl,e),header:ml,closeButton:hl,body:k(gl,e),footer:yl}));function C(e){return yr(e==="full"?{dialog:{maxW:"100vw",minH:"$100vh",my:"0",borderRadius:"0"}}:{dialog:{maxW:e}})}var Sl={xs:C("xs"),sm:C("sm"),md:C("md"),lg:C("lg"),xl:C("xl"),"2xl":C("2xl"),"3xl":C("3xl"),"4xl":C("4xl"),"5xl":C("5xl"),"6xl":C("6xl"),full:C("full")},xl=bl({baseStyle:pl,sizes:Sl,defaultProps:{size:"md"}}),{defineMultiStyleConfig:$l,definePartsStyle:$a}=b(eo.keys),kr=m("number-input-stepper-width"),ka=m("number-input-input-padding"),kl=E(kr).add("0.5rem").toString(),cr=m("number-input-bg"),br=m("number-input-color"),vr=m("number-input-border-color"),_l=t({[kr.variable]:"sizes.6",[ka.variable]:kl}),wl=t(e=>{var r,a;return(a=(r=k(u.baseStyle,e))==null?void 0:r.field)!=null?a:{}}),zl=t({width:kr.reference}),Cl=t({borderStart:"1px solid",borderStartColor:vr.reference,color:br.reference,bg:cr.reference,[br.variable]:"colors.chakra-body-text",[vr.variable]:"colors.chakra-border-color",_dark:{[br.variable]:"colors.whiteAlpha.800",[vr.variable]:"colors.whiteAlpha.300"},_active:{[cr.variable]:"colors.gray.200",_dark:{[cr.variable]:"colors.whiteAlpha.300"}},_disabled:{opacity:.4,cursor:"not-allowed"}}),Al=$a(e=>{var r;return{root:_l,field:(r=k(wl,e))!=null?r:{},stepperGroup:zl,stepper:Cl}});function Pe(e){var r,a,o;const i=(r=u.sizes)==null?void 0:r[e],l={lg:"md",md:"md",sm:"sm",xs:"sm"},s=(o=(a=i.field)==null?void 0:a.fontSize)!=null?o:"md",d=ha.fontSizes[s];return $a({field:{...i.field,paddingInlineEnd:ka.reference,verticalAlign:"top"},stepper:{fontSize:E(d).multiply(.75).toString(),_first:{borderTopEndRadius:l[e]},_last:{borderBottomEndRadius:l[e],mt:"-1px",borderTopWidth:1}}})}var Pl={xs:Pe("xs"),sm:Pe("sm"),md:Pe("md"),lg:Pe("lg")},Tl=$l({baseStyle:Al,sizes:Pl,variants:u.variants,defaultProps:u.defaultProps}),oa,Fl=t({...(oa=u.baseStyle)==null?void 0:oa.field,textAlign:"center"}),Il={lg:t({fontSize:"lg",w:12,h:12,borderRadius:"md"}),md:t({fontSize:"md",w:10,h:10,borderRadius:"md"}),sm:t({fontSize:"sm",w:8,h:8,borderRadius:"sm"}),xs:t({fontSize:"xs",w:6,h:6,borderRadius:"sm"})},na,ia,Ml={outline:t(e=>{var r,a,o;return(o=(a=k((r=u.variants)==null?void 0:r.outline,e))==null?void 0:a.field)!=null?o:{}}),flushed:t(e=>{var r,a,o;return(o=(a=k((r=u.variants)==null?void 0:r.flushed,e))==null?void 0:a.field)!=null?o:{}}),filled:t(e=>{var r,a,o;return(o=(a=k((r=u.variants)==null?void 0:r.filled,e))==null?void 0:a.field)!=null?o:{}}),unstyled:(ia=(na=u.variants)==null?void 0:na.unstyled.field)!=null?ia:{}},Bl=h({baseStyle:Fl,sizes:Il,variants:Ml,defaultProps:u.defaultProps}),{defineMultiStyleConfig:El,definePartsStyle:Dl}=b(ro.keys),Te=m("popper-bg"),jl=m("popper-arrow-bg"),la=m("popper-arrow-shadow-color"),Rl=t({zIndex:10}),Hl=t({[Te.variable]:"colors.white",bg:Te.reference,[jl.variable]:Te.reference,[la.variable]:"colors.gray.200",_dark:{[Te.variable]:"colors.gray.700",[la.variable]:"colors.whiteAlpha.300"},width:"xs",border:"1px solid",borderColor:"inherit",borderRadius:"md",boxShadow:"sm",zIndex:"inherit",_focusVisible:{outline:0,boxShadow:"outline"}}),Wl=t({px:3,py:2,borderBottomWidth:"1px"}),Ll=t({px:3,py:2}),Vl=t({px:3,py:2,borderTopWidth:"1px"}),ql=t({position:"absolute",borderRadius:"md",top:1,insetEnd:2,padding:2}),Ol=Dl({popper:Rl,content:Hl,header:Wl,body:Ll,footer:Vl,closeButton:ql}),Nl=El({baseStyle:Ol}),{definePartsStyle:pr,defineMultiStyleConfig:Gl}=b(Gt.keys),ur=c("drawer-bg"),fr=c("drawer-box-shadow");function Y(e){return pr(e==="full"?{dialog:{maxW:"100vw",h:"100vh"}}:{dialog:{maxW:e}})}var Ul=t({bg:"blackAlpha.600",zIndex:"overlay"}),Yl=t({display:"flex",zIndex:"modal",justifyContent:"center"}),Kl=t(e=>{const{isFullHeight:r}=e;return{...r&&{height:"100vh"},zIndex:"modal",maxH:"100vh",color:"inherit",[ur.variable]:"colors.white",[fr.variable]:"shadows.lg",_dark:{[ur.variable]:"colors.gray.700",[fr.variable]:"shadows.dark-lg"},bg:ur.reference,boxShadow:fr.reference}}),Xl=t({px:"6",py:"4",fontSize:"xl",fontWeight:"semibold"}),Zl=t({position:"absolute",top:"2",insetEnd:"3"}),Jl=t({px:"6",py:"2",flex:"1",overflow:"auto"}),Ql=t({px:"6",py:"4"}),es=pr(e=>({overlay:Ul,dialogContainer:Yl,dialog:k(Kl,e),header:Xl,closeButton:Zl,body:Jl,footer:Ql})),rs={xs:Y("xs"),sm:Y("md"),md:Y("lg"),lg:Y("2xl"),xl:Y("4xl"),full:Y("full")},as=Gl({baseStyle:es,sizes:rs,defaultProps:{size:"xs"}}),{definePartsStyle:ts,defineMultiStyleConfig:os}=b(Ut.keys),ns=t({borderRadius:"md",py:"1",transitionProperty:"common",transitionDuration:"normal"}),is=t({borderRadius:"md",py:"1",transitionProperty:"common",transitionDuration:"normal",width:"full",_focusVisible:{boxShadow:"outline"},_placeholder:{opacity:.6}}),ls=t({borderRadius:"md",py:"1",transitionProperty:"common",transitionDuration:"normal",width:"full",_focusVisible:{boxShadow:"outline"},_placeholder:{opacity:.6}}),ss=ts({preview:ns,input:is,textarea:ls}),ds=os({baseStyle:ss}),{definePartsStyle:cs,defineMultiStyleConfig:bs}=b(Yt.keys),J=c("form-control-color"),vs=t({marginStart:"1",[J.variable]:"colors.red.500",_dark:{[J.variable]:"colors.red.300"},color:J.reference}),us=t({mt:"2",[J.variable]:"colors.gray.600",_dark:{[J.variable]:"colors.whiteAlpha.600"},color:J.reference,lineHeight:"normal",fontSize:"sm"}),fs=cs({container:{width:"100%",position:"relative"},requiredIndicator:vs,helperText:us}),ms=bs({baseStyle:fs}),{definePartsStyle:hs,defineMultiStyleConfig:gs}=b(Kt.keys),Q=c("form-error-color"),ys=t({[Q.variable]:"colors.red.500",_dark:{[Q.variable]:"colors.red.300"},color:Q.reference,mt:"2",fontSize:"sm",lineHeight:"normal"}),ps=t({marginEnd:"0.5em",[Q.variable]:"colors.red.500",_dark:{[Q.variable]:"colors.red.300"},color:Q.reference}),Ss=hs({text:ys,icon:ps}),xs=gs({baseStyle:Ss}),$s=t({fontSize:"md",marginEnd:"3",mb:"2",fontWeight:"medium",transitionProperty:"common",transitionDuration:"normal",opacity:1,_disabled:{opacity:.4}}),ks=h({baseStyle:$s}),_s=t({fontFamily:"heading",fontWeight:"bold"}),ws={"4xl":t({fontSize:["6xl",null,"7xl"],lineHeight:1}),"3xl":t({fontSize:["5xl",null,"6xl"],lineHeight:1}),"2xl":t({fontSize:["4xl",null,"5xl"],lineHeight:[1.2,null,1]}),xl:t({fontSize:["3xl",null,"4xl"],lineHeight:[1.33,null,1.2]}),lg:t({fontSize:["2xl",null,"3xl"],lineHeight:[1.33,null,1.2]}),md:t({fontSize:"xl",lineHeight:1.2}),sm:t({fontSize:"md",lineHeight:1.2}),xs:t({fontSize:"sm",lineHeight:1.2})},zs=h({baseStyle:_s,sizes:ws,defaultProps:{size:"xl"}}),{defineMultiStyleConfig:Cs,definePartsStyle:As}=b(Ot.keys),mr=c("breadcrumb-link-decor"),Ps=t({transitionProperty:"common",transitionDuration:"fast",transitionTimingFunction:"ease-out",outline:"none",color:"inherit",textDecoration:mr.reference,[mr.variable]:"none","&:not([aria-current=page])":{cursor:"pointer",_hover:{[mr.variable]:"underline"},_focusVisible:{boxShadow:"outline"}}}),Ts=As({link:Ps}),Fs=Cs({baseStyle:Ts}),Is=t({lineHeight:"1.2",borderRadius:"md",fontWeight:"semibold",transitionProperty:"common",transitionDuration:"normal",_focusVisible:{boxShadow:"outline"},_disabled:{opacity:.4,cursor:"not-allowed",boxShadow:"none"},_hover:{_disabled:{bg:"initial"}}}),_a=t(e=>{const{colorScheme:r,theme:a}=e;if(r==="gray")return{color:n("gray.800","whiteAlpha.900")(e),_hover:{bg:n("gray.100","whiteAlpha.200")(e)},_active:{bg:n("gray.200","whiteAlpha.300")(e)}};const o=re(`${r}.200`,.12)(a),i=re(`${r}.200`,.24)(a);return{color:n(`${r}.600`,`${r}.200`)(e),bg:"transparent",_hover:{bg:n(`${r}.50`,o)(e)},_active:{bg:n(`${r}.100`,i)(e)}}}),Ms=t(e=>{const{colorScheme:r}=e,a=n("gray.200","whiteAlpha.300")(e);return{border:"1px solid",borderColor:r==="gray"?a:"currentColor",".chakra-button__group[data-attached][data-orientation=horizontal] > &:not(:last-of-type)":{marginEnd:"-1px"},".chakra-button__group[data-attached][data-orientation=vertical] > &:not(:last-of-type)":{marginBottom:"-1px"},...k(_a,e)}}),Bs={yellow:{bg:"yellow.400",color:"black",hoverBg:"yellow.500",activeBg:"yellow.600"},cyan:{bg:"cyan.400",color:"black",hoverBg:"cyan.500",activeBg:"cyan.600"}},Es=t(e=>{var r;const{colorScheme:a}=e;if(a==="gray"){const v=n("gray.100","whiteAlpha.200")(e);return{bg:v,color:n("gray.800","whiteAlpha.900")(e),_hover:{bg:n("gray.200","whiteAlpha.300")(e),_disabled:{bg:v}},_active:{bg:n("gray.300","whiteAlpha.400")(e)}}}const{bg:o=`${a}.500`,color:i="white",hoverBg:l=`${a}.600`,activeBg:s=`${a}.700`}=(r=Bs[a])!=null?r:{},d=n(o,`${a}.200`)(e);return{bg:d,color:n(i,"gray.800")(e),_hover:{bg:n(l,`${a}.300`)(e),_disabled:{bg:d}},_active:{bg:n(s,`${a}.400`)(e)}}}),Ds=t(e=>{const{colorScheme:r}=e;return{padding:0,height:"auto",lineHeight:"normal",verticalAlign:"baseline",color:n(`${r}.500`,`${r}.200`)(e),_hover:{textDecoration:"underline",_disabled:{textDecoration:"none"}},_active:{color:n(`${r}.700`,`${r}.500`)(e)}}}),js=t({bg:"none",color:"inherit",display:"inline",lineHeight:"inherit",m:"0",p:"0"}),Rs={ghost:_a,outline:Ms,solid:Es,link:Ds,unstyled:js},Hs={lg:t({h:"12",minW:"12",fontSize:"lg",px:"6"}),md:t({h:"10",minW:"10",fontSize:"md",px:"4"}),sm:t({h:"8",minW:"8",fontSize:"sm",px:"3"}),xs:t({h:"6",minW:"6",fontSize:"xs",px:"2"})},Ws=h({baseStyle:Is,variants:Rs,sizes:Hs,defaultProps:{variant:"solid",size:"md",colorScheme:"gray"}}),{definePartsStyle:U,defineMultiStyleConfig:Ls}=b(vo.keys),Ye=c("card-bg"),j=c("card-padding"),wa=c("card-shadow"),Oe=c("card-radius"),za=c("card-border-width","0"),Ca=c("card-border-color"),Vs=U({container:{[Ye.variable]:"colors.chakra-body-bg",backgroundColor:Ye.reference,boxShadow:wa.reference,borderRadius:Oe.reference,color:"chakra-body-text",borderWidth:za.reference,borderColor:Ca.reference},body:{padding:j.reference,flex:"1 1 0%"},header:{padding:j.reference},footer:{padding:j.reference}}),qs={sm:U({container:{[Oe.variable]:"radii.base",[j.variable]:"space.3"}}),md:U({container:{[Oe.variable]:"radii.md",[j.variable]:"space.5"}}),lg:U({container:{[Oe.variable]:"radii.xl",[j.variable]:"space.7"}})},Os={elevated:U({container:{[wa.variable]:"shadows.base",_dark:{[Ye.variable]:"colors.gray.700"}}}),outline:U({container:{[za.variable]:"1px",[Ca.variable]:"colors.chakra-border-color"}}),filled:U({container:{[Ye.variable]:"colors.chakra-subtle-bg"}}),unstyled:{body:{[j.variable]:0},header:{[j.variable]:0},footer:{[j.variable]:0}}},Ns=Ls({baseStyle:Vs,variants:Os,sizes:qs,defaultProps:{variant:"elevated",size:"md"}}),me=m("close-button-size"),ie=m("close-button-bg"),Gs=t({w:[me.reference],h:[me.reference],borderRadius:"md",transitionProperty:"common",transitionDuration:"normal",_disabled:{opacity:.4,cursor:"not-allowed",boxShadow:"none"},_hover:{[ie.variable]:"colors.blackAlpha.100",_dark:{[ie.variable]:"colors.whiteAlpha.100"}},_active:{[ie.variable]:"colors.blackAlpha.200",_dark:{[ie.variable]:"colors.whiteAlpha.200"}},_focusVisible:{boxShadow:"outline"},bg:ie.reference}),Us={lg:t({[me.variable]:"sizes.10",fontSize:"md"}),md:t({[me.variable]:"sizes.8",fontSize:"xs"}),sm:t({[me.variable]:"sizes.6",fontSize:"2xs"})},Ys=h({baseStyle:Gs,sizes:Us,defaultProps:{size:"md"}}),{variants:Ks,defaultProps:Xs}=ue,Zs=t({fontFamily:"mono",fontSize:"sm",px:"0.2em",borderRadius:"sm",bg:y.bg.reference,color:y.color.reference,boxShadow:y.shadow.reference}),Js=h({baseStyle:Zs,variants:Ks,defaultProps:Xs}),Qs=t({w:"100%",mx:"auto",maxW:"prose",px:"4"}),e0=h({baseStyle:Qs}),r0=t({opacity:.6,borderColor:"inherit"}),a0=t({borderStyle:"solid"}),t0=t({borderStyle:"dashed"}),o0={solid:a0,dashed:t0},n0=h({baseStyle:r0,variants:o0,defaultProps:{variant:"solid"}}),{definePartsStyle:i0,defineMultiStyleConfig:l0}=b(Lt.keys),s0=t({borderTopWidth:"1px",borderColor:"inherit",_last:{borderBottomWidth:"1px"}}),d0=t({transitionProperty:"common",transitionDuration:"normal",fontSize:"md",_focusVisible:{boxShadow:"outline"},_hover:{bg:"blackAlpha.50"},_disabled:{opacity:.4,cursor:"not-allowed"},px:"4",py:"2"}),c0=t({pt:"2",px:"4",pb:"5"}),b0=t({fontSize:"1.25em"}),v0=i0({container:s0,button:d0,panel:c0,icon:b0}),u0=l0({baseStyle:v0}),{definePartsStyle:xe,defineMultiStyleConfig:f0}=b(Vt.keys),w=c("alert-fg"),R=c("alert-bg"),m0=xe({container:{bg:R.reference,px:"4",py:"3"},title:{fontWeight:"bold",lineHeight:"6",marginEnd:"2"},description:{lineHeight:"6"},icon:{color:w.reference,flexShrink:0,marginEnd:"3",w:"5",h:"6"},spinner:{color:w.reference,flexShrink:0,marginEnd:"3",w:"5",h:"5"}});function _r(e){const{theme:r,colorScheme:a}=e,o=re(`${a}.200`,.16)(r);return{light:`colors.${a}.100`,dark:o}}var h0=xe(e=>{const{colorScheme:r}=e,a=_r(e);return{container:{[w.variable]:`colors.${r}.500`,[R.variable]:a.light,_dark:{[w.variable]:`colors.${r}.200`,[R.variable]:a.dark}}}}),g0=xe(e=>{const{colorScheme:r}=e,a=_r(e);return{container:{[w.variable]:`colors.${r}.500`,[R.variable]:a.light,_dark:{[w.variable]:`colors.${r}.200`,[R.variable]:a.dark},paddingStart:"3",borderStartWidth:"4px",borderStartColor:w.reference}}}),y0=xe(e=>{const{colorScheme:r}=e,a=_r(e);return{container:{[w.variable]:`colors.${r}.500`,[R.variable]:a.light,_dark:{[w.variable]:`colors.${r}.200`,[R.variable]:a.dark},pt:"2",borderTopWidth:"4px",borderTopColor:w.reference}}}),p0=xe(e=>{const{colorScheme:r}=e;return{container:{[w.variable]:"colors.white",[R.variable]:`colors.${r}.500`,_dark:{[w.variable]:"colors.gray.900",[R.variable]:`colors.${r}.200`},color:w.reference}}}),S0={subtle:h0,"left-accent":g0,"top-accent":y0,solid:p0},x0=f0({baseStyle:m0,variants:S0,defaultProps:{variant:"subtle",colorScheme:"blue"}}),{definePartsStyle:Aa,defineMultiStyleConfig:$0}=b(qt.keys),ee=c("avatar-border-color"),he=c("avatar-bg"),Se=c("avatar-font-size"),ae=c("avatar-size"),k0=t({borderRadius:"full",border:"0.2em solid",borderColor:ee.reference,[ee.variable]:"white",_dark:{[ee.variable]:"colors.gray.800"}}),_0=t({bg:he.reference,fontSize:Se.reference,width:ae.reference,height:ae.reference,lineHeight:"1",[he.variable]:"colors.gray.200",_dark:{[he.variable]:"colors.whiteAlpha.400"}}),w0=t(e=>{const{name:r,theme:a}=e,o=r?Io({string:r}):"colors.gray.400",i=To(o)(a);let l="white";return i||(l="gray.800"),{bg:he.reference,fontSize:Se.reference,color:l,borderColor:ee.reference,verticalAlign:"top",width:ae.reference,height:ae.reference,"&:not([data-loaded])":{[he.variable]:o},[ee.variable]:"colors.white",_dark:{[ee.variable]:"colors.gray.800"}}}),z0=t({fontSize:Se.reference,lineHeight:"1"}),C0=Aa(e=>({badge:k(k0,e),excessLabel:k(_0,e),container:k(w0,e),label:z0}));function W(e){const r=e!=="100%"?ya[e]:void 0;return Aa({container:{[ae.variable]:r??e,[Se.variable]:`calc(${r??e} / 2.5)`},excessLabel:{[ae.variable]:r??e,[Se.variable]:`calc(${r??e} / 2.5)`}})}var A0={"2xs":W(4),xs:W(6),sm:W(8),md:W(12),lg:W(16),xl:W(24),"2xl":W(32),full:W("100%")},P0=$0({baseStyle:C0,sizes:A0,defaultProps:{size:"md"}}),T0={Accordion:u0,Alert:x0,Avatar:P0,Badge:ue,Breadcrumb:Fs,Button:Ws,Checkbox:Ue,CloseButton:Ys,Code:Js,Container:e0,Divider:n0,Drawer:as,Editable:ds,Form:ms,FormError:xs,FormLabel:ks,Heading:zs,Input:u,Kbd:Ui,Link:Ki,List:el,Menu:cl,Modal:xl,NumberInput:Tl,PinInput:Bl,Popover:Nl,Progress:Qn,Radio:vi,Select:pi,Skeleton:xi,SkipLink:ki,Slider:Bi,Spinner:ji,Stat:Ni,Switch:Yo,Table:rn,Tabs:gn,Tag:Tn,Textarea:Vn,Tooltip:Nn,Card:Ns,Stepper:Wt},F0={colors:{"chakra-body-text":{_light:"gray.800",_dark:"whiteAlpha.900"},"chakra-body-bg":{_light:"white",_dark:"gray.800"},"chakra-border-color":{_light:"gray.200",_dark:"whiteAlpha.300"},"chakra-inverse-text":{_light:"white",_dark:"gray.800"},"chakra-subtle-bg":{_light:"gray.100",_dark:"gray.700"},"chakra-subtle-text":{_light:"gray.600",_dark:"gray.400"},"chakra-placeholder-color":{_light:"gray.500",_dark:"whiteAlpha.400"}}},I0={global:{body:{fontFamily:"body",color:"chakra-body-text",bg:"chakra-body-bg",transitionProperty:"background-color",transitionDuration:"normal",lineHeight:"base"},"*::placeholder":{color:"chakra-placeholder-color"},"*, *::before, &::after":{borderColor:"chakra-border-color"}}},M0="ltr",B0={useSystemColorMode:!1,initialColorMode:"light",cssVarPrefix:"chakra"},Pa={semanticTokens:F0,direction:M0,...jt,components:T0,styles:I0,config:B0};function be(e){return typeof e=="function"}function E0(...e){return r=>e.reduce((a,o)=>o(a),r)}var D0=e=>function(...a){let o=[...a],i=a[a.length-1];return ut(i)&&o.length>1?o=o.slice(0,o.length-1):i=e,E0(...o.map(l=>s=>be(l)?l(s):R0(s,l)))(i)},j0=D0(Pa);function R0(...e){return ba({},...e,Ta)}function Ta(e,r,a,o){if((be(e)||be(r))&&Object.prototype.hasOwnProperty.call(o,a))return(...i)=>{const l=be(e)?e(...i):e,s=be(r)?r(...i):r;return ba({},l,s,Ta)}}function H0(e={}){const{strict:r=!0,errorMessage:a="useContext: `context` is undefined. Seems you forgot to wrap component within the Provider",name:o}=e,i=x.createContext(void 0);i.displayName=o;function l(){var s;const d=x.useContext(i);if(!d&&r){const v=new Error(a);throw v.name="ContextError",(s=Error.captureStackTrace)==null||s.call(Error,v,l),v}return d}return[i.Provider,l,i]}function W0(e){const{cssVarsRoot:r,theme:a,children:o}=e,i=x.useMemo(()=>Ra(a),[a]);return g.jsxs(Ha,{theme:i,children:[g.jsx(L0,{root:r}),o]})}function L0({root:e=":host, :root"}){const r=[e,"[data-theme]"].join(",");return g.jsx(Ke,{styles:a=>({[r]:a.__cssVars})})}H0({name:"StylesContext",errorMessage:"useStyles: `styles` is undefined. Seems you forgot to wrap the components in `` "});function V0(){const{colorMode:e}=Wa();return g.jsx(Ke,{styles:r=>{const a=La(r,"styles.global"),o=Va(a,{theme:r,colorMode:e});return o?qa(o)(r):void 0}})}var Fa=x.createContext({getDocument(){return document},getWindow(){return window}});Fa.displayName="EnvironmentContext";function Ia(e){const{children:r,environment:a,disabled:o}=e,i=x.useRef(null),l=x.useMemo(()=>a||{getDocument:()=>{var d,v;return(v=(d=i.current)==null?void 0:d.ownerDocument)!=null?v:document},getWindow:()=>{var d,v;return(v=(d=i.current)==null?void 0:d.ownerDocument.defaultView)!=null?v:window}},[a]),s=!o||!a;return g.jsxs(Fa.Provider,{value:l,children:[r,s&&g.jsx("span",{id:"__chakra_env",hidden:!0,ref:i})]})}Ia.displayName="EnvironmentProvider";var q0=e=>{const{children:r,colorModeManager:a,portalZIndex:o,resetScope:i,resetCSS:l=!0,theme:s={},environment:d,cssVarsRoot:v,disableEnvironment:$,disableGlobalStyle:p}=e,S=g.jsx(Ia,{environment:d,disabled:$,children:r});return g.jsx(W0,{theme:s,cssVarsRoot:v,children:g.jsxs(ma,{colorModeManager:a,options:s.config,children:[l?g.jsx(st,{scope:i}):g.jsx(lt,{}),!p&&g.jsx(V0,{}),o?g.jsx(Oa,{zIndex:o,children:S}):S]})})},O0=e=>function({children:a,theme:o=e,toastOptions:i,...l}){return g.jsxs(q0,{theme:o,...l,children:[g.jsx(Na,{value:i==null?void 0:i.defaultOptions,children:a}),g.jsx(Ga,{...i})]})},N0=O0(Pa);function z(e,r,a=!1){e=String(e),r=String(r);const o=Array.from({length:21},(s,d)=>d*50),i=[0,5,10,15,20,25,30,35,40,45,50,55,59,64,68,73,77,82,86,95,100];return o.reduce((s,d,v)=>{const $=a?i[v]/100:1,p=a?50:i[o.length-1-v];return s[d]=`hsl(${e} ${r}% ${p}% / ${$})`,s},{})}const Fe={H:220,S:16},Ie={H:250,S:52},Me={H:47,S:50},Be={H:28,S:50},Ee={H:113,S:50},De={H:0,S:50},G0={base:z(Fe.H,Fe.S),baseAlpha:z(Fe.H,Fe.S,!0),accent:z(Ie.H,Ie.S),accentAlpha:z(Ie.H,Ie.S,!0),working:z(Me.H,Me.S),workingAlpha:z(Me.H,Me.S,!0),warning:z(Be.H,Be.S),warningAlpha:z(Be.H,Be.S,!0),ok:z(Ee.H,Ee.S),okAlpha:z(Ee.H,Ee.S,!0),error:z(De.H,De.S),errorAlpha:z(De.H,De.S,!0)},{definePartsStyle:U0,defineMultiStyleConfig:Y0}=b(Ya.keys),K0=t({border:"none"}),X0=t(e=>{const{colorScheme:r}=e;return{fontWeight:"600",fontSize:"sm",border:"none",borderRadius:"base",bg:n(`${r}.200`,`${r}.700`)(e),color:n(`${r}.900`,`${r}.100`)(e),_hover:{bg:n(`${r}.250`,`${r}.650`)(e)},_expanded:{bg:n(`${r}.250`,`${r}.650`)(e),borderBottomRadius:"none",_hover:{bg:n(`${r}.300`,`${r}.600`)(e)}}}}),Z0=t(e=>{const{colorScheme:r}=e;return{bg:n(`${r}.100`,`${r}.800`)(e),borderRadius:"base",borderTopRadius:"none"}}),J0=t({}),Q0=U0(e=>({container:K0,button:X0(e),panel:Z0(e),icon:J0})),ed=Y0({variants:{invokeAI:Q0},defaultProps:{variant:"invokeAI",colorScheme:"base"}}),rd=t(e=>{const{colorScheme:r}=e;if(r==="base"){const o={bg:n("base.150","base.700")(e),color:n("base.500","base.500")(e),svg:{fill:n("base.500","base.500")(e)},opacity:1};return{bg:n("base.250","base.600")(e),color:n("base.850","base.100")(e),borderRadius:"base",svg:{fill:n("base.850","base.100")(e)},_hover:{bg:n("base.300","base.500")(e),color:n("base.900","base.50")(e),svg:{fill:n("base.900","base.50")(e)},_disabled:o},_disabled:o}}const a={bg:n(`${r}.250`,`${r}.700`)(e),color:n(`${r}.50`,`${r}.500`)(e),svg:{fill:n(`${r}.50`,`${r}.500`)(e),filter:"unset"},opacity:1,filter:n(void 0,"saturate(65%)")(e)};return{bg:n(`${r}.400`,`${r}.600`)(e),color:n("base.50","base.100")(e),borderRadius:"base",svg:{fill:n("base.50","base.100")(e)},_disabled:a,_hover:{bg:n(`${r}.500`,`${r}.500`)(e),color:n("white","base.50")(e),svg:{fill:n("white","base.50")(e)},_disabled:a}}}),ad=h({variants:{invokeAI:rd},defaultProps:{variant:"invokeAI",colorScheme:"base"}}),{definePartsStyle:td,defineMultiStyleConfig:od}=b(Ka.keys),nd=t(e=>{const{colorScheme:r}=e;return{bg:n("base.200","base.700")(e),borderColor:n("base.200","base.700")(e),color:n("base.900","base.100")(e),_checked:{bg:n(`${r}.300`,`${r}.600`)(e),borderColor:n(`${r}.300`,`${r}.600`)(e),color:n(`${r}.900`,`${r}.100`)(e),_hover:{bg:n(`${r}.400`,`${r}.500`)(e),borderColor:n(`${r}.400`,`${r}.500`)(e)},_disabled:{borderColor:"transparent",bg:"whiteAlpha.300",color:"whiteAlpha.500"}},_indeterminate:{bg:n(`${r}.300`,`${r}.600`)(e),borderColor:n(`${r}.300`,`${r}.600`)(e),color:n(`${r}.900`,`${r}.100`)(e)},_disabled:{bg:"whiteAlpha.100",borderColor:"transparent"},_focusVisible:{boxShadow:"outline"},_invalid:{borderColor:n("error.600","error.300")(e)}}}),id=td(e=>({control:nd(e)})),ld=od({variants:{invokeAI:id},defaultProps:{variant:"invokeAI",colorScheme:"accent"}}),sd=t(e=>({fontSize:"sm",marginEnd:0,mb:1,fontWeight:"400",transitionProperty:"common",transitionDuration:"normal",whiteSpace:"nowrap",_disabled:{opacity:.4},color:n("base.700","base.300")(e)})),dd=h({variants:{invokeAI:sd},defaultProps:{variant:"invokeAI"}}),Je=e=>({outline:"none",borderWidth:2,borderStyle:"solid",borderColor:n("base.200","base.800")(e),bg:n("base.50","base.900")(e),borderRadius:"base",color:n("base.900","base.100")(e),boxShadow:"none",_hover:{borderColor:n("base.300","base.600")(e)},_focus:{borderColor:n("accent.200","accent.600")(e),boxShadow:"none",_hover:{borderColor:n("accent.300","accent.500")(e)}},_invalid:{borderColor:n("error.300","error.600")(e),boxShadow:"none",_hover:{borderColor:n("error.400","error.500")(e)}},_disabled:{borderColor:n("base.300","base.700")(e),bg:n("base.300","base.700")(e),color:n("base.600","base.400")(e),_hover:{borderColor:n("base.300","base.700")(e)}},_placeholder:{color:n("base.700","base.400")(e)}}),{definePartsStyle:cd,defineMultiStyleConfig:bd}=b(Xa.keys),vd=cd(e=>({field:Je(e)})),ud=bd({variants:{invokeAI:vd},defaultProps:{size:"sm",variant:"invokeAI"}}),{defineMultiStyleConfig:fd,definePartsStyle:md}=b(Za.keys),hd=t(e=>({bg:n("blackAlpha.700","blackAlpha.700")(e)})),gd=t({}),yd=t(e=>({layerStyle:"first",maxH:"80vh"})),pd=t(e=>({fontWeight:"600",fontSize:"lg",layerStyle:"first",borderTopRadius:"base",borderInlineEndRadius:"base"})),Sd=t({}),xd=t({overflowY:"scroll"}),$d=t({}),kd=md(e=>({overlay:hd(e),dialogContainer:gd,dialog:yd(e),header:pd(e),closeButton:Sd,body:xd,footer:$d})),_d=fd({variants:{invokeAI:kd},defaultProps:{variant:"invokeAI",size:"lg"}}),{defineMultiStyleConfig:wd,definePartsStyle:zd}=b(Ja.keys),Cd=t(e=>({height:8})),Ad=t(e=>({border:"none",fontWeight:"600",height:"auto",py:1,ps:2,pe:6,...Je(e)})),Pd=t(e=>({display:"flex"})),Td=t(e=>({border:"none",px:2,py:0,mx:-2,my:0,svg:{color:n("base.700","base.300")(e),width:2.5,height:2.5,_hover:{color:n("base.900","base.100")(e)}}})),Fd=zd(e=>({root:Cd(e),field:Ad(e),stepperGroup:Pd(e),stepper:Td(e)})),Id=wd({variants:{invokeAI:Fd},defaultProps:{size:"sm",variant:"invokeAI"}}),{defineMultiStyleConfig:Md,definePartsStyle:Bd}=b(Qa.keys),Ed=m("popper-bg"),Dd=m("popper-arrow-bg"),jd=m("popper-arrow-shadow-color"),Rd=t(e=>({[Dd.variable]:n("colors.base.100","colors.base.800")(e),[Ed.variable]:n("colors.base.100","colors.base.800")(e),[jd.variable]:n("colors.base.400","colors.base.600")(e),minW:"unset",width:"unset",p:4,bg:n("base.100","base.800")(e),border:"none",shadow:"dark-lg"})),Hd=Bd(e=>({content:Rd(e)})),Wd=Md({variants:{invokeAI:Hd},defaultProps:{variant:"invokeAI"}}),{defineMultiStyleConfig:Ld,definePartsStyle:Vd}=b(et.keys),qd=t(e=>({bg:"accentAlpha.500"})),Od=t(e=>{const{colorScheme:r}=e;return{bg:n(`${r}.200`,`${r}.700`)(e)}}),Nd=Vd(e=>({filledTrack:qd(e),track:Od(e)})),Gd=Ld({variants:{invokeAI:Nd},defaultProps:{variant:"invokeAI"}}),Ud={"::-webkit-scrollbar":{display:"none"},scrollbarWidth:"none"},{definePartsStyle:Yd,defineMultiStyleConfig:Kd}=b(rt.keys),Xd=t(e=>({color:n("base.200","base.300")(e)})),Zd=t(e=>({fontWeight:"600",...Je(e)})),Jd=Yd(e=>({field:Zd(e),icon:Xd(e)})),Qd=Kd({variants:{invokeAI:Jd},defaultProps:{size:"sm",variant:"invokeAI"}}),sa=c("skeleton-start-color"),da=c("skeleton-end-color"),ec=t({borderRadius:"base",maxW:"full",maxH:"full",_light:{[sa.variable]:"colors.base.250",[da.variable]:"colors.base.450"},_dark:{[sa.variable]:"colors.base.700",[da.variable]:"colors.base.500"}}),rc=h({variants:{invokeAI:ec},defaultProps:{variant:"invokeAI"}}),{definePartsStyle:ac,defineMultiStyleConfig:tc}=b(at.keys),oc=t(e=>({bg:n("base.400","base.600")(e),h:1.5})),nc=t(e=>{const{colorScheme:r}=e;return{bg:n(`${r}.400`,`${r}.600`)(e),h:1.5}}),ic=t(e=>({w:2,h:4,bg:n("base.50","base.100")(e)})),lc=t(e=>({fontSize:"2xs",fontWeight:"500",color:n("base.700","base.400")(e),mt:2,insetInlineStart:"unset"})),sc=ac(e=>({container:{_disabled:{opacity:.6,cursor:"default",pointerEvents:"none"}},track:oc(e),filledTrack:nc(e),thumb:ic(e),mark:lc(e)})),dc=tc({variants:{invokeAI:sc},defaultProps:{variant:"invokeAI",colorScheme:"accent"}}),{defineMultiStyleConfig:cc,definePartsStyle:bc}=b(tt.keys),vc=t(e=>{const{colorScheme:r}=e;return{bg:n("base.300","base.600")(e),_focusVisible:{boxShadow:"none"},_checked:{bg:n(`${r}.400`,`${r}.500`)(e)}}}),uc=t(e=>{const{colorScheme:r}=e;return{bg:n(`${r}.50`,`${r}.50`)(e)}}),fc=bc(e=>({container:{},track:vc(e),thumb:uc(e)})),mc=cc({variants:{invokeAI:fc},defaultProps:{size:"md",variant:"invokeAI",colorScheme:"accent"}}),{defineMultiStyleConfig:hc,definePartsStyle:gc}=b(ot.keys),yc=t(e=>({display:"flex",columnGap:4})),pc=t(e=>({})),Sc=t(e=>{const{colorScheme:r}=e;return{display:"flex",flexDirection:"column",gap:1,color:n("base.700","base.400")(e),button:{fontSize:"sm",padding:2,borderRadius:"base",textShadow:n("0 0 0.3rem var(--invokeai-colors-accent-100)","0 0 0.3rem var(--invokeai-colors-accent-900)")(e),svg:{fill:n("base.700","base.300")(e)},_selected:{bg:n("accent.400","accent.600")(e),color:n("base.50","base.100")(e),svg:{fill:n("base.50","base.100")(e),filter:n(`drop-shadow(0px 0px 0.3rem var(--invokeai-colors-${r}-600))`,`drop-shadow(0px 0px 0.3rem var(--invokeai-colors-${r}-800))`)(e)},_hover:{bg:n("accent.500","accent.500")(e),color:n("white","base.50")(e),svg:{fill:n("white","base.50")(e)}}},_hover:{bg:n("base.100","base.800")(e),color:n("base.900","base.50")(e),svg:{fill:n("base.800","base.100")(e)}}}}}),xc=t(e=>({padding:0,height:"100%"})),$c=gc(e=>({root:yc(e),tab:pc(e),tablist:Sc(e),tabpanel:xc(e)})),kc=hc({variants:{invokeAI:$c},defaultProps:{variant:"invokeAI",colorScheme:"accent"}}),_c=t(e=>({color:n("base.500","base.400")(e)})),wc=h({variants:{subtext:_c}}),zc=t(e=>({...Je(e),"::-webkit-scrollbar":{display:"initial"},"::-webkit-resizer":{backgroundImage:`linear-gradient(135deg, + var(--invokeai-colors-base-50) 0%, + var(--invokeai-colors-base-50) 70%, + var(--invokeai-colors-base-200) 70%, + var(--invokeai-colors-base-200) 100%)`},_dark:{"::-webkit-resizer":{backgroundImage:`linear-gradient(135deg, + var(--invokeai-colors-base-900) 0%, + var(--invokeai-colors-base-900) 70%, + var(--invokeai-colors-base-800) 70%, + var(--invokeai-colors-base-800) 100%)`}}})),Cc=h({variants:{invokeAI:zc},defaultProps:{size:"md",variant:"invokeAI"}}),Ac=m("popper-arrow-bg"),Pc=t(e=>({borderRadius:"base",shadow:"dark-lg",bg:n("base.700","base.200")(e),[Ac.variable]:n("colors.base.700","colors.base.200")(e),pb:1.5})),Tc=h({baseStyle:Pc}),Fc={config:{cssVarPrefix:"invokeai",initialColorMode:"dark",useSystemColorMode:!1},layerStyles:{body:{bg:"base.50",color:"base.900",".chakra-ui-dark &":{bg:"base.900",color:"base.50"}},first:{bg:"base.100",color:"base.900",".chakra-ui-dark &":{bg:"base.850",color:"base.100"}},second:{bg:"base.200",color:"base.900",".chakra-ui-dark &":{bg:"base.800",color:"base.100"}}},styles:{global:()=>({layerStyle:"body","*":{...Ud}})},direction:"ltr",fonts:{body:"'Inter Variable', sans-serif"},shadows:{light:{accent:"0 0 10px 0 var(--invokeai-colors-accent-300)",accentHover:"0 0 10px 0 var(--invokeai-colors-accent-400)",ok:"0 0 7px var(--invokeai-colors-ok-600)",working:"0 0 7px var(--invokeai-colors-working-600)",error:"0 0 7px var(--invokeai-colors-error-600)"},dark:{accent:"0 0 10px 0 var(--invokeai-colors-accent-600)",accentHover:"0 0 10px 0 var(--invokeai-colors-accent-500)",ok:"0 0 7px var(--invokeai-colors-ok-400)",working:"0 0 7px var(--invokeai-colors-working-400)",error:"0 0 7px var(--invokeai-colors-error-400)"},selected:{light:"0px 0px 0px 1px var(--invokeai-colors-base-150), 0px 0px 0px 4px var(--invokeai-colors-accent-400)",dark:"0px 0px 0px 1px var(--invokeai-colors-base-900), 0px 0px 0px 4px var(--invokeai-colors-accent-400)"},nodeSelectedOutline:"0 0 0 2px var(--invokeai-colors-accent-450)"},colors:G0,components:{Button:ad,Input:ud,Textarea:Cc,Tabs:kc,Progress:Gd,Accordion:ed,FormLabel:dd,Switch:mc,NumberInput:Id,Select:Qd,Skeleton:rc,Slider:dc,Popover:Wd,Modal:_d,Checkbox:ld,Menu:nt,Text:wc,Tooltip:Tc}};const Ic=()=>x.useMemo(()=>({colorScheme:"dark",fontFamily:"'Inter Variable', sans-serif",components:{ScrollArea:{defaultProps:{scrollbarSize:10},styles:{scrollbar:{"&:hover":{backgroundColor:"var(--invokeai-colors-baseAlpha-300)"}},thumb:{backgroundColor:"var(--invokeai-colors-baseAlpha-300)"}}}}}),[]),Mc=fa("@@invokeai-color-mode");function Dc({children:e}){const{i18n:r}=Ua(),a=r.dir(),o=x.useMemo(()=>j0({...Fc,direction:a}),[a]);x.useEffect(()=>{document.body.dir=a},[a]);const i=Ic();return g.jsx(it,{theme:i,children:g.jsx(N0,{theme:o,colorModeManager:Mc,children:e})})}export{Dc as default}; diff --git a/invokeai/frontend/web/dist/assets/ThemeLocaleProvider-5b992bc7.css b/invokeai/frontend/web/dist/assets/ThemeLocaleProvider-5b992bc7.css new file mode 100644 index 0000000000..45acfe6eaf --- /dev/null +++ b/invokeai/frontend/web/dist/assets/ThemeLocaleProvider-5b992bc7.css @@ -0,0 +1,9 @@ +@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(./inter-cyrillic-ext-wght-normal-848492d3.woff2) format("woff2-variations");unicode-range:U+0460-052F,U+1C80-1C88,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(./inter-cyrillic-wght-normal-262a1054.woff2) format("woff2-variations");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(./inter-greek-ext-wght-normal-fe977ddb.woff2) format("woff2-variations");unicode-range:U+1F00-1FFF}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(./inter-greek-wght-normal-89b4a3fe.woff2) format("woff2-variations");unicode-range:U+0370-03FF}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(./inter-vietnamese-wght-normal-ac4e131c.woff2) format("woff2-variations");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(./inter-latin-ext-wght-normal-45606f83.woff2) format("woff2-variations");unicode-range:U+0100-02AF,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1E00-1EFF,U+2020,U+20A0-20AB,U+20AD-20CF,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(./inter-latin-wght-normal-450f3ba4.woff2) format("woff2-variations");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}/*! +* OverlayScrollbars +* Version: 2.2.1 +* +* Copyright (c) Rene Haas | KingSora. +* https://github.com/KingSora +* +* Released under the MIT license. +*/.os-size-observer,.os-size-observer-listener{direction:inherit;pointer-events:none;overflow:hidden;visibility:hidden;box-sizing:border-box}.os-size-observer,.os-size-observer-listener,.os-size-observer-listener-item,.os-size-observer-listener-item-final{writing-mode:horizontal-tb;position:absolute;left:0;top:0}.os-size-observer{z-index:-1;contain:strict;display:flex;flex-direction:row;flex-wrap:nowrap;padding:inherit;border:inherit;box-sizing:inherit;margin:-133px;top:0;right:0;bottom:0;left:0;transform:scale(.1)}.os-size-observer:before{content:"";flex:none;box-sizing:inherit;padding:10px;width:10px;height:10px}.os-size-observer-appear{animation:os-size-observer-appear-animation 1ms forwards}.os-size-observer-listener{box-sizing:border-box;position:relative;flex:auto;padding:inherit;border:inherit;margin:-133px;transform:scale(10)}.os-size-observer-listener.ltr{margin-right:-266px;margin-left:0}.os-size-observer-listener.rtl{margin-left:-266px;margin-right:0}.os-size-observer-listener:empty:before{content:"";width:100%;height:100%}.os-size-observer-listener:empty:before,.os-size-observer-listener>.os-size-observer-listener-item{display:block;position:relative;padding:inherit;border:inherit;box-sizing:content-box;flex:auto}.os-size-observer-listener-scroll{box-sizing:border-box;display:flex}.os-size-observer-listener-item{right:0;bottom:0;overflow:hidden;direction:ltr;flex:none}.os-size-observer-listener-item-final{transition:none}@keyframes os-size-observer-appear-animation{0%{cursor:auto}to{cursor:none}}.os-trinsic-observer{flex:none;box-sizing:border-box;position:relative;max-width:0px;max-height:1px;padding:0;margin:0;border:none;overflow:hidden;z-index:-1;height:0;top:calc(100% + 1px);contain:strict}.os-trinsic-observer:not(:empty){height:calc(100% + 1px);top:-1px}.os-trinsic-observer:not(:empty)>.os-size-observer{width:1000%;height:1000%;min-height:1px;min-width:1px}.os-environment{--os-custom-prop: -1;position:fixed;opacity:0;visibility:hidden;overflow:scroll;height:200px;width:200px;z-index:var(--os-custom-prop)}.os-environment div{width:200%;height:200%;margin:10px 0}.os-environment.os-environment-flexbox-glue{display:flex;flex-direction:row;flex-wrap:nowrap;height:auto;width:auto;min-height:200px;min-width:200px}.os-environment.os-environment-flexbox-glue div{flex:auto;width:auto;height:auto;max-height:100%;max-width:100%;margin:0}.os-environment.os-environment-flexbox-glue-max{max-height:200px}.os-environment.os-environment-flexbox-glue-max div{overflow:visible}.os-environment.os-environment-flexbox-glue-max div:before{content:"";display:block;height:999px;width:999px}.os-environment,[data-overlayscrollbars-viewport]{-ms-overflow-style:scrollbar!important}[data-overlayscrollbars-initialize],[data-overlayscrollbars~=scrollbarHidden],[data-overlayscrollbars-viewport~=scrollbarHidden],.os-scrollbar-hidden.os-environment{scrollbar-width:none!important}[data-overlayscrollbars-initialize]::-webkit-scrollbar,[data-overlayscrollbars-initialize]::-webkit-scrollbar-corner,[data-overlayscrollbars~=scrollbarHidden]::-webkit-scrollbar,[data-overlayscrollbars~=scrollbarHidden]::-webkit-scrollbar-corner,[data-overlayscrollbars-viewport~=scrollbarHidden]::-webkit-scrollbar,[data-overlayscrollbars-viewport~=scrollbarHidden]::-webkit-scrollbar-corner,.os-scrollbar-hidden.os-environment::-webkit-scrollbar,.os-scrollbar-hidden.os-environment::-webkit-scrollbar-corner{-webkit-appearance:none!important;-moz-appearance:none!important;appearance:none!important;display:none!important;width:0!important;height:0!important}[data-overlayscrollbars-initialize]{overflow:auto}html[data-overlayscrollbars],html.os-scrollbar-hidden,html.os-scrollbar-hidden>body{box-sizing:border-box;margin:0;width:100%;height:100%}html[data-overlayscrollbars]>body{overflow:visible}[data-overlayscrollbars~=host]{position:relative}[data-overlayscrollbars~=host],[data-overlayscrollbars-padding]{display:flex;flex-direction:row!important;flex-wrap:nowrap!important}[data-overlayscrollbars-padding],[data-overlayscrollbars-viewport]{box-sizing:inherit;position:relative;flex:auto!important;height:auto;width:100%;min-width:0;padding:0;margin:0;border:none;z-index:0}[data-overlayscrollbars-viewport]{--os-vaw: 0;--os-vah: 0}[data-overlayscrollbars-viewport][data-overlayscrollbars-viewport~=arrange]:before{content:"";position:absolute;pointer-events:none;z-index:-1;min-width:1px;min-height:1px;width:var(--os-vaw);height:var(--os-vah)}[data-overlayscrollbars-padding],[data-overlayscrollbars-viewport],[data-overlayscrollbars~=host],[data-overlayscrollbars~=viewport]{overflow:hidden}[data-overlayscrollbars~=overflowVisible],[data-overlayscrollbars-padding~=overflowVisible],[data-overlayscrollbars-viewport~=overflowVisible]{overflow:visible}[data-overlayscrollbars-overflow-x=hidden]{overflow-x:hidden}[data-overlayscrollbars-overflow-x=scroll]{overflow-x:scroll}[data-overlayscrollbars-overflow-x=hidden]{overflow-y:hidden}[data-overlayscrollbars-overflow-y=scroll]{overflow-y:scroll}[data-overlayscrollbars~=scrollbarPressed],[data-overlayscrollbars~=scrollbarPressed] [data-overlayscrollbars-viewport]{scroll-behavior:auto!important}[data-overlayscrollbars-content]{box-sizing:inherit}[data-overlayscrollbars-grid],[data-overlayscrollbars-grid] [data-overlayscrollbars-padding]{display:grid;grid-template:1fr/1fr}[data-overlayscrollbars-grid]>[data-overlayscrollbars-padding],[data-overlayscrollbars-grid]>[data-overlayscrollbars-viewport],[data-overlayscrollbars-grid]>[data-overlayscrollbars-padding]>[data-overlayscrollbars-viewport]{height:auto!important;width:auto!important}.os-scrollbar{contain:size layout;contain:size layout style;transition:opacity .15s,visibility .15s,top .15s,right .15s,bottom .15s,left .15s;pointer-events:none;position:absolute;opacity:0;visibility:hidden}body>.os-scrollbar{position:fixed;z-index:99999}.os-scrollbar-transitionless{transition:none}.os-scrollbar-track{position:relative;direction:ltr!important;padding:0!important;border:none!important}.os-scrollbar-handle{position:absolute}.os-scrollbar-track,.os-scrollbar-handle{pointer-events:none;width:100%;height:100%}.os-scrollbar.os-scrollbar-track-interactive .os-scrollbar-track,.os-scrollbar.os-scrollbar-handle-interactive .os-scrollbar-handle{pointer-events:auto;touch-action:none}.os-scrollbar-horizontal{bottom:0;left:0}.os-scrollbar-vertical{top:0;right:0}.os-scrollbar-rtl.os-scrollbar-horizontal{right:0}.os-scrollbar-rtl.os-scrollbar-vertical{right:auto;left:0}.os-scrollbar-visible,.os-scrollbar-interaction.os-scrollbar-visible{opacity:1;visibility:visible}.os-scrollbar-auto-hidden{opacity:0;visibility:hidden}.os-scrollbar-unusable,.os-scrollbar-unusable *,.os-scrollbar-wheel,.os-scrollbar-wheel *{pointer-events:none!important}.os-scrollbar-unusable .os-scrollbar-handle{opacity:0!important}.os-scrollbar-horizontal .os-scrollbar-handle{bottom:0}.os-scrollbar-vertical .os-scrollbar-handle{right:0}.os-scrollbar-rtl.os-scrollbar-vertical .os-scrollbar-handle{right:auto;left:0}.os-scrollbar.os-scrollbar-horizontal.os-scrollbar-cornerless,.os-scrollbar.os-scrollbar-horizontal.os-scrollbar-cornerless.os-scrollbar-rtl{left:0;right:0}.os-scrollbar.os-scrollbar-vertical.os-scrollbar-cornerless,.os-scrollbar.os-scrollbar-vertical.os-scrollbar-cornerless.os-scrollbar-rtl{top:0;bottom:0}.os-scrollbar{--os-size: 0;--os-padding-perpendicular: 0;--os-padding-axis: 0;--os-track-border-radius: 0;--os-track-bg: none;--os-track-bg-hover: none;--os-track-bg-active: none;--os-track-border: none;--os-track-border-hover: none;--os-track-border-active: none;--os-handle-border-radius: 0;--os-handle-bg: none;--os-handle-bg-hover: none;--os-handle-bg-active: none;--os-handle-border: none;--os-handle-border-hover: none;--os-handle-border-active: none;--os-handle-min-size: 33px;--os-handle-max-size: none;--os-handle-perpendicular-size: 100%;--os-handle-perpendicular-size-hover: 100%;--os-handle-perpendicular-size-active: 100%;--os-handle-interactive-area-offset: 0}.os-scrollbar .os-scrollbar-track{border:var(--os-track-border);border-radius:var(--os-track-border-radius);background:var(--os-track-bg);transition:opacity .15s,background-color .15s,border-color .15s}.os-scrollbar .os-scrollbar-track:hover{border:var(--os-track-border-hover);background:var(--os-track-bg-hover)}.os-scrollbar .os-scrollbar-track:active{border:var(--os-track-border-active);background:var(--os-track-bg-active)}.os-scrollbar .os-scrollbar-handle{border:var(--os-handle-border);border-radius:var(--os-handle-border-radius);background:var(--os-handle-bg)}.os-scrollbar .os-scrollbar-handle:before{content:"";position:absolute;left:0;right:0;top:0;bottom:0;display:block}.os-scrollbar .os-scrollbar-handle:hover{border:var(--os-handle-border-hover);background:var(--os-handle-bg-hover)}.os-scrollbar .os-scrollbar-handle:active{border:var(--os-handle-border-active);background:var(--os-handle-bg-active)}.os-scrollbar-horizontal{padding:var(--os-padding-perpendicular) var(--os-padding-axis);right:var(--os-size);height:var(--os-size)}.os-scrollbar-horizontal.os-scrollbar-rtl{left:var(--os-size);right:0}.os-scrollbar-horizontal .os-scrollbar-handle{min-width:var(--os-handle-min-size);max-width:var(--os-handle-max-size);height:var(--os-handle-perpendicular-size);transition:opacity .15s,background-color .15s,border-color .15s,height .15s}.os-scrollbar-horizontal .os-scrollbar-handle:before{top:calc((var(--os-padding-perpendicular) + var(--os-handle-interactive-area-offset)) * -1);bottom:calc(var(--os-padding-perpendicular) * -1)}.os-scrollbar-horizontal:hover .os-scrollbar-handle{height:var(--os-handle-perpendicular-size-hover)}.os-scrollbar-horizontal:active .os-scrollbar-handle{height:var(--os-handle-perpendicular-size-active)}.os-scrollbar-vertical{padding:var(--os-padding-axis) var(--os-padding-perpendicular);bottom:var(--os-size);width:var(--os-size)}.os-scrollbar-vertical .os-scrollbar-handle{min-height:var(--os-handle-min-size);max-height:var(--os-handle-max-size);width:var(--os-handle-perpendicular-size);transition:opacity .15s,background-color .15s,border-color .15s,width .15s}.os-scrollbar-vertical .os-scrollbar-handle:before{left:calc((var(--os-padding-perpendicular) + var(--os-handle-interactive-area-offset)) * -1);right:calc(var(--os-padding-perpendicular) * -1)}.os-scrollbar-vertical.os-scrollbar-rtl .os-scrollbar-handle:before{right:calc((var(--os-padding-perpendicular) + var(--os-handle-interactive-area-offset)) * -1);left:calc(var(--os-padding-perpendicular) * -1)}.os-scrollbar-vertical:hover .os-scrollbar-handle{width:var(--os-handle-perpendicular-size-hover)}.os-scrollbar-vertical:active .os-scrollbar-handle{width:var(--os-handle-perpendicular-size-active)}[data-overlayscrollbars~=updating]>.os-scrollbar,.os-theme-none.os-scrollbar{display:none!important}.os-theme-dark,.os-theme-light{box-sizing:border-box;--os-size: 10px;--os-padding-perpendicular: 2px;--os-padding-axis: 2px;--os-track-border-radius: 10px;--os-handle-interactive-area-offset: 4px;--os-handle-border-radius: 10px}.os-theme-dark{--os-handle-bg: rgba(0, 0, 0, .44);--os-handle-bg-hover: rgba(0, 0, 0, .55);--os-handle-bg-active: rgba(0, 0, 0, .66)}.os-theme-light{--os-handle-bg: rgba(255, 255, 255, .44);--os-handle-bg-hover: rgba(255, 255, 255, .55);--os-handle-bg-active: rgba(255, 255, 255, .66)}.os-no-css-vars.os-theme-dark.os-scrollbar .os-scrollbar-handle,.os-no-css-vars.os-theme-light.os-scrollbar .os-scrollbar-handle,.os-no-css-vars.os-theme-dark.os-scrollbar .os-scrollbar-track,.os-no-css-vars.os-theme-light.os-scrollbar .os-scrollbar-track{border-radius:10px}.os-no-css-vars.os-theme-dark.os-scrollbar-horizontal,.os-no-css-vars.os-theme-light.os-scrollbar-horizontal{padding:2px;right:10px;height:10px}.os-no-css-vars.os-theme-dark.os-scrollbar-horizontal.os-scrollbar-rtl,.os-no-css-vars.os-theme-light.os-scrollbar-horizontal.os-scrollbar-rtl{left:10px;right:0}.os-no-css-vars.os-theme-dark.os-scrollbar-horizontal .os-scrollbar-handle,.os-no-css-vars.os-theme-light.os-scrollbar-horizontal .os-scrollbar-handle{min-width:33px;max-width:none}.os-no-css-vars.os-theme-dark.os-scrollbar-horizontal .os-scrollbar-handle:before,.os-no-css-vars.os-theme-light.os-scrollbar-horizontal .os-scrollbar-handle:before{top:-6px;bottom:-2px}.os-no-css-vars.os-theme-dark.os-scrollbar-vertical,.os-no-css-vars.os-theme-light.os-scrollbar-vertical{padding:2px;bottom:10px;width:10px}.os-no-css-vars.os-theme-dark.os-scrollbar-vertical .os-scrollbar-handle,.os-no-css-vars.os-theme-light.os-scrollbar-vertical .os-scrollbar-handle{min-height:33px;max-height:none}.os-no-css-vars.os-theme-dark.os-scrollbar-vertical .os-scrollbar-handle:before,.os-no-css-vars.os-theme-light.os-scrollbar-vertical .os-scrollbar-handle:before{left:-6px;right:-2px}.os-no-css-vars.os-theme-dark.os-scrollbar-vertical.os-scrollbar-rtl .os-scrollbar-handle:before,.os-no-css-vars.os-theme-light.os-scrollbar-vertical.os-scrollbar-rtl .os-scrollbar-handle:before{right:-6px;left:-2px}.os-no-css-vars.os-theme-dark .os-scrollbar-handle{background:rgba(0,0,0,.44)}.os-no-css-vars.os-theme-dark:hover .os-scrollbar-handle{background:rgba(0,0,0,.55)}.os-no-css-vars.os-theme-dark:active .os-scrollbar-handle{background:rgba(0,0,0,.66)}.os-no-css-vars.os-theme-light .os-scrollbar-handle{background:rgba(255,255,255,.44)}.os-no-css-vars.os-theme-light:hover .os-scrollbar-handle{background:rgba(255,255,255,.55)}.os-no-css-vars.os-theme-light:active .os-scrollbar-handle{background:rgba(255,255,255,.66)}.os-scrollbar{--os-handle-bg: var(--invokeai-colors-accentAlpha-500);--os-handle-bg-hover: var(--invokeai-colors-accentAlpha-700);--os-handle-bg-active: var(--invokeai-colors-accentAlpha-800);--os-handle-min-size: 50px} diff --git a/invokeai/frontend/web/dist/assets/ThemeLocaleProvider-8d49f92d.css b/invokeai/frontend/web/dist/assets/ThemeLocaleProvider-8d49f92d.css deleted file mode 100644 index 450d24ac16..0000000000 --- a/invokeai/frontend/web/dist/assets/ThemeLocaleProvider-8d49f92d.css +++ /dev/null @@ -1,9 +0,0 @@ -@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(./inter-cyrillic-ext-wght-normal-848492d3.woff2) format("woff2-variations");unicode-range:U+0460-052F,U+1C80-1C88,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(./inter-cyrillic-wght-normal-262a1054.woff2) format("woff2-variations");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(./inter-greek-ext-wght-normal-fe977ddb.woff2) format("woff2-variations");unicode-range:U+1F00-1FFF}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(./inter-greek-wght-normal-89b4a3fe.woff2) format("woff2-variations");unicode-range:U+0370-03FF}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(./inter-vietnamese-wght-normal-ac4e131c.woff2) format("woff2-variations");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(./inter-latin-ext-wght-normal-45606f83.woff2) format("woff2-variations");unicode-range:U+0100-02AF,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1E00-1EFF,U+2020,U+20A0-20AB,U+20AD-20CF,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(./inter-latin-wght-normal-450f3ba4.woff2) format("woff2-variations");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}/*! -* OverlayScrollbars -* Version: 2.2.0 -* -* Copyright (c) Rene Haas | KingSora. -* https://github.com/KingSora -* -* Released under the MIT license. -*/.os-size-observer,.os-size-observer-listener{direction:inherit;pointer-events:none;overflow:hidden;visibility:hidden;box-sizing:border-box}.os-size-observer,.os-size-observer-listener,.os-size-observer-listener-item,.os-size-observer-listener-item-final{writing-mode:horizontal-tb;position:absolute;left:0;top:0}.os-size-observer{z-index:-1;contain:strict;display:flex;flex-direction:row;flex-wrap:nowrap;padding:inherit;border:inherit;box-sizing:inherit;margin:-133px;top:0;right:0;bottom:0;left:0;transform:scale(.1)}.os-size-observer:before{content:"";flex:none;box-sizing:inherit;padding:10px;width:10px;height:10px}.os-size-observer-appear{animation:os-size-observer-appear-animation 1ms forwards}.os-size-observer-listener{box-sizing:border-box;position:relative;flex:auto;padding:inherit;border:inherit;margin:-133px;transform:scale(10)}.os-size-observer-listener.ltr{margin-right:-266px;margin-left:0}.os-size-observer-listener.rtl{margin-left:-266px;margin-right:0}.os-size-observer-listener:empty:before{content:"";width:100%;height:100%}.os-size-observer-listener:empty:before,.os-size-observer-listener>.os-size-observer-listener-item{display:block;position:relative;padding:inherit;border:inherit;box-sizing:content-box;flex:auto}.os-size-observer-listener-scroll{box-sizing:border-box;display:flex}.os-size-observer-listener-item{right:0;bottom:0;overflow:hidden;direction:ltr;flex:none}.os-size-observer-listener-item-final{transition:none}@keyframes os-size-observer-appear-animation{0%{cursor:auto}to{cursor:none}}.os-trinsic-observer{flex:none;box-sizing:border-box;position:relative;max-width:0px;max-height:1px;padding:0;margin:0;border:none;overflow:hidden;z-index:-1;height:0;top:calc(100% + 1px);contain:strict}.os-trinsic-observer:not(:empty){height:calc(100% + 1px);top:-1px}.os-trinsic-observer:not(:empty)>.os-size-observer{width:1000%;height:1000%;min-height:1px;min-width:1px}.os-environment{--os-custom-prop: -1;position:fixed;opacity:0;visibility:hidden;overflow:scroll;height:200px;width:200px;z-index:var(--os-custom-prop)}.os-environment div{width:200%;height:200%;margin:10px 0}.os-environment.os-environment-flexbox-glue{display:flex;flex-direction:row;flex-wrap:nowrap;height:auto;width:auto;min-height:200px;min-width:200px}.os-environment.os-environment-flexbox-glue div{flex:auto;width:auto;height:auto;max-height:100%;max-width:100%;margin:0}.os-environment.os-environment-flexbox-glue-max{max-height:200px}.os-environment.os-environment-flexbox-glue-max div{overflow:visible}.os-environment.os-environment-flexbox-glue-max div:before{content:"";display:block;height:999px;width:999px}.os-environment,[data-overlayscrollbars-viewport]{-ms-overflow-style:scrollbar!important}[data-overlayscrollbars-initialize],[data-overlayscrollbars~=scrollbarHidden],[data-overlayscrollbars-viewport~=scrollbarHidden],.os-scrollbar-hidden.os-environment{scrollbar-width:none!important}[data-overlayscrollbars-initialize]::-webkit-scrollbar,[data-overlayscrollbars-initialize]::-webkit-scrollbar-corner,[data-overlayscrollbars~=scrollbarHidden]::-webkit-scrollbar,[data-overlayscrollbars~=scrollbarHidden]::-webkit-scrollbar-corner,[data-overlayscrollbars-viewport~=scrollbarHidden]::-webkit-scrollbar,[data-overlayscrollbars-viewport~=scrollbarHidden]::-webkit-scrollbar-corner,.os-scrollbar-hidden.os-environment::-webkit-scrollbar,.os-scrollbar-hidden.os-environment::-webkit-scrollbar-corner{-webkit-appearance:none!important;appearance:none!important;display:none!important;width:0!important;height:0!important}[data-overlayscrollbars-initialize]{overflow:auto}html[data-overlayscrollbars],html.os-scrollbar-hidden,html.os-scrollbar-hidden>body{box-sizing:border-box;margin:0;width:100%;height:100%}html[data-overlayscrollbars]>body{overflow:visible}[data-overlayscrollbars~=host]{position:relative}[data-overlayscrollbars~=host],[data-overlayscrollbars-padding]{display:flex;flex-direction:row!important;flex-wrap:nowrap!important}[data-overlayscrollbars-padding],[data-overlayscrollbars-viewport]{box-sizing:inherit;position:relative;flex:auto!important;height:auto;width:100%;padding:0;margin:0;border:none;z-index:0}[data-overlayscrollbars-viewport]{--os-vaw: 0;--os-vah: 0}[data-overlayscrollbars-viewport][data-overlayscrollbars-viewport~=arrange]:before{content:"";position:absolute;pointer-events:none;z-index:-1;min-width:1px;min-height:1px;width:var(--os-vaw);height:var(--os-vah)}[data-overlayscrollbars-padding],[data-overlayscrollbars-viewport],[data-overlayscrollbars~=host],[data-overlayscrollbars~=viewport]{overflow:hidden}[data-overlayscrollbars~=overflowVisible],[data-overlayscrollbars-padding~=overflowVisible],[data-overlayscrollbars-viewport~=overflowVisible]{overflow:visible}[data-overlayscrollbars-overflow-x=hidden]{overflow-x:hidden}[data-overlayscrollbars-overflow-x=scroll]{overflow-x:scroll}[data-overlayscrollbars-overflow-x=hidden]{overflow-y:hidden}[data-overlayscrollbars-overflow-y=scroll]{overflow-y:scroll}[data-overlayscrollbars~=scrollbarPressed],[data-overlayscrollbars~=scrollbarPressed] [data-overlayscrollbars-viewport]{scroll-behavior:auto!important}[data-overlayscrollbars-content]{box-sizing:inherit}[data-overlayscrollbars-grid],[data-overlayscrollbars-grid] [data-overlayscrollbars-padding]{display:grid;grid-template:1fr/1fr}[data-overlayscrollbars-grid]>[data-overlayscrollbars-padding],[data-overlayscrollbars-grid]>[data-overlayscrollbars-viewport],[data-overlayscrollbars-grid]>[data-overlayscrollbars-padding]>[data-overlayscrollbars-viewport]{height:auto!important;width:auto!important}.os-scrollbar{contain:size layout;contain:size layout style;transition:opacity .15s,visibility .15s,top .15s,right .15s,bottom .15s,left .15s;pointer-events:none;position:absolute;opacity:0;visibility:hidden}body>.os-scrollbar{position:fixed;z-index:99999}.os-scrollbar-transitionless{transition:none}.os-scrollbar-track{position:relative;direction:ltr!important;padding:0!important;border:none!important}.os-scrollbar-handle{position:absolute}.os-scrollbar-track,.os-scrollbar-handle{pointer-events:none;width:100%;height:100%}.os-scrollbar.os-scrollbar-track-interactive .os-scrollbar-track,.os-scrollbar.os-scrollbar-handle-interactive .os-scrollbar-handle{pointer-events:auto;touch-action:none}.os-scrollbar-horizontal{bottom:0;left:0}.os-scrollbar-vertical{top:0;right:0}.os-scrollbar-rtl.os-scrollbar-horizontal{right:0}.os-scrollbar-rtl.os-scrollbar-vertical{right:auto;left:0}.os-scrollbar-visible,.os-scrollbar-interaction.os-scrollbar-visible{opacity:1;visibility:visible}.os-scrollbar-auto-hidden{opacity:0;visibility:hidden}.os-scrollbar-unusable,.os-scrollbar-unusable *,.os-scrollbar-wheel,.os-scrollbar-wheel *{pointer-events:none!important}.os-scrollbar-unusable .os-scrollbar-handle{opacity:0!important}.os-scrollbar-horizontal .os-scrollbar-handle{bottom:0}.os-scrollbar-vertical .os-scrollbar-handle{right:0}.os-scrollbar-rtl.os-scrollbar-vertical .os-scrollbar-handle{right:auto;left:0}.os-scrollbar.os-scrollbar-horizontal.os-scrollbar-cornerless,.os-scrollbar.os-scrollbar-horizontal.os-scrollbar-cornerless.os-scrollbar-rtl{left:0;right:0}.os-scrollbar.os-scrollbar-vertical.os-scrollbar-cornerless,.os-scrollbar.os-scrollbar-vertical.os-scrollbar-cornerless.os-scrollbar-rtl{top:0;bottom:0}.os-scrollbar{--os-size: 0;--os-padding-perpendicular: 0;--os-padding-axis: 0;--os-track-border-radius: 0;--os-track-bg: none;--os-track-bg-hover: none;--os-track-bg-active: none;--os-track-border: none;--os-track-border-hover: none;--os-track-border-active: none;--os-handle-border-radius: 0;--os-handle-bg: none;--os-handle-bg-hover: none;--os-handle-bg-active: none;--os-handle-border: none;--os-handle-border-hover: none;--os-handle-border-active: none;--os-handle-min-size: 33px;--os-handle-max-size: none;--os-handle-perpendicular-size: 100%;--os-handle-perpendicular-size-hover: 100%;--os-handle-perpendicular-size-active: 100%;--os-handle-interactive-area-offset: 0}.os-scrollbar .os-scrollbar-track{border:var(--os-track-border);border-radius:var(--os-track-border-radius);background:var(--os-track-bg);transition:opacity .15s,background-color .15s,border-color .15s}.os-scrollbar .os-scrollbar-track:hover{border:var(--os-track-border-hover);background:var(--os-track-bg-hover)}.os-scrollbar .os-scrollbar-track:active{border:var(--os-track-border-active);background:var(--os-track-bg-active)}.os-scrollbar .os-scrollbar-handle{border:var(--os-handle-border);border-radius:var(--os-handle-border-radius);background:var(--os-handle-bg)}.os-scrollbar .os-scrollbar-handle:before{content:"";position:absolute;left:0;right:0;top:0;bottom:0;display:block}.os-scrollbar .os-scrollbar-handle:hover{border:var(--os-handle-border-hover);background:var(--os-handle-bg-hover)}.os-scrollbar .os-scrollbar-handle:active{border:var(--os-handle-border-active);background:var(--os-handle-bg-active)}.os-scrollbar-horizontal{padding:var(--os-padding-perpendicular) var(--os-padding-axis);right:var(--os-size);height:var(--os-size)}.os-scrollbar-horizontal.os-scrollbar-rtl{left:var(--os-size);right:0}.os-scrollbar-horizontal .os-scrollbar-handle{min-width:var(--os-handle-min-size);max-width:var(--os-handle-max-size);height:var(--os-handle-perpendicular-size);transition:opacity .15s,background-color .15s,border-color .15s,height .15s}.os-scrollbar-horizontal .os-scrollbar-handle:before{top:calc((var(--os-padding-perpendicular) + var(--os-handle-interactive-area-offset)) * -1);bottom:calc(var(--os-padding-perpendicular) * -1)}.os-scrollbar-horizontal:hover .os-scrollbar-handle{height:var(--os-handle-perpendicular-size-hover)}.os-scrollbar-horizontal:active .os-scrollbar-handle{height:var(--os-handle-perpendicular-size-active)}.os-scrollbar-vertical{padding:var(--os-padding-axis) var(--os-padding-perpendicular);bottom:var(--os-size);width:var(--os-size)}.os-scrollbar-vertical .os-scrollbar-handle{min-height:var(--os-handle-min-size);max-height:var(--os-handle-max-size);width:var(--os-handle-perpendicular-size);transition:opacity .15s,background-color .15s,border-color .15s,width .15s}.os-scrollbar-vertical .os-scrollbar-handle:before{left:calc((var(--os-padding-perpendicular) + var(--os-handle-interactive-area-offset)) * -1);right:calc(var(--os-padding-perpendicular) * -1)}.os-scrollbar-vertical.os-scrollbar-rtl .os-scrollbar-handle:before{right:calc((var(--os-padding-perpendicular) + var(--os-handle-interactive-area-offset)) * -1);left:calc(var(--os-padding-perpendicular) * -1)}.os-scrollbar-vertical:hover .os-scrollbar-handle{width:var(--os-handle-perpendicular-size-hover)}.os-scrollbar-vertical:active .os-scrollbar-handle{width:var(--os-handle-perpendicular-size-active)}[data-overlayscrollbars~=updating]>.os-scrollbar,.os-theme-none.os-scrollbar{display:none!important}.os-theme-dark,.os-theme-light{box-sizing:border-box;--os-size: 10px;--os-padding-perpendicular: 2px;--os-padding-axis: 2px;--os-track-border-radius: 10px;--os-handle-interactive-area-offset: 4px;--os-handle-border-radius: 10px}.os-theme-dark{--os-handle-bg: rgba(0, 0, 0, .44);--os-handle-bg-hover: rgba(0, 0, 0, .55);--os-handle-bg-active: rgba(0, 0, 0, .66)}.os-theme-light{--os-handle-bg: rgba(255, 255, 255, .44);--os-handle-bg-hover: rgba(255, 255, 255, .55);--os-handle-bg-active: rgba(255, 255, 255, .66)}.os-no-css-vars.os-theme-dark.os-scrollbar .os-scrollbar-handle,.os-no-css-vars.os-theme-light.os-scrollbar .os-scrollbar-handle,.os-no-css-vars.os-theme-dark.os-scrollbar .os-scrollbar-track,.os-no-css-vars.os-theme-light.os-scrollbar .os-scrollbar-track{border-radius:10px}.os-no-css-vars.os-theme-dark.os-scrollbar-horizontal,.os-no-css-vars.os-theme-light.os-scrollbar-horizontal{padding:2px;right:10px;height:10px}.os-no-css-vars.os-theme-dark.os-scrollbar-horizontal.os-scrollbar-rtl,.os-no-css-vars.os-theme-light.os-scrollbar-horizontal.os-scrollbar-rtl{left:10px;right:0}.os-no-css-vars.os-theme-dark.os-scrollbar-horizontal .os-scrollbar-handle,.os-no-css-vars.os-theme-light.os-scrollbar-horizontal .os-scrollbar-handle{min-width:33px;max-width:none}.os-no-css-vars.os-theme-dark.os-scrollbar-horizontal .os-scrollbar-handle:before,.os-no-css-vars.os-theme-light.os-scrollbar-horizontal .os-scrollbar-handle:before{top:-6px;bottom:-2px}.os-no-css-vars.os-theme-dark.os-scrollbar-vertical,.os-no-css-vars.os-theme-light.os-scrollbar-vertical{padding:2px;bottom:10px;width:10px}.os-no-css-vars.os-theme-dark.os-scrollbar-vertical .os-scrollbar-handle,.os-no-css-vars.os-theme-light.os-scrollbar-vertical .os-scrollbar-handle{min-height:33px;max-height:none}.os-no-css-vars.os-theme-dark.os-scrollbar-vertical .os-scrollbar-handle:before,.os-no-css-vars.os-theme-light.os-scrollbar-vertical .os-scrollbar-handle:before{left:-6px;right:-2px}.os-no-css-vars.os-theme-dark.os-scrollbar-vertical.os-scrollbar-rtl .os-scrollbar-handle:before,.os-no-css-vars.os-theme-light.os-scrollbar-vertical.os-scrollbar-rtl .os-scrollbar-handle:before{right:-6px;left:-2px}.os-no-css-vars.os-theme-dark .os-scrollbar-handle{background:rgba(0,0,0,.44)}.os-no-css-vars.os-theme-dark:hover .os-scrollbar-handle{background:rgba(0,0,0,.55)}.os-no-css-vars.os-theme-dark:active .os-scrollbar-handle{background:rgba(0,0,0,.66)}.os-no-css-vars.os-theme-light .os-scrollbar-handle{background:rgba(255,255,255,.44)}.os-no-css-vars.os-theme-light:hover .os-scrollbar-handle{background:rgba(255,255,255,.55)}.os-no-css-vars.os-theme-light:active .os-scrollbar-handle{background:rgba(255,255,255,.66)}.os-scrollbar{--os-handle-bg: var(--invokeai-colors-accentAlpha-500);--os-handle-bg-hover: var(--invokeai-colors-accentAlpha-700);--os-handle-bg-active: var(--invokeai-colors-accentAlpha-800);--os-handle-min-size: 50px} diff --git a/invokeai/frontend/web/dist/assets/index-adc79457.js b/invokeai/frontend/web/dist/assets/index-adc79457.js new file mode 100644 index 0000000000..8b700801cf --- /dev/null +++ b/invokeai/frontend/web/dist/assets/index-adc79457.js @@ -0,0 +1,125 @@ +function i9(e,t){for(var n=0;nr[i]})}}}return Object.freeze(Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}))}(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const i of document.querySelectorAll('link[rel="modulepreload"]'))r(i);new MutationObserver(i=>{for(const o of i)if(o.type==="childList")for(const s of o.addedNodes)s.tagName==="LINK"&&s.rel==="modulepreload"&&r(s)}).observe(document,{childList:!0,subtree:!0});function n(i){const o={};return i.integrity&&(o.integrity=i.integrity),i.referrerPolicy&&(o.referrerPolicy=i.referrerPolicy),i.crossOrigin==="use-credentials"?o.credentials="include":i.crossOrigin==="anonymous"?o.credentials="omit":o.credentials="same-origin",o}function r(i){if(i.ep)return;i.ep=!0;const o=n(i);fetch(i.href,o)}})();var Ne=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{};function Rl(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}function cV(e){if(e.__esModule)return e;var t=e.default;if(typeof t=="function"){var n=function r(){if(this instanceof r){var i=[null];i.push.apply(i,arguments);var o=Function.bind.apply(t,i);return new o}return t.apply(this,arguments)};n.prototype=t.prototype}else n={};return Object.defineProperty(n,"__esModule",{value:!0}),Object.keys(e).forEach(function(r){var i=Object.getOwnPropertyDescriptor(e,r);Object.defineProperty(n,r,i.get?i:{enumerable:!0,get:function(){return e[r]}})}),n}var o9={exports:{}},T0={},s9={exports:{}},ze={};/** + * @license React + * react.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */var Gh=Symbol.for("react.element"),dV=Symbol.for("react.portal"),fV=Symbol.for("react.fragment"),hV=Symbol.for("react.strict_mode"),pV=Symbol.for("react.profiler"),gV=Symbol.for("react.provider"),mV=Symbol.for("react.context"),yV=Symbol.for("react.forward_ref"),vV=Symbol.for("react.suspense"),bV=Symbol.for("react.memo"),SV=Symbol.for("react.lazy"),E4=Symbol.iterator;function _V(e){return e===null||typeof e!="object"?null:(e=E4&&e[E4]||e["@@iterator"],typeof e=="function"?e:null)}var a9={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},l9=Object.assign,u9={};function Uc(e,t,n){this.props=e,this.context=t,this.refs=u9,this.updater=n||a9}Uc.prototype.isReactComponent={};Uc.prototype.setState=function(e,t){if(typeof e!="object"&&typeof e!="function"&&e!=null)throw Error("setState(...): takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,e,t,"setState")};Uc.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,"forceUpdate")};function c9(){}c9.prototype=Uc.prototype;function Fx(e,t,n){this.props=e,this.context=t,this.refs=u9,this.updater=n||a9}var Bx=Fx.prototype=new c9;Bx.constructor=Fx;l9(Bx,Uc.prototype);Bx.isPureReactComponent=!0;var P4=Array.isArray,d9=Object.prototype.hasOwnProperty,jx={current:null},f9={key:!0,ref:!0,__self:!0,__source:!0};function h9(e,t,n){var r,i={},o=null,s=null;if(t!=null)for(r in t.ref!==void 0&&(s=t.ref),t.key!==void 0&&(o=""+t.key),t)d9.call(t,r)&&!f9.hasOwnProperty(r)&&(i[r]=t[r]);var a=arguments.length-2;if(a===1)i.children=n;else if(1>>1,z=R[V];if(0>>1;Vi(W,L))Xi(F,W)?(R[V]=F,R[X]=L,V=X):(R[V]=W,R[K]=L,V=K);else if(Xi(F,L))R[V]=F,R[X]=L,V=X;else break e}}return D}function i(R,D){var L=R.sortIndex-D.sortIndex;return L!==0?L:R.id-D.id}if(typeof performance=="object"&&typeof performance.now=="function"){var o=performance;e.unstable_now=function(){return o.now()}}else{var s=Date,a=s.now();e.unstable_now=function(){return s.now()-a}}var l=[],u=[],c=1,d=null,f=3,h=!1,p=!1,m=!1,S=typeof setTimeout=="function"?setTimeout:null,v=typeof clearTimeout=="function"?clearTimeout:null,y=typeof setImmediate<"u"?setImmediate:null;typeof navigator<"u"&&navigator.scheduling!==void 0&&navigator.scheduling.isInputPending!==void 0&&navigator.scheduling.isInputPending.bind(navigator.scheduling);function g(R){for(var D=n(u);D!==null;){if(D.callback===null)r(u);else if(D.startTime<=R)r(u),D.sortIndex=D.expirationTime,t(l,D);else break;D=n(u)}}function b(R){if(m=!1,g(R),!p)if(n(l)!==null)p=!0,I(_);else{var D=n(u);D!==null&&M(b,D.startTime-R)}}function _(R,D){p=!1,m&&(m=!1,v(C),C=-1),h=!0;var L=f;try{for(g(D),d=n(l);d!==null&&(!(d.expirationTime>D)||R&&!A());){var V=d.callback;if(typeof V=="function"){d.callback=null,f=d.priorityLevel;var z=V(d.expirationTime<=D);D=e.unstable_now(),typeof z=="function"?d.callback=z:d===n(l)&&r(l),g(D)}else r(l);d=n(l)}if(d!==null)var U=!0;else{var K=n(u);K!==null&&M(b,K.startTime-D),U=!1}return U}finally{d=null,f=L,h=!1}}var w=!1,x=null,C=-1,k=5,P=-1;function A(){return!(e.unstable_now()-PR||125V?(R.sortIndex=L,t(u,R),n(l)===null&&R===n(u)&&(m?(v(C),C=-1):m=!0,M(b,L-V))):(R.sortIndex=z,t(l,R),p||h||(p=!0,I(_))),R},e.unstable_shouldYield=A,e.unstable_wrapCallback=function(R){var D=f;return function(){var L=f;f=D;try{return R.apply(this,arguments)}finally{f=L}}}})(y9);m9.exports=y9;var IV=m9.exports;/** + * @license React + * react-dom.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */var v9=E,zr=IV;function te(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),W_=Object.prototype.hasOwnProperty,MV=/^[:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD][:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]*$/,O4={},R4={};function NV(e){return W_.call(R4,e)?!0:W_.call(O4,e)?!1:MV.test(e)?R4[e]=!0:(O4[e]=!0,!1)}function DV(e,t,n,r){if(n!==null&&n.type===0)return!1;switch(typeof t){case"function":case"symbol":return!0;case"boolean":return r?!1:n!==null?!n.acceptsBooleans:(e=e.toLowerCase().slice(0,5),e!=="data-"&&e!=="aria-");default:return!1}}function LV(e,t,n,r){if(t===null||typeof t>"u"||DV(e,t,n,r))return!0;if(r)return!1;if(n!==null)switch(n.type){case 3:return!t;case 4:return t===!1;case 5:return isNaN(t);case 6:return isNaN(t)||1>t}return!1}function pr(e,t,n,r,i,o,s){this.acceptsBooleans=t===2||t===3||t===4,this.attributeName=r,this.attributeNamespace=i,this.mustUseProperty=n,this.propertyName=e,this.type=t,this.sanitizeURL=o,this.removeEmptyString=s}var zn={};"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach(function(e){zn[e]=new pr(e,0,!1,e,null,!1,!1)});[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach(function(e){var t=e[0];zn[t]=new pr(t,1,!1,e[1],null,!1,!1)});["contentEditable","draggable","spellCheck","value"].forEach(function(e){zn[e]=new pr(e,2,!1,e.toLowerCase(),null,!1,!1)});["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach(function(e){zn[e]=new pr(e,2,!1,e,null,!1,!1)});"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope".split(" ").forEach(function(e){zn[e]=new pr(e,3,!1,e.toLowerCase(),null,!1,!1)});["checked","multiple","muted","selected"].forEach(function(e){zn[e]=new pr(e,3,!0,e,null,!1,!1)});["capture","download"].forEach(function(e){zn[e]=new pr(e,4,!1,e,null,!1,!1)});["cols","rows","size","span"].forEach(function(e){zn[e]=new pr(e,6,!1,e,null,!1,!1)});["rowSpan","start"].forEach(function(e){zn[e]=new pr(e,5,!1,e.toLowerCase(),null,!1,!1)});var zx=/[\-:]([a-z])/g;function Ux(e){return e[1].toUpperCase()}"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height".split(" ").forEach(function(e){var t=e.replace(zx,Ux);zn[t]=new pr(t,1,!1,e,null,!1,!1)});"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type".split(" ").forEach(function(e){var t=e.replace(zx,Ux);zn[t]=new pr(t,1,!1,e,"http://www.w3.org/1999/xlink",!1,!1)});["xml:base","xml:lang","xml:space"].forEach(function(e){var t=e.replace(zx,Ux);zn[t]=new pr(t,1,!1,e,"http://www.w3.org/XML/1998/namespace",!1,!1)});["tabIndex","crossOrigin"].forEach(function(e){zn[e]=new pr(e,1,!1,e.toLowerCase(),null,!1,!1)});zn.xlinkHref=new pr("xlinkHref",1,!1,"xlink:href","http://www.w3.org/1999/xlink",!0,!1);["src","href","action","formAction"].forEach(function(e){zn[e]=new pr(e,1,!1,e.toLowerCase(),null,!0,!0)});function Gx(e,t,n,r){var i=zn.hasOwnProperty(t)?zn[t]:null;(i!==null?i.type!==0:r||!(2a||i[s]!==o[a]){var l=` +`+i[s].replace(" at new "," at ");return e.displayName&&l.includes("")&&(l=l.replace("",e.displayName)),l}while(1<=s&&0<=a);break}}}finally{Xb=!1,Error.prepareStackTrace=n}return(e=e?e.displayName||e.name:"")?Vd(e):""}function $V(e){switch(e.tag){case 5:return Vd(e.type);case 16:return Vd("Lazy");case 13:return Vd("Suspense");case 19:return Vd("SuspenseList");case 0:case 2:case 15:return e=Qb(e.type,!1),e;case 11:return e=Qb(e.type.render,!1),e;case 1:return e=Qb(e.type,!0),e;default:return""}}function Q_(e){if(e==null)return null;if(typeof e=="function")return e.displayName||e.name||null;if(typeof e=="string")return e;switch(e){case Tu:return"Fragment";case Cu:return"Portal";case K_:return"Profiler";case Hx:return"StrictMode";case Y_:return"Suspense";case X_:return"SuspenseList"}if(typeof e=="object")switch(e.$$typeof){case _9:return(e.displayName||"Context")+".Consumer";case S9:return(e._context.displayName||"Context")+".Provider";case qx:var t=e.render;return e=e.displayName,e||(e=t.displayName||t.name||"",e=e!==""?"ForwardRef("+e+")":"ForwardRef"),e;case Wx:return t=e.displayName||null,t!==null?t:Q_(e.type)||"Memo";case $s:t=e._payload,e=e._init;try{return Q_(e(t))}catch{}}return null}function FV(e){var t=e.type;switch(e.tag){case 24:return"Cache";case 9:return(t.displayName||"Context")+".Consumer";case 10:return(t._context.displayName||"Context")+".Provider";case 18:return"DehydratedFragment";case 11:return e=t.render,e=e.displayName||e.name||"",t.displayName||(e!==""?"ForwardRef("+e+")":"ForwardRef");case 7:return"Fragment";case 5:return t;case 4:return"Portal";case 3:return"Root";case 6:return"Text";case 16:return Q_(t);case 8:return t===Hx?"StrictMode":"Mode";case 22:return"Offscreen";case 12:return"Profiler";case 21:return"Scope";case 13:return"Suspense";case 19:return"SuspenseList";case 25:return"TracingMarker";case 1:case 0:case 17:case 2:case 14:case 15:if(typeof t=="function")return t.displayName||t.name||null;if(typeof t=="string")return t}return null}function fa(e){switch(typeof e){case"boolean":case"number":case"string":case"undefined":return e;case"object":return e;default:return""}}function x9(e){var t=e.type;return(e=e.nodeName)&&e.toLowerCase()==="input"&&(t==="checkbox"||t==="radio")}function BV(e){var t=x9(e)?"checked":"value",n=Object.getOwnPropertyDescriptor(e.constructor.prototype,t),r=""+e[t];if(!e.hasOwnProperty(t)&&typeof n<"u"&&typeof n.get=="function"&&typeof n.set=="function"){var i=n.get,o=n.set;return Object.defineProperty(e,t,{configurable:!0,get:function(){return i.call(this)},set:function(s){r=""+s,o.call(this,s)}}),Object.defineProperty(e,t,{enumerable:n.enumerable}),{getValue:function(){return r},setValue:function(s){r=""+s},stopTracking:function(){e._valueTracker=null,delete e[t]}}}}function Kp(e){e._valueTracker||(e._valueTracker=BV(e))}function C9(e){if(!e)return!1;var t=e._valueTracker;if(!t)return!0;var n=t.getValue(),r="";return e&&(r=x9(e)?e.checked?"true":"false":e.value),e=r,e!==n?(t.setValue(e),!0):!1}function $m(e){if(e=e||(typeof document<"u"?document:void 0),typeof e>"u")return null;try{return e.activeElement||e.body}catch{return e.body}}function Z_(e,t){var n=t.checked;return Ft({},t,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:n??e._wrapperState.initialChecked})}function M4(e,t){var n=t.defaultValue==null?"":t.defaultValue,r=t.checked!=null?t.checked:t.defaultChecked;n=fa(t.value!=null?t.value:n),e._wrapperState={initialChecked:r,initialValue:n,controlled:t.type==="checkbox"||t.type==="radio"?t.checked!=null:t.value!=null}}function T9(e,t){t=t.checked,t!=null&&Gx(e,"checked",t,!1)}function J_(e,t){T9(e,t);var n=fa(t.value),r=t.type;if(n!=null)r==="number"?(n===0&&e.value===""||e.value!=n)&&(e.value=""+n):e.value!==""+n&&(e.value=""+n);else if(r==="submit"||r==="reset"){e.removeAttribute("value");return}t.hasOwnProperty("value")?e2(e,t.type,n):t.hasOwnProperty("defaultValue")&&e2(e,t.type,fa(t.defaultValue)),t.checked==null&&t.defaultChecked!=null&&(e.defaultChecked=!!t.defaultChecked)}function N4(e,t,n){if(t.hasOwnProperty("value")||t.hasOwnProperty("defaultValue")){var r=t.type;if(!(r!=="submit"&&r!=="reset"||t.value!==void 0&&t.value!==null))return;t=""+e._wrapperState.initialValue,n||t===e.value||(e.value=t),e.defaultValue=t}n=e.name,n!==""&&(e.name=""),e.defaultChecked=!!e._wrapperState.initialChecked,n!==""&&(e.name=n)}function e2(e,t,n){(t!=="number"||$m(e.ownerDocument)!==e)&&(n==null?e.defaultValue=""+e._wrapperState.initialValue:e.defaultValue!==""+n&&(e.defaultValue=""+n))}var zd=Array.isArray;function zu(e,t,n,r){if(e=e.options,t){t={};for(var i=0;i"+t.valueOf().toString()+"",t=Yp.firstChild;e.firstChild;)e.removeChild(e.firstChild);for(;t.firstChild;)e.appendChild(t.firstChild)}});function xf(e,t){if(t){var n=e.firstChild;if(n&&n===e.lastChild&&n.nodeType===3){n.nodeValue=t;return}}e.textContent=t}var Jd={animationIterationCount:!0,aspectRatio:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},jV=["Webkit","ms","Moz","O"];Object.keys(Jd).forEach(function(e){jV.forEach(function(t){t=t+e.charAt(0).toUpperCase()+e.substring(1),Jd[t]=Jd[e]})});function A9(e,t,n){return t==null||typeof t=="boolean"||t===""?"":n||typeof t!="number"||t===0||Jd.hasOwnProperty(e)&&Jd[e]?(""+t).trim():t+"px"}function O9(e,t){e=e.style;for(var n in t)if(t.hasOwnProperty(n)){var r=n.indexOf("--")===0,i=A9(n,t[n],r);n==="float"&&(n="cssFloat"),r?e.setProperty(n,i):e[n]=i}}var VV=Ft({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});function r2(e,t){if(t){if(VV[e]&&(t.children!=null||t.dangerouslySetInnerHTML!=null))throw Error(te(137,e));if(t.dangerouslySetInnerHTML!=null){if(t.children!=null)throw Error(te(60));if(typeof t.dangerouslySetInnerHTML!="object"||!("__html"in t.dangerouslySetInnerHTML))throw Error(te(61))}if(t.style!=null&&typeof t.style!="object")throw Error(te(62))}}function i2(e,t){if(e.indexOf("-")===-1)return typeof t.is=="string";switch(e){case"annotation-xml":case"color-profile":case"font-face":case"font-face-src":case"font-face-uri":case"font-face-format":case"font-face-name":case"missing-glyph":return!1;default:return!0}}var o2=null;function Kx(e){return e=e.target||e.srcElement||window,e.correspondingUseElement&&(e=e.correspondingUseElement),e.nodeType===3?e.parentNode:e}var s2=null,Uu=null,Gu=null;function $4(e){if(e=Wh(e)){if(typeof s2!="function")throw Error(te(280));var t=e.stateNode;t&&(t=O0(t),s2(e.stateNode,e.type,t))}}function R9(e){Uu?Gu?Gu.push(e):Gu=[e]:Uu=e}function I9(){if(Uu){var e=Uu,t=Gu;if(Gu=Uu=null,$4(e),t)for(e=0;e>>=0,e===0?32:31-(ZV(e)/JV|0)|0}var Xp=64,Qp=4194304;function Ud(e){switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return e&4194240;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return e&130023424;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 1073741824;default:return e}}function Vm(e,t){var n=e.pendingLanes;if(n===0)return 0;var r=0,i=e.suspendedLanes,o=e.pingedLanes,s=n&268435455;if(s!==0){var a=s&~i;a!==0?r=Ud(a):(o&=s,o!==0&&(r=Ud(o)))}else s=n&~i,s!==0?r=Ud(s):o!==0&&(r=Ud(o));if(r===0)return 0;if(t!==0&&t!==r&&!(t&i)&&(i=r&-r,o=t&-t,i>=o||i===16&&(o&4194240)!==0))return t;if(r&4&&(r|=n&16),t=e.entangledLanes,t!==0)for(e=e.entanglements,t&=r;0n;n++)t.push(e);return t}function Hh(e,t,n){e.pendingLanes|=t,t!==536870912&&(e.suspendedLanes=0,e.pingedLanes=0),e=e.eventTimes,t=31-Ii(t),e[t]=n}function rz(e,t){var n=e.pendingLanes&~t;e.pendingLanes=t,e.suspendedLanes=0,e.pingedLanes=0,e.expiredLanes&=t,e.mutableReadLanes&=t,e.entangledLanes&=t,t=e.entanglements;var r=e.eventTimes;for(e=e.expirationTimes;0=tf),q4=String.fromCharCode(32),W4=!1;function Z9(e,t){switch(e){case"keyup":return Rz.indexOf(t.keyCode)!==-1;case"keydown":return t.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function J9(e){return e=e.detail,typeof e=="object"&&"data"in e?e.data:null}var Eu=!1;function Mz(e,t){switch(e){case"compositionend":return J9(t);case"keypress":return t.which!==32?null:(W4=!0,q4);case"textInput":return e=t.data,e===q4&&W4?null:e;default:return null}}function Nz(e,t){if(Eu)return e==="compositionend"||!nC&&Z9(e,t)?(e=X9(),Qg=Jx=Ks=null,Eu=!1,e):null;switch(e){case"paste":return null;case"keypress":if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1=t)return{node:n,offset:t-e};e=r}e:{for(;n;){if(n.nextSibling){n=n.nextSibling;break e}n=n.parentNode}n=void 0}n=Q4(n)}}function rO(e,t){return e&&t?e===t?!0:e&&e.nodeType===3?!1:t&&t.nodeType===3?rO(e,t.parentNode):"contains"in e?e.contains(t):e.compareDocumentPosition?!!(e.compareDocumentPosition(t)&16):!1:!1}function iO(){for(var e=window,t=$m();t instanceof e.HTMLIFrameElement;){try{var n=typeof t.contentWindow.location.href=="string"}catch{n=!1}if(n)e=t.contentWindow;else break;t=$m(e.document)}return t}function rC(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&(t==="input"&&(e.type==="text"||e.type==="search"||e.type==="tel"||e.type==="url"||e.type==="password")||t==="textarea"||e.contentEditable==="true")}function Uz(e){var t=iO(),n=e.focusedElem,r=e.selectionRange;if(t!==n&&n&&n.ownerDocument&&rO(n.ownerDocument.documentElement,n)){if(r!==null&&rC(n)){if(t=r.start,e=r.end,e===void 0&&(e=t),"selectionStart"in n)n.selectionStart=t,n.selectionEnd=Math.min(e,n.value.length);else if(e=(t=n.ownerDocument||document)&&t.defaultView||window,e.getSelection){e=e.getSelection();var i=n.textContent.length,o=Math.min(r.start,i);r=r.end===void 0?o:Math.min(r.end,i),!e.extend&&o>r&&(i=r,r=o,o=i),i=Z4(n,o);var s=Z4(n,r);i&&s&&(e.rangeCount!==1||e.anchorNode!==i.node||e.anchorOffset!==i.offset||e.focusNode!==s.node||e.focusOffset!==s.offset)&&(t=t.createRange(),t.setStart(i.node,i.offset),e.removeAllRanges(),o>r?(e.addRange(t),e.extend(s.node,s.offset)):(t.setEnd(s.node,s.offset),e.addRange(t)))}}for(t=[],e=n;e=e.parentNode;)e.nodeType===1&&t.push({element:e,left:e.scrollLeft,top:e.scrollTop});for(typeof n.focus=="function"&&n.focus(),n=0;n=document.documentMode,Pu=null,f2=null,rf=null,h2=!1;function J4(e,t,n){var r=n.window===n?n.document:n.nodeType===9?n:n.ownerDocument;h2||Pu==null||Pu!==$m(r)||(r=Pu,"selectionStart"in r&&rC(r)?r={start:r.selectionStart,end:r.selectionEnd}:(r=(r.ownerDocument&&r.ownerDocument.defaultView||window).getSelection(),r={anchorNode:r.anchorNode,anchorOffset:r.anchorOffset,focusNode:r.focusNode,focusOffset:r.focusOffset}),rf&&Af(rf,r)||(rf=r,r=Gm(f2,"onSelect"),0Ou||(e.current=b2[Ou],b2[Ou]=null,Ou--)}function mt(e,t){Ou++,b2[Ou]=e.current,e.current=t}var ha={},Zn=Ta(ha),Tr=Ta(!1),gl=ha;function hc(e,t){var n=e.type.contextTypes;if(!n)return ha;var r=e.stateNode;if(r&&r.__reactInternalMemoizedUnmaskedChildContext===t)return r.__reactInternalMemoizedMaskedChildContext;var i={},o;for(o in n)i[o]=t[o];return r&&(e=e.stateNode,e.__reactInternalMemoizedUnmaskedChildContext=t,e.__reactInternalMemoizedMaskedChildContext=i),i}function Er(e){return e=e.childContextTypes,e!=null}function qm(){_t(Tr),_t(Zn)}function sT(e,t,n){if(Zn.current!==ha)throw Error(te(168));mt(Zn,t),mt(Tr,n)}function hO(e,t,n){var r=e.stateNode;if(t=t.childContextTypes,typeof r.getChildContext!="function")return n;r=r.getChildContext();for(var i in r)if(!(i in t))throw Error(te(108,FV(e)||"Unknown",i));return Ft({},n,r)}function Wm(e){return e=(e=e.stateNode)&&e.__reactInternalMemoizedMergedChildContext||ha,gl=Zn.current,mt(Zn,e),mt(Tr,Tr.current),!0}function aT(e,t,n){var r=e.stateNode;if(!r)throw Error(te(169));n?(e=hO(e,t,gl),r.__reactInternalMemoizedMergedChildContext=e,_t(Tr),_t(Zn),mt(Zn,e)):_t(Tr),mt(Tr,n)}var Ko=null,R0=!1,dS=!1;function pO(e){Ko===null?Ko=[e]:Ko.push(e)}function tU(e){R0=!0,pO(e)}function Ea(){if(!dS&&Ko!==null){dS=!0;var e=0,t=rt;try{var n=Ko;for(rt=1;e>=s,i-=s,Qo=1<<32-Ii(t)+i|n<C?(k=x,x=null):k=x.sibling;var P=f(v,x,g[C],b);if(P===null){x===null&&(x=k);break}e&&x&&P.alternate===null&&t(v,x),y=o(P,y,C),w===null?_=P:w.sibling=P,w=P,x=k}if(C===g.length)return n(v,x),Pt&&Ga(v,C),_;if(x===null){for(;CC?(k=x,x=null):k=x.sibling;var A=f(v,x,P.value,b);if(A===null){x===null&&(x=k);break}e&&x&&A.alternate===null&&t(v,x),y=o(A,y,C),w===null?_=A:w.sibling=A,w=A,x=k}if(P.done)return n(v,x),Pt&&Ga(v,C),_;if(x===null){for(;!P.done;C++,P=g.next())P=d(v,P.value,b),P!==null&&(y=o(P,y,C),w===null?_=P:w.sibling=P,w=P);return Pt&&Ga(v,C),_}for(x=r(v,x);!P.done;C++,P=g.next())P=h(x,v,C,P.value,b),P!==null&&(e&&P.alternate!==null&&x.delete(P.key===null?C:P.key),y=o(P,y,C),w===null?_=P:w.sibling=P,w=P);return e&&x.forEach(function($){return t(v,$)}),Pt&&Ga(v,C),_}function S(v,y,g,b){if(typeof g=="object"&&g!==null&&g.type===Tu&&g.key===null&&(g=g.props.children),typeof g=="object"&&g!==null){switch(g.$$typeof){case Wp:e:{for(var _=g.key,w=y;w!==null;){if(w.key===_){if(_=g.type,_===Tu){if(w.tag===7){n(v,w.sibling),y=i(w,g.props.children),y.return=v,v=y;break e}}else if(w.elementType===_||typeof _=="object"&&_!==null&&_.$$typeof===$s&&pT(_)===w.type){n(v,w.sibling),y=i(w,g.props),y.ref=vd(v,w,g),y.return=v,v=y;break e}n(v,w);break}else t(v,w);w=w.sibling}g.type===Tu?(y=al(g.props.children,v.mode,b,g.key),y.return=v,v=y):(b=om(g.type,g.key,g.props,null,v.mode,b),b.ref=vd(v,y,g),b.return=v,v=b)}return s(v);case Cu:e:{for(w=g.key;y!==null;){if(y.key===w)if(y.tag===4&&y.stateNode.containerInfo===g.containerInfo&&y.stateNode.implementation===g.implementation){n(v,y.sibling),y=i(y,g.children||[]),y.return=v,v=y;break e}else{n(v,y);break}else t(v,y);y=y.sibling}y=bS(g,v.mode,b),y.return=v,v=y}return s(v);case $s:return w=g._init,S(v,y,w(g._payload),b)}if(zd(g))return p(v,y,g,b);if(hd(g))return m(v,y,g,b);ig(v,g)}return typeof g=="string"&&g!==""||typeof g=="number"?(g=""+g,y!==null&&y.tag===6?(n(v,y.sibling),y=i(y,g),y.return=v,v=y):(n(v,y),y=vS(g,v.mode,b),y.return=v,v=y),s(v)):n(v,y)}return S}var gc=wO(!0),xO=wO(!1),Kh={},go=Ta(Kh),Mf=Ta(Kh),Nf=Ta(Kh);function el(e){if(e===Kh)throw Error(te(174));return e}function fC(e,t){switch(mt(Nf,t),mt(Mf,e),mt(go,Kh),e=t.nodeType,e){case 9:case 11:t=(t=t.documentElement)?t.namespaceURI:n2(null,"");break;default:e=e===8?t.parentNode:t,t=e.namespaceURI||null,e=e.tagName,t=n2(t,e)}_t(go),mt(go,t)}function mc(){_t(go),_t(Mf),_t(Nf)}function CO(e){el(Nf.current);var t=el(go.current),n=n2(t,e.type);t!==n&&(mt(Mf,e),mt(go,n))}function hC(e){Mf.current===e&&(_t(go),_t(Mf))}var Mt=Ta(0);function Jm(e){for(var t=e;t!==null;){if(t.tag===13){var n=t.memoizedState;if(n!==null&&(n=n.dehydrated,n===null||n.data==="$?"||n.data==="$!"))return t}else if(t.tag===19&&t.memoizedProps.revealOrder!==void 0){if(t.flags&128)return t}else if(t.child!==null){t.child.return=t,t=t.child;continue}if(t===e)break;for(;t.sibling===null;){if(t.return===null||t.return===e)return null;t=t.return}t.sibling.return=t.return,t=t.sibling}return null}var fS=[];function pC(){for(var e=0;en?n:4,e(!0);var r=hS.transition;hS.transition={};try{e(!1),t()}finally{rt=n,hS.transition=r}}function jO(){return gi().memoizedState}function oU(e,t,n){var r=ra(e);if(n={lane:r,action:n,hasEagerState:!1,eagerState:null,next:null},VO(e))zO(t,n);else if(n=vO(e,t,n,r),n!==null){var i=cr();Mi(n,e,r,i),UO(n,t,r)}}function sU(e,t,n){var r=ra(e),i={lane:r,action:n,hasEagerState:!1,eagerState:null,next:null};if(VO(e))zO(t,i);else{var o=e.alternate;if(e.lanes===0&&(o===null||o.lanes===0)&&(o=t.lastRenderedReducer,o!==null))try{var s=t.lastRenderedState,a=o(s,n);if(i.hasEagerState=!0,i.eagerState=a,Fi(a,s)){var l=t.interleaved;l===null?(i.next=i,cC(t)):(i.next=l.next,l.next=i),t.interleaved=i;return}}catch{}finally{}n=vO(e,t,i,r),n!==null&&(i=cr(),Mi(n,e,r,i),UO(n,t,r))}}function VO(e){var t=e.alternate;return e===$t||t!==null&&t===$t}function zO(e,t){of=ey=!0;var n=e.pending;n===null?t.next=t:(t.next=n.next,n.next=t),e.pending=t}function UO(e,t,n){if(n&4194240){var r=t.lanes;r&=e.pendingLanes,n|=r,t.lanes=n,Xx(e,n)}}var ty={readContext:pi,useCallback:qn,useContext:qn,useEffect:qn,useImperativeHandle:qn,useInsertionEffect:qn,useLayoutEffect:qn,useMemo:qn,useReducer:qn,useRef:qn,useState:qn,useDebugValue:qn,useDeferredValue:qn,useTransition:qn,useMutableSource:qn,useSyncExternalStore:qn,useId:qn,unstable_isNewReconciler:!1},aU={readContext:pi,useCallback:function(e,t){return Ki().memoizedState=[e,t===void 0?null:t],e},useContext:pi,useEffect:mT,useImperativeHandle:function(e,t,n){return n=n!=null?n.concat([e]):null,tm(4194308,4,DO.bind(null,t,e),n)},useLayoutEffect:function(e,t){return tm(4194308,4,e,t)},useInsertionEffect:function(e,t){return tm(4,2,e,t)},useMemo:function(e,t){var n=Ki();return t=t===void 0?null:t,e=e(),n.memoizedState=[e,t],e},useReducer:function(e,t,n){var r=Ki();return t=n!==void 0?n(t):t,r.memoizedState=r.baseState=t,e={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:t},r.queue=e,e=e.dispatch=oU.bind(null,$t,e),[r.memoizedState,e]},useRef:function(e){var t=Ki();return e={current:e},t.memoizedState=e},useState:gT,useDebugValue:bC,useDeferredValue:function(e){return Ki().memoizedState=e},useTransition:function(){var e=gT(!1),t=e[0];return e=iU.bind(null,e[1]),Ki().memoizedState=e,[t,e]},useMutableSource:function(){},useSyncExternalStore:function(e,t,n){var r=$t,i=Ki();if(Pt){if(n===void 0)throw Error(te(407));n=n()}else{if(n=t(),En===null)throw Error(te(349));yl&30||PO(r,t,n)}i.memoizedState=n;var o={value:n,getSnapshot:t};return i.queue=o,mT(AO.bind(null,r,o,e),[e]),r.flags|=2048,$f(9,kO.bind(null,r,o,n,t),void 0,null),n},useId:function(){var e=Ki(),t=En.identifierPrefix;if(Pt){var n=Zo,r=Qo;n=(r&~(1<<32-Ii(r)-1)).toString(32)+n,t=":"+t+"R"+n,n=Df++,0<\/script>",e=e.removeChild(e.firstChild)):typeof r.is=="string"?e=s.createElement(n,{is:r.is}):(e=s.createElement(n),n==="select"&&(s=e,r.multiple?s.multiple=!0:r.size&&(s.size=r.size))):e=s.createElementNS(e,n),e[to]=t,e[If]=r,ZO(e,t,!1,!1),t.stateNode=e;e:{switch(s=i2(n,r),n){case"dialog":vt("cancel",e),vt("close",e),i=r;break;case"iframe":case"object":case"embed":vt("load",e),i=r;break;case"video":case"audio":for(i=0;ivc&&(t.flags|=128,r=!0,bd(o,!1),t.lanes=4194304)}else{if(!r)if(e=Jm(s),e!==null){if(t.flags|=128,r=!0,n=e.updateQueue,n!==null&&(t.updateQueue=n,t.flags|=4),bd(o,!0),o.tail===null&&o.tailMode==="hidden"&&!s.alternate&&!Pt)return Wn(t),null}else 2*Ht()-o.renderingStartTime>vc&&n!==1073741824&&(t.flags|=128,r=!0,bd(o,!1),t.lanes=4194304);o.isBackwards?(s.sibling=t.child,t.child=s):(n=o.last,n!==null?n.sibling=s:t.child=s,o.last=s)}return o.tail!==null?(t=o.tail,o.rendering=t,o.tail=t.sibling,o.renderingStartTime=Ht(),t.sibling=null,n=Mt.current,mt(Mt,r?n&1|2:n&1),t):(Wn(t),null);case 22:case 23:return TC(),r=t.memoizedState!==null,e!==null&&e.memoizedState!==null!==r&&(t.flags|=8192),r&&t.mode&1?Lr&1073741824&&(Wn(t),t.subtreeFlags&6&&(t.flags|=8192)):Wn(t),null;case 24:return null;case 25:return null}throw Error(te(156,t.tag))}function gU(e,t){switch(oC(t),t.tag){case 1:return Er(t.type)&&qm(),e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 3:return mc(),_t(Tr),_t(Zn),pC(),e=t.flags,e&65536&&!(e&128)?(t.flags=e&-65537|128,t):null;case 5:return hC(t),null;case 13:if(_t(Mt),e=t.memoizedState,e!==null&&e.dehydrated!==null){if(t.alternate===null)throw Error(te(340));pc()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 19:return _t(Mt),null;case 4:return mc(),null;case 10:return uC(t.type._context),null;case 22:case 23:return TC(),null;case 24:return null;default:return null}}var sg=!1,Qn=!1,mU=typeof WeakSet=="function"?WeakSet:Set,de=null;function Nu(e,t){var n=e.ref;if(n!==null)if(typeof n=="function")try{n(null)}catch(r){jt(e,t,r)}else n.current=null}function R2(e,t,n){try{n()}catch(r){jt(e,t,r)}}var TT=!1;function yU(e,t){if(p2=zm,e=iO(),rC(e)){if("selectionStart"in e)var n={start:e.selectionStart,end:e.selectionEnd};else e:{n=(n=e.ownerDocument)&&n.defaultView||window;var r=n.getSelection&&n.getSelection();if(r&&r.rangeCount!==0){n=r.anchorNode;var i=r.anchorOffset,o=r.focusNode;r=r.focusOffset;try{n.nodeType,o.nodeType}catch{n=null;break e}var s=0,a=-1,l=-1,u=0,c=0,d=e,f=null;t:for(;;){for(var h;d!==n||i!==0&&d.nodeType!==3||(a=s+i),d!==o||r!==0&&d.nodeType!==3||(l=s+r),d.nodeType===3&&(s+=d.nodeValue.length),(h=d.firstChild)!==null;)f=d,d=h;for(;;){if(d===e)break t;if(f===n&&++u===i&&(a=s),f===o&&++c===r&&(l=s),(h=d.nextSibling)!==null)break;d=f,f=d.parentNode}d=h}n=a===-1||l===-1?null:{start:a,end:l}}else n=null}n=n||{start:0,end:0}}else n=null;for(g2={focusedElem:e,selectionRange:n},zm=!1,de=t;de!==null;)if(t=de,e=t.child,(t.subtreeFlags&1028)!==0&&e!==null)e.return=t,de=e;else for(;de!==null;){t=de;try{var p=t.alternate;if(t.flags&1024)switch(t.tag){case 0:case 11:case 15:break;case 1:if(p!==null){var m=p.memoizedProps,S=p.memoizedState,v=t.stateNode,y=v.getSnapshotBeforeUpdate(t.elementType===t.type?m:Ti(t.type,m),S);v.__reactInternalSnapshotBeforeUpdate=y}break;case 3:var g=t.stateNode.containerInfo;g.nodeType===1?g.textContent="":g.nodeType===9&&g.documentElement&&g.removeChild(g.documentElement);break;case 5:case 6:case 4:case 17:break;default:throw Error(te(163))}}catch(b){jt(t,t.return,b)}if(e=t.sibling,e!==null){e.return=t.return,de=e;break}de=t.return}return p=TT,TT=!1,p}function sf(e,t,n){var r=t.updateQueue;if(r=r!==null?r.lastEffect:null,r!==null){var i=r=r.next;do{if((i.tag&e)===e){var o=i.destroy;i.destroy=void 0,o!==void 0&&R2(t,n,o)}i=i.next}while(i!==r)}}function N0(e,t){if(t=t.updateQueue,t=t!==null?t.lastEffect:null,t!==null){var n=t=t.next;do{if((n.tag&e)===e){var r=n.create;n.destroy=r()}n=n.next}while(n!==t)}}function I2(e){var t=e.ref;if(t!==null){var n=e.stateNode;switch(e.tag){case 5:e=n;break;default:e=n}typeof t=="function"?t(e):t.current=e}}function tR(e){var t=e.alternate;t!==null&&(e.alternate=null,tR(t)),e.child=null,e.deletions=null,e.sibling=null,e.tag===5&&(t=e.stateNode,t!==null&&(delete t[to],delete t[If],delete t[v2],delete t[Jz],delete t[eU])),e.stateNode=null,e.return=null,e.dependencies=null,e.memoizedProps=null,e.memoizedState=null,e.pendingProps=null,e.stateNode=null,e.updateQueue=null}function nR(e){return e.tag===5||e.tag===3||e.tag===4}function ET(e){e:for(;;){for(;e.sibling===null;){if(e.return===null||nR(e.return))return null;e=e.return}for(e.sibling.return=e.return,e=e.sibling;e.tag!==5&&e.tag!==6&&e.tag!==18;){if(e.flags&2||e.child===null||e.tag===4)continue e;e.child.return=e,e=e.child}if(!(e.flags&2))return e.stateNode}}function M2(e,t,n){var r=e.tag;if(r===5||r===6)e=e.stateNode,t?n.nodeType===8?n.parentNode.insertBefore(e,t):n.insertBefore(e,t):(n.nodeType===8?(t=n.parentNode,t.insertBefore(e,n)):(t=n,t.appendChild(e)),n=n._reactRootContainer,n!=null||t.onclick!==null||(t.onclick=Hm));else if(r!==4&&(e=e.child,e!==null))for(M2(e,t,n),e=e.sibling;e!==null;)M2(e,t,n),e=e.sibling}function N2(e,t,n){var r=e.tag;if(r===5||r===6)e=e.stateNode,t?n.insertBefore(e,t):n.appendChild(e);else if(r!==4&&(e=e.child,e!==null))for(N2(e,t,n),e=e.sibling;e!==null;)N2(e,t,n),e=e.sibling}var Nn=null,Ei=!1;function As(e,t,n){for(n=n.child;n!==null;)rR(e,t,n),n=n.sibling}function rR(e,t,n){if(po&&typeof po.onCommitFiberUnmount=="function")try{po.onCommitFiberUnmount(E0,n)}catch{}switch(n.tag){case 5:Qn||Nu(n,t);case 6:var r=Nn,i=Ei;Nn=null,As(e,t,n),Nn=r,Ei=i,Nn!==null&&(Ei?(e=Nn,n=n.stateNode,e.nodeType===8?e.parentNode.removeChild(n):e.removeChild(n)):Nn.removeChild(n.stateNode));break;case 18:Nn!==null&&(Ei?(e=Nn,n=n.stateNode,e.nodeType===8?cS(e.parentNode,n):e.nodeType===1&&cS(e,n),Pf(e)):cS(Nn,n.stateNode));break;case 4:r=Nn,i=Ei,Nn=n.stateNode.containerInfo,Ei=!0,As(e,t,n),Nn=r,Ei=i;break;case 0:case 11:case 14:case 15:if(!Qn&&(r=n.updateQueue,r!==null&&(r=r.lastEffect,r!==null))){i=r=r.next;do{var o=i,s=o.destroy;o=o.tag,s!==void 0&&(o&2||o&4)&&R2(n,t,s),i=i.next}while(i!==r)}As(e,t,n);break;case 1:if(!Qn&&(Nu(n,t),r=n.stateNode,typeof r.componentWillUnmount=="function"))try{r.props=n.memoizedProps,r.state=n.memoizedState,r.componentWillUnmount()}catch(a){jt(n,t,a)}As(e,t,n);break;case 21:As(e,t,n);break;case 22:n.mode&1?(Qn=(r=Qn)||n.memoizedState!==null,As(e,t,n),Qn=r):As(e,t,n);break;default:As(e,t,n)}}function PT(e){var t=e.updateQueue;if(t!==null){e.updateQueue=null;var n=e.stateNode;n===null&&(n=e.stateNode=new mU),t.forEach(function(r){var i=EU.bind(null,e,r);n.has(r)||(n.add(r),r.then(i,i))})}}function wi(e,t){var n=t.deletions;if(n!==null)for(var r=0;ri&&(i=s),r&=~o}if(r=i,r=Ht()-r,r=(120>r?120:480>r?480:1080>r?1080:1920>r?1920:3e3>r?3e3:4320>r?4320:1960*bU(r/1960))-r,10e?16:e,Ys===null)var r=!1;else{if(e=Ys,Ys=null,iy=0,Ke&6)throw Error(te(331));var i=Ke;for(Ke|=4,de=e.current;de!==null;){var o=de,s=o.child;if(de.flags&16){var a=o.deletions;if(a!==null){for(var l=0;lHt()-xC?sl(e,0):wC|=n),Pr(e,t)}function dR(e,t){t===0&&(e.mode&1?(t=Qp,Qp<<=1,!(Qp&130023424)&&(Qp=4194304)):t=1);var n=cr();e=cs(e,t),e!==null&&(Hh(e,t,n),Pr(e,n))}function TU(e){var t=e.memoizedState,n=0;t!==null&&(n=t.retryLane),dR(e,n)}function EU(e,t){var n=0;switch(e.tag){case 13:var r=e.stateNode,i=e.memoizedState;i!==null&&(n=i.retryLane);break;case 19:r=e.stateNode;break;default:throw Error(te(314))}r!==null&&r.delete(t),dR(e,n)}var fR;fR=function(e,t,n){if(e!==null)if(e.memoizedProps!==t.pendingProps||Tr.current)wr=!0;else{if(!(e.lanes&n)&&!(t.flags&128))return wr=!1,hU(e,t,n);wr=!!(e.flags&131072)}else wr=!1,Pt&&t.flags&1048576&&gO(t,Ym,t.index);switch(t.lanes=0,t.tag){case 2:var r=t.type;nm(e,t),e=t.pendingProps;var i=hc(t,Zn.current);qu(t,n),i=mC(null,t,r,e,i,n);var o=yC();return t.flags|=1,typeof i=="object"&&i!==null&&typeof i.render=="function"&&i.$$typeof===void 0?(t.tag=1,t.memoizedState=null,t.updateQueue=null,Er(r)?(o=!0,Wm(t)):o=!1,t.memoizedState=i.state!==null&&i.state!==void 0?i.state:null,dC(t),i.updater=I0,t.stateNode=i,i._reactInternals=t,C2(t,r,e,n),t=P2(null,t,r,!0,o,n)):(t.tag=0,Pt&&o&&iC(t),lr(null,t,i,n),t=t.child),t;case 16:r=t.elementType;e:{switch(nm(e,t),e=t.pendingProps,i=r._init,r=i(r._payload),t.type=r,i=t.tag=kU(r),e=Ti(r,e),i){case 0:t=E2(null,t,r,e,n);break e;case 1:t=wT(null,t,r,e,n);break e;case 11:t=ST(null,t,r,e,n);break e;case 14:t=_T(null,t,r,Ti(r.type,e),n);break e}throw Error(te(306,r,""))}return t;case 0:return r=t.type,i=t.pendingProps,i=t.elementType===r?i:Ti(r,i),E2(e,t,r,i,n);case 1:return r=t.type,i=t.pendingProps,i=t.elementType===r?i:Ti(r,i),wT(e,t,r,i,n);case 3:e:{if(YO(t),e===null)throw Error(te(387));r=t.pendingProps,o=t.memoizedState,i=o.element,bO(e,t),Zm(t,r,null,n);var s=t.memoizedState;if(r=s.element,o.isDehydrated)if(o={element:r,isDehydrated:!1,cache:s.cache,pendingSuspenseBoundaries:s.pendingSuspenseBoundaries,transitions:s.transitions},t.updateQueue.baseState=o,t.memoizedState=o,t.flags&256){i=yc(Error(te(423)),t),t=xT(e,t,r,n,i);break e}else if(r!==i){i=yc(Error(te(424)),t),t=xT(e,t,r,n,i);break e}else for(Fr=ea(t.stateNode.containerInfo.firstChild),jr=t,Pt=!0,ki=null,n=xO(t,null,r,n),t.child=n;n;)n.flags=n.flags&-3|4096,n=n.sibling;else{if(pc(),r===i){t=ds(e,t,n);break e}lr(e,t,r,n)}t=t.child}return t;case 5:return CO(t),e===null&&_2(t),r=t.type,i=t.pendingProps,o=e!==null?e.memoizedProps:null,s=i.children,m2(r,i)?s=null:o!==null&&m2(r,o)&&(t.flags|=32),KO(e,t),lr(e,t,s,n),t.child;case 6:return e===null&&_2(t),null;case 13:return XO(e,t,n);case 4:return fC(t,t.stateNode.containerInfo),r=t.pendingProps,e===null?t.child=gc(t,null,r,n):lr(e,t,r,n),t.child;case 11:return r=t.type,i=t.pendingProps,i=t.elementType===r?i:Ti(r,i),ST(e,t,r,i,n);case 7:return lr(e,t,t.pendingProps,n),t.child;case 8:return lr(e,t,t.pendingProps.children,n),t.child;case 12:return lr(e,t,t.pendingProps.children,n),t.child;case 10:e:{if(r=t.type._context,i=t.pendingProps,o=t.memoizedProps,s=i.value,mt(Xm,r._currentValue),r._currentValue=s,o!==null)if(Fi(o.value,s)){if(o.children===i.children&&!Tr.current){t=ds(e,t,n);break e}}else for(o=t.child,o!==null&&(o.return=t);o!==null;){var a=o.dependencies;if(a!==null){s=o.child;for(var l=a.firstContext;l!==null;){if(l.context===r){if(o.tag===1){l=ns(-1,n&-n),l.tag=2;var u=o.updateQueue;if(u!==null){u=u.shared;var c=u.pending;c===null?l.next=l:(l.next=c.next,c.next=l),u.pending=l}}o.lanes|=n,l=o.alternate,l!==null&&(l.lanes|=n),w2(o.return,n,t),a.lanes|=n;break}l=l.next}}else if(o.tag===10)s=o.type===t.type?null:o.child;else if(o.tag===18){if(s=o.return,s===null)throw Error(te(341));s.lanes|=n,a=s.alternate,a!==null&&(a.lanes|=n),w2(s,n,t),s=o.sibling}else s=o.child;if(s!==null)s.return=o;else for(s=o;s!==null;){if(s===t){s=null;break}if(o=s.sibling,o!==null){o.return=s.return,s=o;break}s=s.return}o=s}lr(e,t,i.children,n),t=t.child}return t;case 9:return i=t.type,r=t.pendingProps.children,qu(t,n),i=pi(i),r=r(i),t.flags|=1,lr(e,t,r,n),t.child;case 14:return r=t.type,i=Ti(r,t.pendingProps),i=Ti(r.type,i),_T(e,t,r,i,n);case 15:return qO(e,t,t.type,t.pendingProps,n);case 17:return r=t.type,i=t.pendingProps,i=t.elementType===r?i:Ti(r,i),nm(e,t),t.tag=1,Er(r)?(e=!0,Wm(t)):e=!1,qu(t,n),_O(t,r,i),C2(t,r,i,n),P2(null,t,r,!0,e,n);case 19:return QO(e,t,n);case 22:return WO(e,t,n)}throw Error(te(156,t.tag))};function hR(e,t){return B9(e,t)}function PU(e,t,n,r){this.tag=e,this.key=n,this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null,this.index=0,this.ref=null,this.pendingProps=t,this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null,this.mode=r,this.subtreeFlags=this.flags=0,this.deletions=null,this.childLanes=this.lanes=0,this.alternate=null}function ui(e,t,n,r){return new PU(e,t,n,r)}function PC(e){return e=e.prototype,!(!e||!e.isReactComponent)}function kU(e){if(typeof e=="function")return PC(e)?1:0;if(e!=null){if(e=e.$$typeof,e===qx)return 11;if(e===Wx)return 14}return 2}function ia(e,t){var n=e.alternate;return n===null?(n=ui(e.tag,t,e.key,e.mode),n.elementType=e.elementType,n.type=e.type,n.stateNode=e.stateNode,n.alternate=e,e.alternate=n):(n.pendingProps=t,n.type=e.type,n.flags=0,n.subtreeFlags=0,n.deletions=null),n.flags=e.flags&14680064,n.childLanes=e.childLanes,n.lanes=e.lanes,n.child=e.child,n.memoizedProps=e.memoizedProps,n.memoizedState=e.memoizedState,n.updateQueue=e.updateQueue,t=e.dependencies,n.dependencies=t===null?null:{lanes:t.lanes,firstContext:t.firstContext},n.sibling=e.sibling,n.index=e.index,n.ref=e.ref,n}function om(e,t,n,r,i,o){var s=2;if(r=e,typeof e=="function")PC(e)&&(s=1);else if(typeof e=="string")s=5;else e:switch(e){case Tu:return al(n.children,i,o,t);case Hx:s=8,i|=8;break;case K_:return e=ui(12,n,t,i|2),e.elementType=K_,e.lanes=o,e;case Y_:return e=ui(13,n,t,i),e.elementType=Y_,e.lanes=o,e;case X_:return e=ui(19,n,t,i),e.elementType=X_,e.lanes=o,e;case w9:return L0(n,i,o,t);default:if(typeof e=="object"&&e!==null)switch(e.$$typeof){case S9:s=10;break e;case _9:s=9;break e;case qx:s=11;break e;case Wx:s=14;break e;case $s:s=16,r=null;break e}throw Error(te(130,e==null?e:typeof e,""))}return t=ui(s,n,t,i),t.elementType=e,t.type=r,t.lanes=o,t}function al(e,t,n,r){return e=ui(7,e,r,t),e.lanes=n,e}function L0(e,t,n,r){return e=ui(22,e,r,t),e.elementType=w9,e.lanes=n,e.stateNode={isHidden:!1},e}function vS(e,t,n){return e=ui(6,e,null,t),e.lanes=n,e}function bS(e,t,n){return t=ui(4,e.children!==null?e.children:[],e.key,t),t.lanes=n,t.stateNode={containerInfo:e.containerInfo,pendingChildren:null,implementation:e.implementation},t}function AU(e,t,n,r,i){this.tag=t,this.containerInfo=e,this.finishedWork=this.pingCache=this.current=this.pendingChildren=null,this.timeoutHandle=-1,this.callbackNode=this.pendingContext=this.context=null,this.callbackPriority=0,this.eventTimes=Jb(0),this.expirationTimes=Jb(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=Jb(0),this.identifierPrefix=r,this.onRecoverableError=i,this.mutableSourceEagerHydrationData=null}function kC(e,t,n,r,i,o,s,a,l){return e=new AU(e,t,n,a,l),t===1?(t=1,o===!0&&(t|=8)):t=0,o=ui(3,null,null,t),e.current=o,o.stateNode=e,o.memoizedState={element:r,isDehydrated:n,cache:null,transitions:null,pendingSuspenseBoundaries:null},dC(o),e}function OU(e,t,n){var r=3"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(yR)}catch(e){console.error(e)}}yR(),g9.exports=Wr;var li=g9.exports;const LTe=Rl(li);var DT=li;q_.createRoot=DT.createRoot,q_.hydrateRoot=DT.hydrateRoot;const DU="modulepreload",LU=function(e,t){return new URL(e,t).href},LT={},vR=function(t,n,r){if(!n||n.length===0)return t();const i=document.getElementsByTagName("link");return Promise.all(n.map(o=>{if(o=LU(o,r),o in LT)return;LT[o]=!0;const s=o.endsWith(".css"),a=s?'[rel="stylesheet"]':"";if(!!r)for(let c=i.length-1;c>=0;c--){const d=i[c];if(d.href===o&&(!s||d.rel==="stylesheet"))return}else if(document.querySelector(`link[href="${o}"]${a}`))return;const u=document.createElement("link");if(u.rel=s?"stylesheet":DU,s||(u.as="script",u.crossOrigin=""),u.href=o,document.head.appendChild(u),s)return new Promise((c,d)=>{u.addEventListener("load",c),u.addEventListener("error",()=>d(new Error(`Unable to preload CSS for ${o}`)))})})).then(()=>t()).catch(o=>{const s=new Event("vite:preloadError",{cancelable:!0});if(s.payload=o,window.dispatchEvent(s),!s.defaultPrevented)throw o})};var bR={exports:{}},SR={};/** + * @license React + * use-sync-external-store-shim.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */var bc=E;function $U(e,t){return e===t&&(e!==0||1/e===1/t)||e!==e&&t!==t}var FU=typeof Object.is=="function"?Object.is:$U,BU=bc.useState,jU=bc.useEffect,VU=bc.useLayoutEffect,zU=bc.useDebugValue;function UU(e,t){var n=t(),r=BU({inst:{value:n,getSnapshot:t}}),i=r[0].inst,o=r[1];return VU(function(){i.value=n,i.getSnapshot=t,SS(i)&&o({inst:i})},[e,n,t]),jU(function(){return SS(i)&&o({inst:i}),e(function(){SS(i)&&o({inst:i})})},[e]),zU(n),n}function SS(e){var t=e.getSnapshot;e=e.value;try{var n=t();return!FU(e,n)}catch{return!0}}function GU(e,t){return t()}var HU=typeof window>"u"||typeof window.document>"u"||typeof window.document.createElement>"u"?GU:UU;SR.useSyncExternalStore=bc.useSyncExternalStore!==void 0?bc.useSyncExternalStore:HU;bR.exports=SR;var qU=bR.exports,_R={exports:{}},wR={};/** + * @license React + * use-sync-external-store-shim/with-selector.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */var V0=E,WU=qU;function KU(e,t){return e===t&&(e!==0||1/e===1/t)||e!==e&&t!==t}var YU=typeof Object.is=="function"?Object.is:KU,XU=WU.useSyncExternalStore,QU=V0.useRef,ZU=V0.useEffect,JU=V0.useMemo,eG=V0.useDebugValue;wR.useSyncExternalStoreWithSelector=function(e,t,n,r,i){var o=QU(null);if(o.current===null){var s={hasValue:!1,value:null};o.current=s}else s=o.current;o=JU(function(){function l(h){if(!u){if(u=!0,c=h,h=r(h),i!==void 0&&s.hasValue){var p=s.value;if(i(p,h))return d=p}return d=h}if(p=d,YU(c,h))return p;var m=r(h);return i!==void 0&&i(p,m)?p:(c=h,d=m)}var u=!1,c,d,f=n===void 0?null:n;return[function(){return l(t())},f===null?void 0:function(){return l(f())}]},[t,n,r,i]);var a=XU(e,o[0],o[1]);return ZU(function(){s.hasValue=!0,s.value=a},[a]),eG(a),a};_R.exports=wR;var xR=_R.exports;const tG=Rl(xR);function nG(e){e()}let CR=nG;const rG=e=>CR=e,iG=()=>CR,$T=Symbol.for(`react-redux-context-${E.version}`),FT=globalThis;function oG(){let e=FT[$T];return e||(e=E.createContext(null),FT[$T]=e),e}const pa=new Proxy({},new Proxy({},{get(e,t){const n=oG();return(r,...i)=>Reflect[t](n,...i)}}));function IC(e=pa){return function(){return E.useContext(e)}}const TR=IC(),sG=()=>{throw new Error("uSES not initialized!")};let ER=sG;const aG=e=>{ER=e},lG=(e,t)=>e===t;function uG(e=pa){const t=e===pa?TR:IC(e);return function(r,i={}){const{equalityFn:o=lG,stabilityCheck:s=void 0,noopCheck:a=void 0}=typeof i=="function"?{equalityFn:i}:i,{store:l,subscription:u,getServerState:c,stabilityCheck:d,noopCheck:f}=t();E.useRef(!0);const h=E.useCallback({[r.name](m){return r(m)}}[r.name],[r,d,s]),p=ER(u.addNestedSub,l.getState,c||l.getState,h,o);return E.useDebugValue(p),p}}const PR=uG();function ay(){return ay=Object.assign?Object.assign.bind():function(e){for(var t=1;t{let r=t;for(;r;)r.callback(),r=r.next})},get(){let r=[],i=t;for(;i;)r.push(i),i=i.next;return r},subscribe(r){let i=!0,o=n={callback:r,next:null,prev:n};return o.prev?o.prev.next=o:t=o,function(){!i||t===null||(i=!1,o.next?o.next.prev=o.prev:n=o.prev,o.prev?o.prev.next=o.next:t=o.next)}}}}const BT={notify(){},get:()=>[]};function _G(e,t){let n,r=BT;function i(d){return l(),r.subscribe(d)}function o(){r.notify()}function s(){c.onStateChange&&c.onStateChange()}function a(){return!!n}function l(){n||(n=t?t.addNestedSub(s):e.subscribe(s),r=SG())}function u(){n&&(n(),n=void 0,r.clear(),r=BT)}const c={addNestedSub:i,notifyNestedSubs:o,handleChangeWrapper:s,isSubscribed:a,trySubscribe:l,tryUnsubscribe:u,getListeners:()=>r};return c}const wG=typeof window<"u"&&typeof window.document<"u"&&typeof window.document.createElement<"u",xG=wG?E.useLayoutEffect:E.useEffect;function jT(e,t){return e===t?e!==0||t!==0||1/e===1/t:e!==e&&t!==t}function ly(e,t){if(jT(e,t))return!0;if(typeof e!="object"||e===null||typeof t!="object"||t===null)return!1;const n=Object.keys(e),r=Object.keys(t);if(n.length!==r.length)return!1;for(let i=0;i{const u=_G(e);return{store:e,subscription:u,getServerState:r?()=>r:void 0,stabilityCheck:i,noopCheck:o}},[e,r,i,o]),a=E.useMemo(()=>e.getState(),[e]);xG(()=>{const{subscription:u}=s;return u.onStateChange=u.notifyNestedSubs,u.trySubscribe(),a!==e.getState()&&u.notifyNestedSubs(),()=>{u.tryUnsubscribe(),u.onStateChange=void 0}},[s,a]);const l=t||pa;return Ve.createElement(l.Provider,{value:s},n)}function MR(e=pa){const t=e===pa?TR:IC(e);return function(){const{store:r}=t();return r}}const NR=MR();function TG(e=pa){const t=e===pa?NR:MR(e);return function(){return t().dispatch}}const DR=TG();aG(xR.useSyncExternalStoreWithSelector);rG(li.unstable_batchedUpdates);function Tn(e){for(var t=arguments.length,n=Array(t>1?t-1:0),r=1;r3?t.i-4:t.i:Array.isArray(e)?1:lv(e)?2:uv(e)?3:0}function oa(e,t){return ga(e)===2?e.has(t):Object.prototype.hasOwnProperty.call(e,t)}function sm(e,t){return ga(e)===2?e.get(t):e[t]}function LR(e,t,n){var r=ga(e);r===2?e.set(t,n):r===3?e.add(n):e[t]=n}function $R(e,t){return e===t?e!==0||1/e==1/t:e!=e&&t!=t}function lv(e){return RG&&e instanceof Map}function uv(e){return IG&&e instanceof Set}function Sn(e){return e.o||e.t}function BC(e){if(Array.isArray(e))return Array.prototype.slice.call(e);var t=BR(e);delete t[Pe];for(var n=Yu(t),r=0;r1&&(e.set=e.add=e.clear=e.delete=EG),Object.freeze(e),t&&fs(e,function(n,r){return Yh(r,!0)},!0)),e}function EG(){Tn(2)}function jC(e){return e==null||typeof e!="object"||Object.isFrozen(e)}function mo(e){var t=j2[e];return t||Tn(18,e),t}function VC(e,t){j2[e]||(j2[e]=t)}function Bf(){return Vf}function _S(e,t){t&&(mo("Patches"),e.u=[],e.s=[],e.v=t)}function uy(e){B2(e),e.p.forEach(PG),e.p=null}function B2(e){e===Vf&&(Vf=e.l)}function VT(e){return Vf={p:[],l:Vf,h:e,m:!0,_:0}}function PG(e){var t=e[Pe];t.i===0||t.i===1?t.j():t.g=!0}function wS(e,t){t._=t.p.length;var n=t.p[0],r=e!==void 0&&e!==n;return t.h.O||mo("ES5").S(t,e,r),r?(n[Pe].P&&(uy(t),Tn(4)),Or(e)&&(e=cy(t,e),t.l||dy(t,e)),t.u&&mo("Patches").M(n[Pe].t,e,t.u,t.s)):e=cy(t,n,[]),uy(t),t.u&&t.v(t.u,t.s),e!==dv?e:void 0}function cy(e,t,n){if(jC(t))return t;var r=t[Pe];if(!r)return fs(t,function(a,l){return zT(e,r,t,a,l,n)},!0),t;if(r.A!==e)return t;if(!r.P)return dy(e,r.t,!0),r.t;if(!r.I){r.I=!0,r.A._--;var i=r.i===4||r.i===5?r.o=BC(r.k):r.o,o=i,s=!1;r.i===3&&(o=new Set(i),i.clear(),s=!0),fs(o,function(a,l){return zT(e,r,i,a,l,n,s)}),dy(e,i,!1),n&&e.u&&mo("Patches").N(r,n,e.u,e.s)}return r.o}function zT(e,t,n,r,i,o,s){if(dr(i)){var a=cy(e,i,o&&t&&t.i!==3&&!oa(t.R,r)?o.concat(r):void 0);if(LR(n,r,a),!dr(a))return;e.m=!1}else s&&n.add(i);if(Or(i)&&!jC(i)){if(!e.h.D&&e._<1)return;cy(e,i),t&&t.A.l||dy(e,i)}}function dy(e,t,n){n===void 0&&(n=!1),!e.l&&e.h.D&&e.m&&Yh(t,n)}function xS(e,t){var n=e[Pe];return(n?Sn(n):e)[t]}function UT(e,t){if(t in e)for(var n=Object.getPrototypeOf(e);n;){var r=Object.getOwnPropertyDescriptor(n,t);if(r)return r;n=Object.getPrototypeOf(n)}}function _r(e){e.P||(e.P=!0,e.l&&_r(e.l))}function CS(e){e.o||(e.o=BC(e.t))}function jf(e,t,n){var r=lv(t)?mo("MapSet").F(t,n):uv(t)?mo("MapSet").T(t,n):e.O?function(i,o){var s=Array.isArray(i),a={i:s?1:0,A:o?o.A:Bf(),P:!1,I:!1,R:{},l:o,t:i,k:null,o:null,j:null,C:!1},l=a,u=zf;s&&(l=[a],u=Hd);var c=Proxy.revocable(l,u),d=c.revoke,f=c.proxy;return a.k=f,a.j=d,f}(t,n):mo("ES5").J(t,n);return(n?n.A:Bf()).p.push(r),r}function cv(e){return dr(e)||Tn(22,e),function t(n){if(!Or(n))return n;var r,i=n[Pe],o=ga(n);if(i){if(!i.P&&(i.i<4||!mo("ES5").K(i)))return i.t;i.I=!0,r=GT(n,o),i.I=!1}else r=GT(n,o);return fs(r,function(s,a){i&&sm(i.t,s)===a||LR(r,s,t(a))}),o===3?new Set(r):r}(e)}function GT(e,t){switch(t){case 2:return new Map(e);case 3:return Array.from(e)}return BC(e)}function zC(){function e(o,s){var a=i[o];return a?a.enumerable=s:i[o]=a={configurable:!0,enumerable:s,get:function(){var l=this[Pe];return zf.get(l,o)},set:function(l){var u=this[Pe];zf.set(u,o,l)}},a}function t(o){for(var s=o.length-1;s>=0;s--){var a=o[s][Pe];if(!a.P)switch(a.i){case 5:r(a)&&_r(a);break;case 4:n(a)&&_r(a)}}}function n(o){for(var s=o.t,a=o.k,l=Yu(a),u=l.length-1;u>=0;u--){var c=l[u];if(c!==Pe){var d=s[c];if(d===void 0&&!oa(s,c))return!0;var f=a[c],h=f&&f[Pe];if(h?h.t!==d:!$R(f,d))return!0}}var p=!!s[Pe];return l.length!==Yu(s).length+(p?0:1)}function r(o){var s=o.k;if(s.length!==o.t.length)return!0;var a=Object.getOwnPropertyDescriptor(s,s.length-1);if(a&&!a.get)return!0;for(var l=0;l1?v-1:0),g=1;g1?c-1:0),f=1;f=0;i--){var o=r[i];if(o.path.length===0&&o.op==="replace"){n=o.value;break}}i>-1&&(r=r.slice(i+1));var s=mo("Patches").$;return dr(n)?s(n,r):this.produce(n,function(a){return s(a,r)})},e}(),Ur=new jR,VR=Ur.produce,HC=Ur.produceWithPatches.bind(Ur),NG=Ur.setAutoFreeze.bind(Ur),DG=Ur.setUseProxies.bind(Ur),V2=Ur.applyPatches.bind(Ur),LG=Ur.createDraft.bind(Ur),$G=Ur.finishDraft.bind(Ur);const Pa=VR,$Te=Object.freeze(Object.defineProperty({__proto__:null,Immer:jR,applyPatches:V2,castDraft:AG,castImmutable:OG,createDraft:LG,current:cv,default:Pa,enableAllPlugins:kG,enableES5:zC,enableMapSet:FR,enablePatches:UC,finishDraft:$G,freeze:Yh,immerable:Ku,isDraft:dr,isDraftable:Or,nothing:dv,original:FC,produce:VR,produceWithPatches:HC,setAutoFreeze:NG,setUseProxies:DG},Symbol.toStringTag,{value:"Module"}));function Uf(e){"@babel/helpers - typeof";return Uf=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(t){return typeof t}:function(t){return t&&typeof Symbol=="function"&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},Uf(e)}function FG(e,t){if(Uf(e)!=="object"||e===null)return e;var n=e[Symbol.toPrimitive];if(n!==void 0){var r=n.call(e,t||"default");if(Uf(r)!=="object")return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return(t==="string"?String:Number)(e)}function BG(e){var t=FG(e,"string");return Uf(t)==="symbol"?t:String(t)}function jG(e,t,n){return t=BG(t),t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function WT(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(i){return Object.getOwnPropertyDescriptor(e,i).enumerable})),n.push.apply(n,r)}return n}function KT(e){for(var t=1;t"u"&&(n=t,t=void 0),typeof n<"u"){if(typeof n!="function")throw new Error(Dn(1));return n(Xh)(e,t)}if(typeof e!="function")throw new Error(Dn(2));var i=e,o=t,s=[],a=s,l=!1;function u(){a===s&&(a=s.slice())}function c(){if(l)throw new Error(Dn(3));return o}function d(m){if(typeof m!="function")throw new Error(Dn(4));if(l)throw new Error(Dn(5));var S=!0;return u(),a.push(m),function(){if(S){if(l)throw new Error(Dn(6));S=!1,u();var y=a.indexOf(m);a.splice(y,1),s=null}}}function f(m){if(!VG(m))throw new Error(Dn(7));if(typeof m.type>"u")throw new Error(Dn(8));if(l)throw new Error(Dn(9));try{l=!0,o=i(o,m)}finally{l=!1}for(var S=s=a,v=0;v"u")throw new Error(Dn(12));if(typeof n(void 0,{type:Sc.PROBE_UNKNOWN_ACTION()})>"u")throw new Error(Dn(13))})}function qc(e){for(var t=Object.keys(e),n={},r=0;r"u")throw u&&u.type,new Error(Dn(14));d[h]=S,c=c||S!==m}return c=c||o.length!==Object.keys(l).length,c?d:l}}function XT(e,t){return function(){return t(e.apply(this,arguments))}}function UR(e,t){if(typeof e=="function")return XT(e,t);if(typeof e!="object"||e===null)throw new Error(Dn(16));var n={};for(var r in e){var i=e[r];typeof i=="function"&&(n[r]=XT(i,t))}return n}function _c(){for(var e=arguments.length,t=new Array(e),n=0;n-1){var u=n[l];return l>0&&(n.splice(l,1),n.unshift(u)),u.value}return fy}function i(a,l){r(a)===fy&&(n.unshift({key:a,value:l}),n.length>e&&n.pop())}function o(){return n}function s(){n=[]}return{get:r,put:i,getEntries:o,clear:s}}var GR=function(t,n){return t===n};function qG(e){return function(n,r){if(n===null||r===null||n.length!==r.length)return!1;for(var i=n.length,o=0;o1?t-1:0),r=1;r0&&o[o.length-1])&&(u[0]===6||u[0]===2)){n=0;continue}if(u[0]===3&&(!o||u[1]>o[0]&&u[1]",value:e};if(typeof e!="object"||e===null||o!=null&&o.has(e))return!1;for(var a=r!=null?r(e):Object.entries(e),l=i.length>0,u=function(S,v){var y=t?t+"."+S:S;if(l){var g=i.some(function(b){return b instanceof RegExp?b.test(y):y===b});if(g)return"continue"}if(!n(v))return{value:{keyPath:y,value:v}};if(typeof v=="object"&&(s=ZR(v,y,n,r,i,o),s))return{value:s}},c=0,d=a;c-1}function lH(e){return""+e}function rI(e){var t={},n=[],r,i={addCase:function(o,s){var a=typeof o=="string"?o:o.type;if(a in t)throw new Error("addCase cannot be called with two reducers for the same action type");return t[a]=s,i},addMatcher:function(o,s){return n.push({matcher:o,reducer:s}),i},addDefaultCase:function(o){return r=o,i}};return e(i),[t,n,r]}function uH(e){return typeof e=="function"}function iI(e,t,n,r){n===void 0&&(n=[]);var i=typeof t=="function"?rI(t):[t,n,r],o=i[0],s=i[1],a=i[2],l;if(uH(e))l=function(){return z2(e())};else{var u=z2(e);l=function(){return u}}function c(d,f){d===void 0&&(d=l());var h=ma([o[f.type]],s.filter(function(p){var m=p.matcher;return m(f)}).map(function(p){var m=p.reducer;return m}));return h.filter(function(p){return!!p}).length===0&&(h=[a]),h.reduce(function(p,m){if(m)if(dr(p)){var S=p,v=m(S,f);return v===void 0?p:v}else{if(Or(p))return Pa(p,function(y){return m(y,f)});var v=m(p,f);if(v===void 0){if(p===null)return p;throw Error("A case reducer on a non-draftable value must not return undefined")}return v}return p},d)}return c.getInitialState=l,c}function cH(e,t){return e+"/"+t}function Vt(e){var t=e.name;if(!t)throw new Error("`name` is a required option for createSlice");typeof process<"u";var n=typeof e.initialState=="function"?e.initialState:z2(e.initialState),r=e.reducers||{},i=Object.keys(r),o={},s={},a={};i.forEach(function(c){var d=r[c],f=cH(t,c),h,p;"reducer"in d?(h=d.reducer,p=d.prepare):h=d,o[c]=h,s[f]=h,a[c]=p?ge(f,p):ge(f)});function l(){var c=typeof e.extraReducers=="function"?rI(e.extraReducers):[e.extraReducers],d=c[0],f=d===void 0?{}:d,h=c[1],p=h===void 0?[]:h,m=c[2],S=m===void 0?void 0:m,v=xr(xr({},f),s);return iI(n,function(y){for(var g in v)y.addCase(g,v[g]);for(var b=0,_=p;b<_.length;b++){var w=_[b];y.addMatcher(w.matcher,w.reducer)}S&&y.addDefaultCase(S)})}var u;return{name:t,reducer:function(c,d){return u||(u=l()),u(c,d)},actions:a,caseReducers:o,getInitialState:function(){return u||(u=l()),u.getInitialState()}}}function dH(){return{ids:[],entities:{}}}function fH(){function e(t){return t===void 0&&(t={}),Object.assign(dH(),t)}return{getInitialState:e}}function hH(){function e(t){var n=function(u){return u.ids},r=function(u){return u.entities},i=Go(n,r,function(u,c){return u.map(function(d){return c[d]})}),o=function(u,c){return c},s=function(u,c){return u[c]},a=Go(n,function(u){return u.length});if(!t)return{selectIds:n,selectEntities:r,selectAll:i,selectTotal:a,selectById:Go(r,o,s)};var l=Go(t,r);return{selectIds:Go(t,n),selectEntities:l,selectAll:Go(t,i),selectTotal:Go(t,a),selectById:Go(l,o,s)}}return{getSelectors:e}}function pH(e){var t=Ut(function(n,r){return e(r)});return function(r){return t(r,void 0)}}function Ut(e){return function(n,r){function i(s){return nI(s)}var o=function(s){i(r)?e(r.payload,s):e(r,s)};return dr(n)?(o(n),n):Pa(n,o)}}function uf(e,t){var n=t(e);return n}function ll(e){return Array.isArray(e)||(e=Object.values(e)),e}function oI(e,t,n){e=ll(e);for(var r=[],i=[],o=0,s=e;o0;if(y){var g=p.filter(function(b){return u(S,b,m)}).length>0;g&&(m.ids=Object.keys(m.entities))}}function f(p,m){return h([p],m)}function h(p,m){var S=oI(p,e,m),v=S[0],y=S[1];d(y,m),n(v,m)}return{removeAll:pH(l),addOne:Ut(t),addMany:Ut(n),setOne:Ut(r),setMany:Ut(i),setAll:Ut(o),updateOne:Ut(c),updateMany:Ut(d),upsertOne:Ut(f),upsertMany:Ut(h),removeOne:Ut(s),removeMany:Ut(a)}}function gH(e,t){var n=sI(e),r=n.removeOne,i=n.removeMany,o=n.removeAll;function s(y,g){return a([y],g)}function a(y,g){y=ll(y);var b=y.filter(function(_){return!(uf(_,e)in g.entities)});b.length!==0&&S(b,g)}function l(y,g){return u([y],g)}function u(y,g){y=ll(y),y.length!==0&&S(y,g)}function c(y,g){y=ll(y),g.entities={},g.ids=[],a(y,g)}function d(y,g){return f([y],g)}function f(y,g){for(var b=!1,_=0,w=y;_-1;return n&&r}function Jh(e){return typeof e[0]=="function"&&"pending"in e[0]&&"fulfilled"in e[0]&&"rejected"in e[0]}function pv(){for(var e=[],t=0;t0)for(var g=h.getState(),b=Array.from(n.values()),_=0,w=b;_=e.length?{done:!0}:{done:!1,value:e[r++]}},e:function(u){throw u},f:i}}throw new TypeError(`Invalid attempt to iterate non-iterable instance. +In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}var o=!0,s=!1,a;return{s:function(){n=n.call(e)},n:function(){var u=n.next();return o=u.done,u},e:function(u){s=!0,a=u},f:function(){try{!o&&n.return!=null&&n.return()}finally{if(s)throw a}}}}function EI(e,t){if(e){if(typeof e=="string")return oE(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);if(n==="Object"&&e.constructor&&(n=e.constructor.name),n==="Map"||n==="Set")return Array.from(e);if(n==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return oE(e,t)}}function oE(e,t){(t==null||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n0&&arguments[0]!==void 0?arguments[0]:{},n=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},r=arguments.length>2?arguments[2]:void 0,i=r.prefix,o=r.driver,s=r.persistWholeStore,a=r.serialize;try{var l=s?YH:XH;yield l(t,n,{prefix:i,driver:o,serialize:a})}catch(u){console.warn("redux-remember: persist error",u)}});return function(){return e.apply(this,arguments)}}();function uE(e,t,n,r,i,o,s){try{var a=e[o](s),l=a.value}catch(u){n(u);return}a.done?t(l):Promise.resolve(l).then(r,i)}function cE(e){return function(){var t=this,n=arguments;return new Promise(function(r,i){var o=e.apply(t,n);function s(l){uE(o,r,i,s,a,"next",l)}function a(l){uE(o,r,i,s,a,"throw",l)}s(void 0)})}}var ZH=function(){var e=cE(function*(t,n,r){var i=r.prefix,o=r.driver,s=r.serialize,a=r.unserialize,l=r.persistThrottle,u=r.persistDebounce,c=r.persistWholeStore;yield GH(t,n,{prefix:i,driver:o,unserialize:a,persistWholeStore:c});var d={},f=function(){var h=cE(function*(){var p=TI(t.getState(),n);yield QH(p,d,{prefix:i,driver:o,serialize:s,persistWholeStore:c}),QC(p,d)||t.dispatch({type:BH,payload:p}),d=p});return function(){return h.apply(this,arguments)}}();u&&u>0?t.subscribe(VH(f,u)):t.subscribe(jH(f,l))});return function(n,r,i){return e.apply(this,arguments)}}();const JH=ZH;function Hf(e){"@babel/helpers - typeof";return Hf=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(t){return typeof t}:function(t){return t&&typeof Symbol=="function"&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},Hf(e)}function dE(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(i){return Object.getOwnPropertyDescriptor(e,i).enumerable})),n.push.apply(n,r)}return n}function OS(e){for(var t=1;t0&&arguments[0]!==void 0?arguments[0]:n.state,i=arguments.length>1?arguments[1]:void 0;i.type&&(i.type==="@@INIT"||i.type.startsWith("@@redux/INIT"))&&(n.state=OS({},r));var o=typeof t=="function"?t:qc(t);switch(i.type){case q2:return n.state=o(OS(OS({},n.state),i.payload||{}),{type:q2}),n.state;default:return o(r,i)}}},iq=function(t,n){var r=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{},i=r.prefix,o=i===void 0?"@@remember-":i,s=r.serialize,a=s===void 0?function(S,v){return JSON.stringify(S)}:s,l=r.unserialize,u=l===void 0?function(S,v){return JSON.parse(S)}:l,c=r.persistThrottle,d=c===void 0?100:c,f=r.persistDebounce,h=r.persistWholeStore,p=h===void 0?!1:h;if(!t)throw Error("redux-remember error: driver required");if(!Array.isArray(n))throw Error("redux-remember error: rememberedKeys needs to be an array");var m=function(v){return function(y,g,b){var _=v(y,g,b);return JH(_,n,{driver:t,prefix:o,serialize:a,unserialize:u,persistThrottle:d,persistDebounce:f,persistWholeStore:p}),_}};return m};const qd=(e,t)=>Math.floor(e/t)*t,no=(e,t)=>Math.round(e/t)*t;var oq=typeof global=="object"&&global&&global.Object===Object&&global;const kI=oq;var sq=typeof self=="object"&&self&&self.Object===Object&&self,aq=kI||sq||Function("return this")();const Ao=aq;var lq=Ao.Symbol;const mi=lq;var AI=Object.prototype,uq=AI.hasOwnProperty,cq=AI.toString,_d=mi?mi.toStringTag:void 0;function dq(e){var t=uq.call(e,_d),n=e[_d];try{e[_d]=void 0;var r=!0}catch{}var i=cq.call(e);return r&&(t?e[_d]=n:delete e[_d]),i}var fq=Object.prototype,hq=fq.toString;function pq(e){return hq.call(e)}var gq="[object Null]",mq="[object Undefined]",fE=mi?mi.toStringTag:void 0;function Aa(e){return e==null?e===void 0?mq:gq:fE&&fE in Object(e)?dq(e):pq(e)}function ji(e){return e!=null&&typeof e=="object"}var yq="[object Symbol]";function mv(e){return typeof e=="symbol"||ji(e)&&Aa(e)==yq}function ZC(e,t){for(var n=-1,r=e==null?0:e.length,i=Array(r);++n0){if(++t>=Yq)return arguments[0]}else t=0;return e.apply(void 0,arguments)}}function Jq(e){return function(){return e}}var eW=function(){try{var e=Ll(Object,"defineProperty");return e({},"",{}),e}catch{}}();const yy=eW;var tW=yy?function(e,t){return yy(e,"toString",{configurable:!0,enumerable:!1,value:Jq(t),writable:!0})}:yv;const nW=tW;var rW=Zq(nW);const MI=rW;function NI(e,t){for(var n=-1,r=e==null?0:e.length;++n-1}var uW=9007199254740991,cW=/^(?:0|[1-9]\d*)$/;function vv(e,t){var n=typeof e;return t=t??uW,!!t&&(n=="number"||n!="symbol"&&cW.test(e))&&e>-1&&e%1==0&&e-1&&e%1==0&&e<=hW}function Kc(e){return e!=null&&t5(e.length)&&!JC(e)}function $I(e,t,n){if(!Pn(n))return!1;var r=typeof t;return(r=="number"?Kc(n)&&vv(t,n.length):r=="string"&&t in n)?rp(n[t],e):!1}function FI(e){return LI(function(t,n){var r=-1,i=n.length,o=i>1?n[i-1]:void 0,s=i>2?n[2]:void 0;for(o=e.length>3&&typeof o=="function"?(i--,o):void 0,s&&$I(n[0],n[1],s)&&(o=i<3?void 0:o,i=1),t=Object(t);++r-1}function kK(e,t){var n=this.__data__,r=Sv(n,e);return r<0?(++this.size,n.push([e,t])):n[r][1]=t,this}function bs(e){var t=-1,n=e==null?0:e.length;for(this.clear();++t0&&n(a)?t>1?HI(a,t-1,n,r,i):a5(i,a):r||(i[i.length]=a)}return i}function qK(e){var t=e==null?0:e.length;return t?HI(e,1):[]}function WK(e){return MI(DI(e,void 0,qK),e+"")}var KK=UI(Object.getPrototypeOf,Object);const l5=KK;var YK="[object Object]",XK=Function.prototype,QK=Object.prototype,qI=XK.toString,ZK=QK.hasOwnProperty,JK=qI.call(Object);function WI(e){if(!ji(e)||Aa(e)!=YK)return!1;var t=l5(e);if(t===null)return!0;var n=ZK.call(t,"constructor")&&t.constructor;return typeof n=="function"&&n instanceof n&&qI.call(n)==JK}function eY(e,t,n){var r=-1,i=e.length;t<0&&(t=-t>i?0:i+t),n=n>i?i:n,n<0&&(n+=i),i=t>n?0:n-t>>>0,t>>>=0;for(var o=Array(i);++r=t?e:t)),e}function Jo(e,t,n){return n===void 0&&(n=t,t=void 0),n!==void 0&&(n=RS(n),n=n===n?n:0),t!==void 0&&(t=RS(t),t=t===t?t:0),dY(RS(e),t,n)}function fY(){this.__data__=new bs,this.size=0}function hY(e){var t=this.__data__,n=t.delete(e);return this.size=t.size,n}function pY(e){return this.__data__.get(e)}function gY(e){return this.__data__.has(e)}var mY=200;function yY(e,t){var n=this.__data__;if(n instanceof bs){var r=n.__data__;if(!Yf||r.lengtha))return!1;var u=o.get(e),c=o.get(t);if(u&&c)return u==t&&c==e;var d=-1,f=!0,h=n&QX?new Xf:void 0;for(o.set(e,t),o.set(t,e);++d1),o}),Wc(e,c5(e),n),r&&(n=df(n,oZ|sZ|aZ,iZ));for(var i=t.length;i--;)p7(n,t[i]);return n});const h5=lZ;function uZ(e,t,n,r){if(!Pn(e))return e;t=Yc(t,e);for(var i=-1,o=t.length,s=o-1,a=e;a!=null&&++i=NZ){var u=t?null:MZ(e);if(u)return f5(u);s=!1,i=s7,l=new Xf}else l=t?[]:a;e:for(;++r{rZ(e,t.payload)}}}),{configChanged:BZ}=C7.actions,jZ=C7.reducer,Zc=()=>DR(),Qf=PR;function VZ(e){if(e.sheet)return e.sheet;for(var t=0;t0?$n(Jc,--Rr):0,Tc--,nn===10&&(Tc=1,Pv--),nn}function Vr(){return nn=Rr2||Jf(nn)>3?"":" "}function eJ(e,t){for(;--t&&Vr()&&!(nn<48||nn>102||nn>57&&nn<65||nn>70&&nn<97););return lp(e,lm()+(t<6&&yo()==32&&Vr()==32))}function iw(e){for(;Vr();)switch(nn){case e:return Rr;case 34:case 39:e!==34&&e!==39&&iw(nn);break;case 40:e===41&&iw(e);break;case 92:Vr();break}return Rr}function tJ(e,t){for(;Vr()&&e+nn!==47+10;)if(e+nn===42+42&&yo()===47)break;return"/*"+lp(t,Rr-1)+"*"+Ev(e===47?e:Vr())}function nJ(e){for(;!Jf(yo());)Vr();return lp(e,Rr)}function rJ(e){return O7(cm("",null,null,null,[""],e=A7(e),0,[0],e))}function cm(e,t,n,r,i,o,s,a,l){for(var u=0,c=0,d=s,f=0,h=0,p=0,m=1,S=1,v=1,y=0,g="",b=i,_=o,w=r,x=g;S;)switch(p=y,y=Vr()){case 40:if(p!=108&&$n(x,d-1)==58){rw(x+=tt(um(y),"&","&\f"),"&\f")!=-1&&(v=-1);break}case 34:case 39:case 91:x+=um(y);break;case 9:case 10:case 13:case 32:x+=JZ(p);break;case 92:x+=eJ(lm()-1,7);continue;case 47:switch(yo()){case 42:case 47:dg(iJ(tJ(Vr(),lm()),t,n),l);break;default:x+="/"}break;case 123*m:a[u++]=Zi(x)*v;case 125*m:case 59:case 0:switch(y){case 0:case 125:S=0;case 59+c:v==-1&&(x=tt(x,/\f/g,"")),h>0&&Zi(x)-d&&dg(h>32?UE(x+";",r,n,d-1):UE(tt(x," ","")+";",r,n,d-2),l);break;case 59:x+=";";default:if(dg(w=zE(x,t,n,u,c,i,a,g,b=[],_=[],d),o),y===123)if(c===0)cm(x,t,w,w,b,o,d,a,_);else switch(f===99&&$n(x,3)===110?100:f){case 100:case 108:case 109:case 115:cm(e,w,w,r&&dg(zE(e,w,w,0,0,i,a,g,i,b=[],d),_),i,_,d,a,r?b:_);break;default:cm(x,w,w,w,[""],_,0,a,_)}}u=c=h=0,m=v=1,g=x="",d=s;break;case 58:d=1+Zi(x),h=p;default:if(m<1){if(y==123)--m;else if(y==125&&m++==0&&ZZ()==125)continue}switch(x+=Ev(y),y*m){case 38:v=c>0?1:(x+="\f",-1);break;case 44:a[u++]=(Zi(x)-1)*v,v=1;break;case 64:yo()===45&&(x+=um(Vr())),f=yo(),c=d=Zi(g=x+=nJ(lm())),y++;break;case 45:p===45&&Zi(x)==2&&(m=0)}}return o}function zE(e,t,n,r,i,o,s,a,l,u,c){for(var d=i-1,f=i===0?o:[""],h=y5(f),p=0,m=0,S=0;p0?f[v]+" "+y:tt(y,/&\f/g,f[v])))&&(l[S++]=g);return kv(e,t,n,i===0?g5:a,l,u,c)}function iJ(e,t,n){return kv(e,t,n,T7,Ev(QZ()),Zf(e,2,-2),0)}function UE(e,t,n,r){return kv(e,t,n,m5,Zf(e,0,r),Zf(e,r+1,-1),r)}function ec(e,t){for(var n="",r=y5(e),i=0;i6)switch($n(e,t+1)){case 109:if($n(e,t+4)!==45)break;case 102:return tt(e,/(.+:)(.+)-([^]+)/,"$1"+et+"$2-$3$1"+by+($n(e,t+3)==108?"$3":"$2-$3"))+e;case 115:return~rw(e,"stretch")?I7(tt(e,"stretch","fill-available"),t)+e:e}break;case 4949:if($n(e,t+1)!==115)break;case 6444:switch($n(e,Zi(e)-3-(~rw(e,"!important")&&10))){case 107:return tt(e,":",":"+et)+e;case 101:return tt(e,/(.+:)([^;!]+)(;|!.+)?/,"$1"+et+($n(e,14)===45?"inline-":"")+"box$3$1"+et+"$2$3$1"+Kn+"$2box$3")+e}break;case 5936:switch($n(e,t+11)){case 114:return et+e+Kn+tt(e,/[svh]\w+-[tblr]{2}/,"tb")+e;case 108:return et+e+Kn+tt(e,/[svh]\w+-[tblr]{2}/,"tb-rl")+e;case 45:return et+e+Kn+tt(e,/[svh]\w+-[tblr]{2}/,"lr")+e}return et+e+Kn+e+e}return e}var hJ=function(t,n,r,i){if(t.length>-1&&!t.return)switch(t.type){case m5:t.return=I7(t.value,t.length);break;case E7:return ec([wd(t,{value:tt(t.value,"@","@"+et)})],i);case g5:if(t.length)return XZ(t.props,function(o){switch(YZ(o,/(::plac\w+|:read-\w+)/)){case":read-only":case":read-write":return ec([wd(t,{props:[tt(o,/:(read-\w+)/,":"+by+"$1")]})],i);case"::placeholder":return ec([wd(t,{props:[tt(o,/:(plac\w+)/,":"+et+"input-$1")]}),wd(t,{props:[tt(o,/:(plac\w+)/,":"+by+"$1")]}),wd(t,{props:[tt(o,/:(plac\w+)/,Kn+"input-$1")]})],i)}return""})}},pJ=[hJ],gJ=function(t){var n=t.key;if(n==="css"){var r=document.querySelectorAll("style[data-emotion]:not([data-s])");Array.prototype.forEach.call(r,function(m){var S=m.getAttribute("data-emotion");S.indexOf(" ")!==-1&&(document.head.appendChild(m),m.setAttribute("data-s",""))})}var i=t.stylisPlugins||pJ,o={},s,a=[];s=t.container||document.head,Array.prototype.forEach.call(document.querySelectorAll('style[data-emotion^="'+n+' "]'),function(m){for(var S=m.getAttribute("data-emotion").split(" "),v=1;v=4;++r,i-=4)n=e.charCodeAt(r)&255|(e.charCodeAt(++r)&255)<<8|(e.charCodeAt(++r)&255)<<16|(e.charCodeAt(++r)&255)<<24,n=(n&65535)*1540483477+((n>>>16)*59797<<16),n^=n>>>24,t=(n&65535)*1540483477+((n>>>16)*59797<<16)^(t&65535)*1540483477+((t>>>16)*59797<<16);switch(i){case 3:t^=(e.charCodeAt(r+2)&255)<<16;case 2:t^=(e.charCodeAt(r+1)&255)<<8;case 1:t^=e.charCodeAt(r)&255,t=(t&65535)*1540483477+((t>>>16)*59797<<16)}return t^=t>>>13,t=(t&65535)*1540483477+((t>>>16)*59797<<16),((t^t>>>15)>>>0).toString(36)}var bJ={animationIterationCount:1,aspectRatio:1,borderImageOutset:1,borderImageSlice:1,borderImageWidth:1,boxFlex:1,boxFlexGroup:1,boxOrdinalGroup:1,columnCount:1,columns:1,flex:1,flexGrow:1,flexPositive:1,flexShrink:1,flexNegative:1,flexOrder:1,gridRow:1,gridRowEnd:1,gridRowSpan:1,gridRowStart:1,gridColumn:1,gridColumnEnd:1,gridColumnSpan:1,gridColumnStart:1,msGridRow:1,msGridRowSpan:1,msGridColumn:1,msGridColumnSpan:1,fontWeight:1,lineHeight:1,opacity:1,order:1,orphans:1,tabSize:1,widows:1,zIndex:1,zoom:1,WebkitLineClamp:1,fillOpacity:1,floodOpacity:1,stopOpacity:1,strokeDasharray:1,strokeDashoffset:1,strokeMiterlimit:1,strokeOpacity:1,strokeWidth:1},SJ=/[A-Z]|^ms/g,_J=/_EMO_([^_]+?)_([^]*?)_EMO_/g,D7=function(t){return t.charCodeAt(1)===45},qE=function(t){return t!=null&&typeof t!="boolean"},LS=R7(function(e){return D7(e)?e:e.replace(SJ,"-$&").toLowerCase()}),WE=function(t,n){switch(t){case"animation":case"animationName":if(typeof n=="string")return n.replace(_J,function(r,i,o){return Ji={name:i,styles:o,next:Ji},i})}return bJ[t]!==1&&!D7(t)&&typeof n=="number"&&n!==0?n+"px":n};function eh(e,t,n){if(n==null)return"";if(n.__emotion_styles!==void 0)return n;switch(typeof n){case"boolean":return"";case"object":{if(n.anim===1)return Ji={name:n.name,styles:n.styles,next:Ji},n.name;if(n.styles!==void 0){var r=n.next;if(r!==void 0)for(;r!==void 0;)Ji={name:r.name,styles:r.styles,next:Ji},r=r.next;var i=n.styles+";";return i}return wJ(e,t,n)}case"function":{if(e!==void 0){var o=Ji,s=n(e);return Ji=o,eh(e,t,s)}break}}if(t==null)return n;var a=t[n];return a!==void 0?a:n}function wJ(e,t,n){var r="";if(Array.isArray(n))for(var i=0;ij.jsx("div",{className:"chakra-portal-zIndex",style:{position:"absolute",zIndex:e.zIndex,top:0,left:0,right:0},children:e.children}),LJ=e=>{const{appendToParentPortal:t,children:n}=e,[r,i]=E.useState(null),o=E.useRef(null),[,s]=E.useState({});E.useEffect(()=>s({}),[]);const a=MJ(),l=RJ();nh(()=>{if(!r)return;const c=r.ownerDocument,d=t?a??c.body:c.body;if(!d)return;o.current=c.createElement("div"),o.current.className=b5,d.appendChild(o.current),s({});const f=o.current;return()=>{d.contains(f)&&d.removeChild(f)}},[r]);const u=l!=null&&l.zIndex?j.jsx(DJ,{zIndex:l==null?void 0:l.zIndex,children:n}):n;return o.current?li.createPortal(j.jsx(B7,{value:o.current,children:u}),o.current):j.jsx("span",{ref:c=>{c&&i(c)}})},$J=e=>{const{children:t,containerRef:n,appendToParentPortal:r}=e,i=n.current,o=i??(typeof window<"u"?document.body:void 0),s=E.useMemo(()=>{const l=i==null?void 0:i.ownerDocument.createElement("div");return l&&(l.className=b5),l},[i]),[,a]=E.useState({});return nh(()=>a({}),[]),nh(()=>{if(!(!s||!o))return o.appendChild(s),()=>{o.removeChild(s)}},[s,o]),o&&s?li.createPortal(j.jsx(B7,{value:r?s:null,children:t}),s):null};function up(e){const t={appendToParentPortal:!0,...e},{containerRef:n,...r}=t;return n?j.jsx($J,{containerRef:n,...r}):j.jsx(LJ,{...r})}up.className=b5;up.selector=NJ;up.displayName="Portal";function Av(){const e=E.useContext(th);if(!e)throw Error("useTheme: `theme` is undefined. Seems you forgot to wrap your app in `` or ``");return e}var j7=E.createContext({});j7.displayName="ColorModeContext";function S5(){const e=E.useContext(j7);if(e===void 0)throw new Error("useColorMode must be used within a ColorModeProvider");return e}function qTe(e,t){const{colorMode:n}=S5();return n==="dark"?t:e}function V7(){const e=S5(),t=Av();return{...e,theme:t}}function FJ(e,t,n){var r,i;if(t==null)return t;const o=s=>{var a,l;return(l=(a=e.__breakpoints)==null?void 0:a.asArray)==null?void 0:l[s]};return(i=(r=o(t))!=null?r:o(n))!=null?i:n}function BJ(e,t,n){var r,i;if(t==null)return t;const o=s=>{var a,l;return(l=(a=e.__cssMap)==null?void 0:a[s])==null?void 0:l.value};return(i=(r=o(t))!=null?r:o(n))!=null?i:n}function WTe(e,t,n){const r=Av();return jJ(e,t,n)(r)}function jJ(e,t,n){const r=Array.isArray(t)?t:[t],i=Array.isArray(n)?n:[n];return o=>{const s=i.filter(Boolean),a=r.map((l,u)=>{var c,d;if(e==="breakpoints")return FJ(o,l,(c=s[u])!=null?c:l);const f=`${e}.${l}`;return BJ(o,f,(d=s[u])!=null?d:l)});return Array.isArray(t)?a:a[0]}}var Gn=(...e)=>e.filter(Boolean).join(" ");function VJ(){return!1}function vo(e){const t=typeof e;return e!=null&&(t==="object"||t==="function")&&!Array.isArray(e)}var KTe=e=>{const{condition:t,message:n}=e;t&&VJ()&&console.warn(n)};function lo(e,...t){return zJ(e)?e(...t):e}var zJ=e=>typeof e=="function",Lu=e=>e?"":void 0,tc=e=>e?!0:void 0;function Ln(...e){return function(n){e.some(r=>(r==null||r(n),n==null?void 0:n.defaultPrevented))}}function YTe(...e){return function(n){e.forEach(r=>{r==null||r(n)})}}var Sy={exports:{}};Sy.exports;(function(e,t){var n=200,r="__lodash_hash_undefined__",i=800,o=16,s=9007199254740991,a="[object Arguments]",l="[object Array]",u="[object AsyncFunction]",c="[object Boolean]",d="[object Date]",f="[object Error]",h="[object Function]",p="[object GeneratorFunction]",m="[object Map]",S="[object Number]",v="[object Null]",y="[object Object]",g="[object Proxy]",b="[object RegExp]",_="[object Set]",w="[object String]",x="[object Undefined]",C="[object WeakMap]",k="[object ArrayBuffer]",P="[object DataView]",A="[object Float32Array]",$="[object Float64Array]",N="[object Int8Array]",T="[object Int16Array]",O="[object Int32Array]",I="[object Uint8Array]",M="[object Uint8ClampedArray]",R="[object Uint16Array]",D="[object Uint32Array]",L=/[\\^$.*+?()[\]{}|]/g,V=/^\[object .+?Constructor\]$/,z=/^(?:0|[1-9]\d*)$/,U={};U[A]=U[$]=U[N]=U[T]=U[O]=U[I]=U[M]=U[R]=U[D]=!0,U[a]=U[l]=U[k]=U[c]=U[P]=U[d]=U[f]=U[h]=U[m]=U[S]=U[y]=U[b]=U[_]=U[w]=U[C]=!1;var K=typeof Ne=="object"&&Ne&&Ne.Object===Object&&Ne,W=typeof self=="object"&&self&&self.Object===Object&&self,X=K||W||Function("return this")(),F=t&&!t.nodeType&&t,q=F&&!0&&e&&!e.nodeType&&e,Q=q&&q.exports===F,J=Q&&K.process,ne=function(){try{var B=q&&q.require&&q.require("util").types;return B||J&&J.binding&&J.binding("util")}catch{}}(),Z=ne&&ne.isTypedArray;function me(B,G,Y){switch(Y.length){case 0:return B.call(G);case 1:return B.call(G,Y[0]);case 2:return B.call(G,Y[0],Y[1]);case 3:return B.call(G,Y[0],Y[1],Y[2])}return B.apply(G,Y)}function ae(B,G){for(var Y=-1,ue=Array(B);++Y-1}function Bo(B,G){var Y=this.__data__,ue=Jl(Y,B);return ue<0?(++this.size,Y.push([B,G])):Y[ue][1]=G,this}Rn.prototype.clear=Fo,Rn.prototype.delete=Es,Rn.prototype.get=Ps,Rn.prototype.has=Zl,Rn.prototype.set=Bo;function or(B){var G=-1,Y=B==null?0:B.length;for(this.clear();++G1?Y[He-1]:void 0,Ct=He>2?Y[2]:void 0;for(dt=B.length>3&&typeof dt=="function"?(He--,dt):void 0,Ct&&Yj(Y[0],Y[1],Ct)&&(dt=He<3?void 0:dt,He=1),G=Object(G);++ue-1&&B%1==0&&B0){if(++G>=i)return arguments[0]}else G=0;return B.apply(void 0,arguments)}}function rV(B){if(B!=null){try{return Ie.call(B)}catch{}try{return B+""}catch{}}return""}function Hp(B,G){return B===G||B!==B&&G!==G}var zb=Up(function(){return arguments}())?Up:function(B){return dd(B)&&nt.call(B,"callee")&&!Qt.call(B,"callee")},Ub=Array.isArray;function Gb(B){return B!=null&&_4(B.length)&&!Hb(B)}function iV(B){return dd(B)&&Gb(B)}var S4=Lo||uV;function Hb(B){if(!Ba(B))return!1;var G=tu(B);return G==h||G==p||G==u||G==g}function _4(B){return typeof B=="number"&&B>-1&&B%1==0&&B<=s}function Ba(B){var G=typeof B;return B!=null&&(G=="object"||G=="function")}function dd(B){return B!=null&&typeof B=="object"}function oV(B){if(!dd(B)||tu(B)!=y)return!1;var G=ie(B);if(G===null)return!0;var Y=nt.call(G,"constructor")&&G.constructor;return typeof Y=="function"&&Y instanceof Y&&Ie.call(Y)==an}var w4=Z?oe(Z):cd;function sV(B){return Gj(B,x4(B))}function x4(B){return Gb(B)?Lb(B,!0):Lj(B)}var aV=Hj(function(B,G,Y,ue){y4(B,G,Y,ue)});function lV(B){return function(){return B}}function C4(B){return B}function uV(){return!1}e.exports=aV})(Sy,Sy.exports);var UJ=Sy.exports;const uo=Rl(UJ);var GJ=e=>/!(important)?$/.test(e),XE=e=>typeof e=="string"?e.replace(/!(important)?$/,"").trim():e,HJ=(e,t)=>n=>{const r=String(t),i=GJ(r),o=XE(r),s=e?`${e}.${o}`:o;let a=vo(n.__cssMap)&&s in n.__cssMap?n.__cssMap[s].varRef:t;return a=XE(a),i?`${a} !important`:a};function _5(e){const{scale:t,transform:n,compose:r}=e;return(o,s)=>{var a;const l=HJ(t,o)(s);let u=(a=n==null?void 0:n(l,s))!=null?a:l;return r&&(u=r(u,s)),u}}var fg=(...e)=>t=>e.reduce((n,r)=>r(n),t);function Zr(e,t){return n=>{const r={property:n,scale:e};return r.transform=_5({scale:e,transform:t}),r}}var qJ=({rtl:e,ltr:t})=>n=>n.direction==="rtl"?e:t;function WJ(e){const{property:t,scale:n,transform:r}=e;return{scale:n,property:qJ(t),transform:n?_5({scale:n,compose:r}):r}}var z7=["rotate(var(--chakra-rotate, 0))","scaleX(var(--chakra-scale-x, 1))","scaleY(var(--chakra-scale-y, 1))","skewX(var(--chakra-skew-x, 0))","skewY(var(--chakra-skew-y, 0))"];function KJ(){return["translateX(var(--chakra-translate-x, 0))","translateY(var(--chakra-translate-y, 0))",...z7].join(" ")}function YJ(){return["translate3d(var(--chakra-translate-x, 0), var(--chakra-translate-y, 0), 0)",...z7].join(" ")}var XJ={"--chakra-blur":"var(--chakra-empty,/*!*/ /*!*/)","--chakra-brightness":"var(--chakra-empty,/*!*/ /*!*/)","--chakra-contrast":"var(--chakra-empty,/*!*/ /*!*/)","--chakra-grayscale":"var(--chakra-empty,/*!*/ /*!*/)","--chakra-hue-rotate":"var(--chakra-empty,/*!*/ /*!*/)","--chakra-invert":"var(--chakra-empty,/*!*/ /*!*/)","--chakra-saturate":"var(--chakra-empty,/*!*/ /*!*/)","--chakra-sepia":"var(--chakra-empty,/*!*/ /*!*/)","--chakra-drop-shadow":"var(--chakra-empty,/*!*/ /*!*/)",filter:["var(--chakra-blur)","var(--chakra-brightness)","var(--chakra-contrast)","var(--chakra-grayscale)","var(--chakra-hue-rotate)","var(--chakra-invert)","var(--chakra-saturate)","var(--chakra-sepia)","var(--chakra-drop-shadow)"].join(" ")},QJ={backdropFilter:["var(--chakra-backdrop-blur)","var(--chakra-backdrop-brightness)","var(--chakra-backdrop-contrast)","var(--chakra-backdrop-grayscale)","var(--chakra-backdrop-hue-rotate)","var(--chakra-backdrop-invert)","var(--chakra-backdrop-opacity)","var(--chakra-backdrop-saturate)","var(--chakra-backdrop-sepia)"].join(" "),"--chakra-backdrop-blur":"var(--chakra-empty,/*!*/ /*!*/)","--chakra-backdrop-brightness":"var(--chakra-empty,/*!*/ /*!*/)","--chakra-backdrop-contrast":"var(--chakra-empty,/*!*/ /*!*/)","--chakra-backdrop-grayscale":"var(--chakra-empty,/*!*/ /*!*/)","--chakra-backdrop-hue-rotate":"var(--chakra-empty,/*!*/ /*!*/)","--chakra-backdrop-invert":"var(--chakra-empty,/*!*/ /*!*/)","--chakra-backdrop-opacity":"var(--chakra-empty,/*!*/ /*!*/)","--chakra-backdrop-saturate":"var(--chakra-empty,/*!*/ /*!*/)","--chakra-backdrop-sepia":"var(--chakra-empty,/*!*/ /*!*/)"};function ZJ(e){return{"--chakra-ring-offset-shadow":"var(--chakra-ring-inset) 0 0 0 var(--chakra-ring-offset-width) var(--chakra-ring-offset-color)","--chakra-ring-shadow":"var(--chakra-ring-inset) 0 0 0 calc(var(--chakra-ring-width) + var(--chakra-ring-offset-width)) var(--chakra-ring-color)","--chakra-ring-width":e,boxShadow:["var(--chakra-ring-offset-shadow)","var(--chakra-ring-shadow)","var(--chakra-shadow, 0 0 #0000)"].join(", ")}}var JJ={"row-reverse":{space:"--chakra-space-x-reverse",divide:"--chakra-divide-x-reverse"},"column-reverse":{space:"--chakra-space-y-reverse",divide:"--chakra-divide-y-reverse"}},ow={"to-t":"to top","to-tr":"to top right","to-r":"to right","to-br":"to bottom right","to-b":"to bottom","to-bl":"to bottom left","to-l":"to left","to-tl":"to top left"},eee=new Set(Object.values(ow)),sw=new Set(["none","-moz-initial","inherit","initial","revert","unset"]),tee=e=>e.trim();function nee(e,t){if(e==null||sw.has(e))return e;if(!(aw(e)||sw.has(e)))return`url('${e}')`;const i=/(^[a-z-A-Z]+)\((.*)\)/g.exec(e),o=i==null?void 0:i[1],s=i==null?void 0:i[2];if(!o||!s)return e;const a=o.includes("-gradient")?o:`${o}-gradient`,[l,...u]=s.split(",").map(tee).filter(Boolean);if((u==null?void 0:u.length)===0)return e;const c=l in ow?ow[l]:l;u.unshift(c);const d=u.map(f=>{if(eee.has(f))return f;const h=f.indexOf(" "),[p,m]=h!==-1?[f.substr(0,h),f.substr(h+1)]:[f],S=aw(m)?m:m&&m.split(" "),v=`colors.${p}`,y=v in t.__cssMap?t.__cssMap[v].varRef:p;return S?[y,...Array.isArray(S)?S:[S]].join(" "):y});return`${a}(${d.join(", ")})`}var aw=e=>typeof e=="string"&&e.includes("(")&&e.includes(")"),ree=(e,t)=>nee(e,t??{});function iee(e){return/^var\(--.+\)$/.test(e)}var oee=e=>{const t=parseFloat(e.toString()),n=e.toString().replace(String(t),"");return{unitless:!n,value:t,unit:n}},Wi=e=>t=>`${e}(${t})`,Ye={filter(e){return e!=="auto"?e:XJ},backdropFilter(e){return e!=="auto"?e:QJ},ring(e){return ZJ(Ye.px(e))},bgClip(e){return e==="text"?{color:"transparent",backgroundClip:"text"}:{backgroundClip:e}},transform(e){return e==="auto"?KJ():e==="auto-gpu"?YJ():e},vh(e){return e==="$100vh"?"var(--chakra-vh)":e},px(e){if(e==null)return e;const{unitless:t}=oee(e);return t||typeof e=="number"?`${e}px`:e},fraction(e){return typeof e!="number"||e>1?e:`${e*100}%`},float(e,t){const n={left:"right",right:"left"};return t.direction==="rtl"?n[e]:e},degree(e){if(iee(e)||e==null)return e;const t=typeof e=="string"&&!e.endsWith("deg");return typeof e=="number"||t?`${e}deg`:e},gradient:ree,blur:Wi("blur"),opacity:Wi("opacity"),brightness:Wi("brightness"),contrast:Wi("contrast"),dropShadow:Wi("drop-shadow"),grayscale:Wi("grayscale"),hueRotate:Wi("hue-rotate"),invert:Wi("invert"),saturate:Wi("saturate"),sepia:Wi("sepia"),bgImage(e){return e==null||aw(e)||sw.has(e)?e:`url(${e})`},outline(e){const t=String(e)==="0"||String(e)==="none";return e!==null&&t?{outline:"2px solid transparent",outlineOffset:"2px"}:{outline:e}},flexDirection(e){var t;const{space:n,divide:r}=(t=JJ[e])!=null?t:{},i={flexDirection:e};return n&&(i[n]=1),r&&(i[r]=1),i}},H={borderWidths:Zr("borderWidths"),borderStyles:Zr("borderStyles"),colors:Zr("colors"),borders:Zr("borders"),gradients:Zr("gradients",Ye.gradient),radii:Zr("radii",Ye.px),space:Zr("space",fg(Ye.vh,Ye.px)),spaceT:Zr("space",fg(Ye.vh,Ye.px)),degreeT(e){return{property:e,transform:Ye.degree}},prop(e,t,n){return{property:e,scale:t,...t&&{transform:_5({scale:t,transform:n})}}},propT(e,t){return{property:e,transform:t}},sizes:Zr("sizes",fg(Ye.vh,Ye.px)),sizesT:Zr("sizes",fg(Ye.vh,Ye.fraction)),shadows:Zr("shadows"),logical:WJ,blur:Zr("blur",Ye.blur)},dm={background:H.colors("background"),backgroundColor:H.colors("backgroundColor"),backgroundImage:H.gradients("backgroundImage"),backgroundSize:!0,backgroundPosition:!0,backgroundRepeat:!0,backgroundAttachment:!0,backgroundClip:{transform:Ye.bgClip},bgSize:H.prop("backgroundSize"),bgPosition:H.prop("backgroundPosition"),bg:H.colors("background"),bgColor:H.colors("backgroundColor"),bgPos:H.prop("backgroundPosition"),bgRepeat:H.prop("backgroundRepeat"),bgAttachment:H.prop("backgroundAttachment"),bgGradient:H.gradients("backgroundImage"),bgClip:{transform:Ye.bgClip}};Object.assign(dm,{bgImage:dm.backgroundImage,bgImg:dm.backgroundImage});var Je={border:H.borders("border"),borderWidth:H.borderWidths("borderWidth"),borderStyle:H.borderStyles("borderStyle"),borderColor:H.colors("borderColor"),borderRadius:H.radii("borderRadius"),borderTop:H.borders("borderTop"),borderBlockStart:H.borders("borderBlockStart"),borderTopLeftRadius:H.radii("borderTopLeftRadius"),borderStartStartRadius:H.logical({scale:"radii",property:{ltr:"borderTopLeftRadius",rtl:"borderTopRightRadius"}}),borderEndStartRadius:H.logical({scale:"radii",property:{ltr:"borderBottomLeftRadius",rtl:"borderBottomRightRadius"}}),borderTopRightRadius:H.radii("borderTopRightRadius"),borderStartEndRadius:H.logical({scale:"radii",property:{ltr:"borderTopRightRadius",rtl:"borderTopLeftRadius"}}),borderEndEndRadius:H.logical({scale:"radii",property:{ltr:"borderBottomRightRadius",rtl:"borderBottomLeftRadius"}}),borderRight:H.borders("borderRight"),borderInlineEnd:H.borders("borderInlineEnd"),borderBottom:H.borders("borderBottom"),borderBlockEnd:H.borders("borderBlockEnd"),borderBottomLeftRadius:H.radii("borderBottomLeftRadius"),borderBottomRightRadius:H.radii("borderBottomRightRadius"),borderLeft:H.borders("borderLeft"),borderInlineStart:{property:"borderInlineStart",scale:"borders"},borderInlineStartRadius:H.logical({scale:"radii",property:{ltr:["borderTopLeftRadius","borderBottomLeftRadius"],rtl:["borderTopRightRadius","borderBottomRightRadius"]}}),borderInlineEndRadius:H.logical({scale:"radii",property:{ltr:["borderTopRightRadius","borderBottomRightRadius"],rtl:["borderTopLeftRadius","borderBottomLeftRadius"]}}),borderX:H.borders(["borderLeft","borderRight"]),borderInline:H.borders("borderInline"),borderY:H.borders(["borderTop","borderBottom"]),borderBlock:H.borders("borderBlock"),borderTopWidth:H.borderWidths("borderTopWidth"),borderBlockStartWidth:H.borderWidths("borderBlockStartWidth"),borderTopColor:H.colors("borderTopColor"),borderBlockStartColor:H.colors("borderBlockStartColor"),borderTopStyle:H.borderStyles("borderTopStyle"),borderBlockStartStyle:H.borderStyles("borderBlockStartStyle"),borderBottomWidth:H.borderWidths("borderBottomWidth"),borderBlockEndWidth:H.borderWidths("borderBlockEndWidth"),borderBottomColor:H.colors("borderBottomColor"),borderBlockEndColor:H.colors("borderBlockEndColor"),borderBottomStyle:H.borderStyles("borderBottomStyle"),borderBlockEndStyle:H.borderStyles("borderBlockEndStyle"),borderLeftWidth:H.borderWidths("borderLeftWidth"),borderInlineStartWidth:H.borderWidths("borderInlineStartWidth"),borderLeftColor:H.colors("borderLeftColor"),borderInlineStartColor:H.colors("borderInlineStartColor"),borderLeftStyle:H.borderStyles("borderLeftStyle"),borderInlineStartStyle:H.borderStyles("borderInlineStartStyle"),borderRightWidth:H.borderWidths("borderRightWidth"),borderInlineEndWidth:H.borderWidths("borderInlineEndWidth"),borderRightColor:H.colors("borderRightColor"),borderInlineEndColor:H.colors("borderInlineEndColor"),borderRightStyle:H.borderStyles("borderRightStyle"),borderInlineEndStyle:H.borderStyles("borderInlineEndStyle"),borderTopRadius:H.radii(["borderTopLeftRadius","borderTopRightRadius"]),borderBottomRadius:H.radii(["borderBottomLeftRadius","borderBottomRightRadius"]),borderLeftRadius:H.radii(["borderTopLeftRadius","borderBottomLeftRadius"]),borderRightRadius:H.radii(["borderTopRightRadius","borderBottomRightRadius"])};Object.assign(Je,{rounded:Je.borderRadius,roundedTop:Je.borderTopRadius,roundedTopLeft:Je.borderTopLeftRadius,roundedTopRight:Je.borderTopRightRadius,roundedTopStart:Je.borderStartStartRadius,roundedTopEnd:Je.borderStartEndRadius,roundedBottom:Je.borderBottomRadius,roundedBottomLeft:Je.borderBottomLeftRadius,roundedBottomRight:Je.borderBottomRightRadius,roundedBottomStart:Je.borderEndStartRadius,roundedBottomEnd:Je.borderEndEndRadius,roundedLeft:Je.borderLeftRadius,roundedRight:Je.borderRightRadius,roundedStart:Je.borderInlineStartRadius,roundedEnd:Je.borderInlineEndRadius,borderStart:Je.borderInlineStart,borderEnd:Je.borderInlineEnd,borderTopStartRadius:Je.borderStartStartRadius,borderTopEndRadius:Je.borderStartEndRadius,borderBottomStartRadius:Je.borderEndStartRadius,borderBottomEndRadius:Je.borderEndEndRadius,borderStartRadius:Je.borderInlineStartRadius,borderEndRadius:Je.borderInlineEndRadius,borderStartWidth:Je.borderInlineStartWidth,borderEndWidth:Je.borderInlineEndWidth,borderStartColor:Je.borderInlineStartColor,borderEndColor:Je.borderInlineEndColor,borderStartStyle:Je.borderInlineStartStyle,borderEndStyle:Je.borderInlineEndStyle});var see={color:H.colors("color"),textColor:H.colors("color"),fill:H.colors("fill"),stroke:H.colors("stroke")},lw={boxShadow:H.shadows("boxShadow"),mixBlendMode:!0,blendMode:H.prop("mixBlendMode"),backgroundBlendMode:!0,bgBlendMode:H.prop("backgroundBlendMode"),opacity:!0};Object.assign(lw,{shadow:lw.boxShadow});var aee={filter:{transform:Ye.filter},blur:H.blur("--chakra-blur"),brightness:H.propT("--chakra-brightness",Ye.brightness),contrast:H.propT("--chakra-contrast",Ye.contrast),hueRotate:H.degreeT("--chakra-hue-rotate"),invert:H.propT("--chakra-invert",Ye.invert),saturate:H.propT("--chakra-saturate",Ye.saturate),dropShadow:H.propT("--chakra-drop-shadow",Ye.dropShadow),backdropFilter:{transform:Ye.backdropFilter},backdropBlur:H.blur("--chakra-backdrop-blur"),backdropBrightness:H.propT("--chakra-backdrop-brightness",Ye.brightness),backdropContrast:H.propT("--chakra-backdrop-contrast",Ye.contrast),backdropHueRotate:H.degreeT("--chakra-backdrop-hue-rotate"),backdropInvert:H.propT("--chakra-backdrop-invert",Ye.invert),backdropSaturate:H.propT("--chakra-backdrop-saturate",Ye.saturate)},_y={alignItems:!0,alignContent:!0,justifyItems:!0,justifyContent:!0,flexWrap:!0,flexDirection:{transform:Ye.flexDirection},flex:!0,flexFlow:!0,flexGrow:!0,flexShrink:!0,flexBasis:H.sizes("flexBasis"),justifySelf:!0,alignSelf:!0,order:!0,placeItems:!0,placeContent:!0,placeSelf:!0,gap:H.space("gap"),rowGap:H.space("rowGap"),columnGap:H.space("columnGap")};Object.assign(_y,{flexDir:_y.flexDirection});var U7={gridGap:H.space("gridGap"),gridColumnGap:H.space("gridColumnGap"),gridRowGap:H.space("gridRowGap"),gridColumn:!0,gridRow:!0,gridAutoFlow:!0,gridAutoColumns:!0,gridColumnStart:!0,gridColumnEnd:!0,gridRowStart:!0,gridRowEnd:!0,gridAutoRows:!0,gridTemplate:!0,gridTemplateColumns:!0,gridTemplateRows:!0,gridTemplateAreas:!0,gridArea:!0},lee={appearance:!0,cursor:!0,resize:!0,userSelect:!0,pointerEvents:!0,outline:{transform:Ye.outline},outlineOffset:!0,outlineColor:H.colors("outlineColor")},ti={width:H.sizesT("width"),inlineSize:H.sizesT("inlineSize"),height:H.sizes("height"),blockSize:H.sizes("blockSize"),boxSize:H.sizes(["width","height"]),minWidth:H.sizes("minWidth"),minInlineSize:H.sizes("minInlineSize"),minHeight:H.sizes("minHeight"),minBlockSize:H.sizes("minBlockSize"),maxWidth:H.sizes("maxWidth"),maxInlineSize:H.sizes("maxInlineSize"),maxHeight:H.sizes("maxHeight"),maxBlockSize:H.sizes("maxBlockSize"),overflow:!0,overflowX:!0,overflowY:!0,overscrollBehavior:!0,overscrollBehaviorX:!0,overscrollBehaviorY:!0,display:!0,aspectRatio:!0,hideFrom:{scale:"breakpoints",transform:(e,t)=>{var n,r,i;return{[`@media screen and (min-width: ${(i=(r=(n=t.__breakpoints)==null?void 0:n.get(e))==null?void 0:r.minW)!=null?i:e})`]:{display:"none"}}}},hideBelow:{scale:"breakpoints",transform:(e,t)=>{var n,r,i;return{[`@media screen and (max-width: ${(i=(r=(n=t.__breakpoints)==null?void 0:n.get(e))==null?void 0:r._minW)!=null?i:e})`]:{display:"none"}}}},verticalAlign:!0,boxSizing:!0,boxDecorationBreak:!0,float:H.propT("float",Ye.float),objectFit:!0,objectPosition:!0,visibility:!0,isolation:!0};Object.assign(ti,{w:ti.width,h:ti.height,minW:ti.minWidth,maxW:ti.maxWidth,minH:ti.minHeight,maxH:ti.maxHeight,overscroll:ti.overscrollBehavior,overscrollX:ti.overscrollBehaviorX,overscrollY:ti.overscrollBehaviorY});var uee={listStyleType:!0,listStylePosition:!0,listStylePos:H.prop("listStylePosition"),listStyleImage:!0,listStyleImg:H.prop("listStyleImage")};function cee(e,t,n,r){const i=typeof t=="string"?t.split("."):[t];for(r=0;r{const t=new WeakMap;return(r,i,o,s)=>{if(typeof r>"u")return e(r,i,o);t.has(r)||t.set(r,new Map);const a=t.get(r);if(a.has(i))return a.get(i);const l=e(r,i,o,s);return a.set(i,l),l}},fee=dee(cee),hee={border:"0px",clip:"rect(0, 0, 0, 0)",width:"1px",height:"1px",margin:"-1px",padding:"0px",overflow:"hidden",whiteSpace:"nowrap",position:"absolute"},pee={position:"static",width:"auto",height:"auto",clip:"auto",padding:"0",margin:"0",overflow:"visible",whiteSpace:"normal"},$S=(e,t,n)=>{const r={},i=fee(e,t,{});for(const o in i)o in n&&n[o]!=null||(r[o]=i[o]);return r},gee={srOnly:{transform(e){return e===!0?hee:e==="focusable"?pee:{}}},layerStyle:{processResult:!0,transform:(e,t,n)=>$S(t,`layerStyles.${e}`,n)},textStyle:{processResult:!0,transform:(e,t,n)=>$S(t,`textStyles.${e}`,n)},apply:{processResult:!0,transform:(e,t,n)=>$S(t,e,n)}},ff={position:!0,pos:H.prop("position"),zIndex:H.prop("zIndex","zIndices"),inset:H.spaceT("inset"),insetX:H.spaceT(["left","right"]),insetInline:H.spaceT("insetInline"),insetY:H.spaceT(["top","bottom"]),insetBlock:H.spaceT("insetBlock"),top:H.spaceT("top"),insetBlockStart:H.spaceT("insetBlockStart"),bottom:H.spaceT("bottom"),insetBlockEnd:H.spaceT("insetBlockEnd"),left:H.spaceT("left"),insetInlineStart:H.logical({scale:"space",property:{ltr:"left",rtl:"right"}}),right:H.spaceT("right"),insetInlineEnd:H.logical({scale:"space",property:{ltr:"right",rtl:"left"}})};Object.assign(ff,{insetStart:ff.insetInlineStart,insetEnd:ff.insetInlineEnd});var mee={ring:{transform:Ye.ring},ringColor:H.colors("--chakra-ring-color"),ringOffset:H.prop("--chakra-ring-offset-width"),ringOffsetColor:H.colors("--chakra-ring-offset-color"),ringInset:H.prop("--chakra-ring-inset")},bt={margin:H.spaceT("margin"),marginTop:H.spaceT("marginTop"),marginBlockStart:H.spaceT("marginBlockStart"),marginRight:H.spaceT("marginRight"),marginInlineEnd:H.spaceT("marginInlineEnd"),marginBottom:H.spaceT("marginBottom"),marginBlockEnd:H.spaceT("marginBlockEnd"),marginLeft:H.spaceT("marginLeft"),marginInlineStart:H.spaceT("marginInlineStart"),marginX:H.spaceT(["marginInlineStart","marginInlineEnd"]),marginInline:H.spaceT("marginInline"),marginY:H.spaceT(["marginTop","marginBottom"]),marginBlock:H.spaceT("marginBlock"),padding:H.space("padding"),paddingTop:H.space("paddingTop"),paddingBlockStart:H.space("paddingBlockStart"),paddingRight:H.space("paddingRight"),paddingBottom:H.space("paddingBottom"),paddingBlockEnd:H.space("paddingBlockEnd"),paddingLeft:H.space("paddingLeft"),paddingInlineStart:H.space("paddingInlineStart"),paddingInlineEnd:H.space("paddingInlineEnd"),paddingX:H.space(["paddingInlineStart","paddingInlineEnd"]),paddingInline:H.space("paddingInline"),paddingY:H.space(["paddingTop","paddingBottom"]),paddingBlock:H.space("paddingBlock")};Object.assign(bt,{m:bt.margin,mt:bt.marginTop,mr:bt.marginRight,me:bt.marginInlineEnd,marginEnd:bt.marginInlineEnd,mb:bt.marginBottom,ml:bt.marginLeft,ms:bt.marginInlineStart,marginStart:bt.marginInlineStart,mx:bt.marginX,my:bt.marginY,p:bt.padding,pt:bt.paddingTop,py:bt.paddingY,px:bt.paddingX,pb:bt.paddingBottom,pl:bt.paddingLeft,ps:bt.paddingInlineStart,paddingStart:bt.paddingInlineStart,pr:bt.paddingRight,pe:bt.paddingInlineEnd,paddingEnd:bt.paddingInlineEnd});var yee={textDecorationColor:H.colors("textDecorationColor"),textDecoration:!0,textDecor:{property:"textDecoration"},textDecorationLine:!0,textDecorationStyle:!0,textDecorationThickness:!0,textUnderlineOffset:!0,textShadow:H.shadows("textShadow")},vee={clipPath:!0,transform:H.propT("transform",Ye.transform),transformOrigin:!0,translateX:H.spaceT("--chakra-translate-x"),translateY:H.spaceT("--chakra-translate-y"),skewX:H.degreeT("--chakra-skew-x"),skewY:H.degreeT("--chakra-skew-y"),scaleX:H.prop("--chakra-scale-x"),scaleY:H.prop("--chakra-scale-y"),scale:H.prop(["--chakra-scale-x","--chakra-scale-y"]),rotate:H.degreeT("--chakra-rotate")},bee={transition:!0,transitionDelay:!0,animation:!0,willChange:!0,transitionDuration:H.prop("transitionDuration","transition.duration"),transitionProperty:H.prop("transitionProperty","transition.property"),transitionTimingFunction:H.prop("transitionTimingFunction","transition.easing")},See={fontFamily:H.prop("fontFamily","fonts"),fontSize:H.prop("fontSize","fontSizes",Ye.px),fontWeight:H.prop("fontWeight","fontWeights"),lineHeight:H.prop("lineHeight","lineHeights"),letterSpacing:H.prop("letterSpacing","letterSpacings"),textAlign:!0,fontStyle:!0,textIndent:!0,wordBreak:!0,overflowWrap:!0,textOverflow:!0,textTransform:!0,whiteSpace:!0,isTruncated:{transform(e){if(e===!0)return{overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"}}},noOfLines:{static:{overflow:"hidden",textOverflow:"ellipsis",display:"-webkit-box",WebkitBoxOrient:"vertical",WebkitLineClamp:"var(--chakra-line-clamp)"},property:"--chakra-line-clamp"}},_ee={scrollBehavior:!0,scrollSnapAlign:!0,scrollSnapStop:!0,scrollSnapType:!0,scrollMargin:H.spaceT("scrollMargin"),scrollMarginTop:H.spaceT("scrollMarginTop"),scrollMarginBottom:H.spaceT("scrollMarginBottom"),scrollMarginLeft:H.spaceT("scrollMarginLeft"),scrollMarginRight:H.spaceT("scrollMarginRight"),scrollMarginX:H.spaceT(["scrollMarginLeft","scrollMarginRight"]),scrollMarginY:H.spaceT(["scrollMarginTop","scrollMarginBottom"]),scrollPadding:H.spaceT("scrollPadding"),scrollPaddingTop:H.spaceT("scrollPaddingTop"),scrollPaddingBottom:H.spaceT("scrollPaddingBottom"),scrollPaddingLeft:H.spaceT("scrollPaddingLeft"),scrollPaddingRight:H.spaceT("scrollPaddingRight"),scrollPaddingX:H.spaceT(["scrollPaddingLeft","scrollPaddingRight"]),scrollPaddingY:H.spaceT(["scrollPaddingTop","scrollPaddingBottom"])};function G7(e){return vo(e)&&e.reference?e.reference:String(e)}var Ov=(e,...t)=>t.map(G7).join(` ${e} `).replace(/calc/g,""),QE=(...e)=>`calc(${Ov("+",...e)})`,ZE=(...e)=>`calc(${Ov("-",...e)})`,uw=(...e)=>`calc(${Ov("*",...e)})`,JE=(...e)=>`calc(${Ov("/",...e)})`,eP=e=>{const t=G7(e);return t!=null&&!Number.isNaN(parseFloat(t))?String(t).startsWith("-")?String(t).slice(1):`-${t}`:uw(t,-1)},Xa=Object.assign(e=>({add:(...t)=>Xa(QE(e,...t)),subtract:(...t)=>Xa(ZE(e,...t)),multiply:(...t)=>Xa(uw(e,...t)),divide:(...t)=>Xa(JE(e,...t)),negate:()=>Xa(eP(e)),toString:()=>e.toString()}),{add:QE,subtract:ZE,multiply:uw,divide:JE,negate:eP});function wee(e,t="-"){return e.replace(/\s+/g,t)}function xee(e){const t=wee(e.toString());return Tee(Cee(t))}function Cee(e){return e.includes("\\.")?e:!Number.isInteger(parseFloat(e.toString()))?e.replace(".","\\."):e}function Tee(e){return e.replace(/[!-,/:-@[-^`{-~]/g,"\\$&")}function Eee(e,t=""){return[t,e].filter(Boolean).join("-")}function Pee(e,t){return`var(${e}${t?`, ${t}`:""})`}function kee(e,t=""){return xee(`--${Eee(e,t)}`)}function cw(e,t,n){const r=kee(e,n);return{variable:r,reference:Pee(r,t)}}function XTe(e,t){const n={};for(const r of t){if(Array.isArray(r)){const[i,o]=r;n[i]=cw(`${e}-${i}`,o);continue}n[r]=cw(`${e}-${r}`)}return n}function Aee(e){const t=e==null?0:e.length;return t?e[t-1]:void 0}function Oee(e){const t=parseFloat(e.toString()),n=e.toString().replace(String(t),"");return{unitless:!n,value:t,unit:n}}function dw(e){if(e==null)return e;const{unitless:t}=Oee(e);return t||typeof e=="number"?`${e}px`:e}var H7=(e,t)=>parseInt(e[1],10)>parseInt(t[1],10)?1:-1,w5=e=>Object.fromEntries(Object.entries(e).sort(H7));function tP(e){const t=w5(e);return Object.assign(Object.values(t),t)}function Ree(e){const t=Object.keys(w5(e));return new Set(t)}function nP(e){var t;if(!e)return e;e=(t=dw(e))!=null?t:e;const n=-.02;return typeof e=="number"?`${e+n}`:e.replace(/(\d+\.?\d*)/u,r=>`${parseFloat(r)+n}`)}function Wd(e,t){const n=["@media screen"];return e&&n.push("and",`(min-width: ${dw(e)})`),t&&n.push("and",`(max-width: ${dw(t)})`),n.join(" ")}function Iee(e){var t;if(!e)return null;e.base=(t=e.base)!=null?t:"0px";const n=tP(e),r=Object.entries(e).sort(H7).map(([s,a],l,u)=>{var c;let[,d]=(c=u[l+1])!=null?c:[];return d=parseFloat(d)>0?nP(d):void 0,{_minW:nP(a),breakpoint:s,minW:a,maxW:d,maxWQuery:Wd(null,d),minWQuery:Wd(a),minMaxQuery:Wd(a,d)}}),i=Ree(e),o=Array.from(i.values());return{keys:i,normalized:n,isResponsive(s){const a=Object.keys(s);return a.length>0&&a.every(l=>i.has(l))},asObject:w5(e),asArray:tP(e),details:r,get(s){return r.find(a=>a.breakpoint===s)},media:[null,...n.map(s=>Wd(s)).slice(1)],toArrayValue(s){if(!vo(s))throw new Error("toArrayValue: value must be an object");const a=o.map(l=>{var u;return(u=s[l])!=null?u:null});for(;Aee(a)===null;)a.pop();return a},toObjectValue(s){if(!Array.isArray(s))throw new Error("toObjectValue: value must be an array");return s.reduce((a,l,u)=>{const c=o[u];return c!=null&&l!=null&&(a[c]=l),a},{})}}}var In={hover:(e,t)=>`${e}:hover ${t}, ${e}[data-hover] ${t}`,focus:(e,t)=>`${e}:focus ${t}, ${e}[data-focus] ${t}`,focusVisible:(e,t)=>`${e}:focus-visible ${t}`,focusWithin:(e,t)=>`${e}:focus-within ${t}`,active:(e,t)=>`${e}:active ${t}, ${e}[data-active] ${t}`,disabled:(e,t)=>`${e}:disabled ${t}, ${e}[data-disabled] ${t}`,invalid:(e,t)=>`${e}:invalid ${t}, ${e}[data-invalid] ${t}`,checked:(e,t)=>`${e}:checked ${t}, ${e}[data-checked] ${t}`,indeterminate:(e,t)=>`${e}:indeterminate ${t}, ${e}[aria-checked=mixed] ${t}, ${e}[data-indeterminate] ${t}`,readOnly:(e,t)=>`${e}:read-only ${t}, ${e}[readonly] ${t}, ${e}[data-read-only] ${t}`,expanded:(e,t)=>`${e}:read-only ${t}, ${e}[aria-expanded=true] ${t}, ${e}[data-expanded] ${t}`,placeholderShown:(e,t)=>`${e}:placeholder-shown ${t}`},Os=e=>q7(t=>e(t,"&"),"[role=group]","[data-group]",".group"),jo=e=>q7(t=>e(t,"~ &"),"[data-peer]",".peer"),q7=(e,...t)=>t.map(e).join(", "),Rv={_hover:"&:hover, &[data-hover]",_active:"&:active, &[data-active]",_focus:"&:focus, &[data-focus]",_highlighted:"&[data-highlighted]",_focusWithin:"&:focus-within",_focusVisible:"&:focus-visible, &[data-focus-visible]",_disabled:"&:disabled, &[disabled], &[aria-disabled=true], &[data-disabled]",_readOnly:"&[aria-readonly=true], &[readonly], &[data-readonly]",_before:"&::before",_after:"&::after",_empty:"&:empty",_expanded:"&[aria-expanded=true], &[data-expanded]",_checked:"&[aria-checked=true], &[data-checked]",_grabbed:"&[aria-grabbed=true], &[data-grabbed]",_pressed:"&[aria-pressed=true], &[data-pressed]",_invalid:"&[aria-invalid=true], &[data-invalid]",_valid:"&[data-valid], &[data-state=valid]",_loading:"&[data-loading], &[aria-busy=true]",_selected:"&[aria-selected=true], &[data-selected]",_hidden:"&[hidden], &[data-hidden]",_autofill:"&:-webkit-autofill",_even:"&:nth-of-type(even)",_odd:"&:nth-of-type(odd)",_first:"&:first-of-type",_firstLetter:"&::first-letter",_last:"&:last-of-type",_notFirst:"&:not(:first-of-type)",_notLast:"&:not(:last-of-type)",_visited:"&:visited",_activeLink:"&[aria-current=page]",_activeStep:"&[aria-current=step]",_indeterminate:"&:indeterminate, &[aria-checked=mixed], &[data-indeterminate]",_groupHover:Os(In.hover),_peerHover:jo(In.hover),_groupFocus:Os(In.focus),_peerFocus:jo(In.focus),_groupFocusVisible:Os(In.focusVisible),_peerFocusVisible:jo(In.focusVisible),_groupActive:Os(In.active),_peerActive:jo(In.active),_groupDisabled:Os(In.disabled),_peerDisabled:jo(In.disabled),_groupInvalid:Os(In.invalid),_peerInvalid:jo(In.invalid),_groupChecked:Os(In.checked),_peerChecked:jo(In.checked),_groupFocusWithin:Os(In.focusWithin),_peerFocusWithin:jo(In.focusWithin),_peerPlaceholderShown:jo(In.placeholderShown),_placeholder:"&::placeholder",_placeholderShown:"&:placeholder-shown",_fullScreen:"&:fullscreen",_selection:"&::selection",_rtl:"[dir=rtl] &, &[dir=rtl]",_ltr:"[dir=ltr] &, &[dir=ltr]",_mediaDark:"@media (prefers-color-scheme: dark)",_mediaReduceMotion:"@media (prefers-reduced-motion: reduce)",_dark:".chakra-ui-dark &:not([data-theme]),[data-theme=dark] &:not([data-theme]),&[data-theme=dark]",_light:".chakra-ui-light &:not([data-theme]),[data-theme=light] &:not([data-theme]),&[data-theme=light]",_horizontal:"&[data-orientation=horizontal]",_vertical:"&[data-orientation=vertical]"},W7=Object.keys(Rv);function rP(e,t){return cw(String(e).replace(/\./g,"-"),void 0,t)}function Mee(e,t){let n={};const r={};for(const[i,o]of Object.entries(e)){const{isSemantic:s,value:a}=o,{variable:l,reference:u}=rP(i,t==null?void 0:t.cssVarPrefix);if(!s){if(i.startsWith("space")){const f=i.split("."),[h,...p]=f,m=`${h}.-${p.join(".")}`,S=Xa.negate(a),v=Xa.negate(u);r[m]={value:S,var:l,varRef:v}}n[l]=a,r[i]={value:a,var:l,varRef:u};continue}const c=f=>{const p=[String(i).split(".")[0],f].join(".");if(!e[p])return f;const{reference:S}=rP(p,t==null?void 0:t.cssVarPrefix);return S},d=vo(a)?a:{default:a};n=uo(n,Object.entries(d).reduce((f,[h,p])=>{var m,S;if(!p)return f;const v=c(`${p}`);if(h==="default")return f[l]=v,f;const y=(S=(m=Rv)==null?void 0:m[h])!=null?S:h;return f[y]={[l]:v},f},{})),r[i]={value:u,var:l,varRef:u}}return{cssVars:n,cssMap:r}}function Nee(e,t=[]){const n=Object.assign({},e);for(const r of t)r in n&&delete n[r];return n}function Dee(e,t){const n={};for(const r of t)r in e&&(n[r]=e[r]);return n}function Lee(e){return typeof e=="object"&&e!=null&&!Array.isArray(e)}function iP(e,t,n={}){const{stop:r,getKey:i}=n;function o(s,a=[]){var l;if(Lee(s)||Array.isArray(s)){const u={};for(const[c,d]of Object.entries(s)){const f=(l=i==null?void 0:i(c))!=null?l:c,h=[...a,f];if(r!=null&&r(s,h))return t(s,a);u[f]=o(d,h)}return u}return t(s,a)}return o(e)}var $ee=["colors","borders","borderWidths","borderStyles","fonts","fontSizes","fontWeights","gradients","letterSpacings","lineHeights","radii","space","shadows","sizes","zIndices","transition","blur","breakpoints"];function Fee(e){return Dee(e,$ee)}function Bee(e){return e.semanticTokens}function jee(e){const{__cssMap:t,__cssVars:n,__breakpoints:r,...i}=e;return i}var Vee=e=>W7.includes(e)||e==="default";function zee({tokens:e,semanticTokens:t}){const n={};return iP(e,(r,i)=>{r!=null&&(n[i.join(".")]={isSemantic:!1,value:r})}),iP(t,(r,i)=>{r!=null&&(n[i.join(".")]={isSemantic:!0,value:r})},{stop:r=>Object.keys(r).every(Vee)}),n}function QTe(e){var t;const n=jee(e),r=Fee(n),i=Bee(n),o=zee({tokens:r,semanticTokens:i}),s=(t=n.config)==null?void 0:t.cssVarPrefix,{cssMap:a,cssVars:l}=Mee(o,{cssVarPrefix:s});return Object.assign(n,{__cssVars:{...{"--chakra-ring-inset":"var(--chakra-empty,/*!*/ /*!*/)","--chakra-ring-offset-width":"0px","--chakra-ring-offset-color":"#fff","--chakra-ring-color":"rgba(66, 153, 225, 0.6)","--chakra-ring-offset-shadow":"0 0 #0000","--chakra-ring-shadow":"0 0 #0000","--chakra-space-x-reverse":"0","--chakra-space-y-reverse":"0"},...l},__cssMap:a,__breakpoints:Iee(n.breakpoints)}),n}var x5=uo({},dm,Je,see,_y,ti,aee,mee,lee,U7,gee,ff,lw,bt,_ee,See,yee,vee,uee,bee),Uee=Object.assign({},bt,ti,_y,U7,ff),ZTe=Object.keys(Uee),Gee=[...Object.keys(x5),...W7],Hee={...x5,...Rv},qee=e=>e in Hee,Wee=e=>t=>{if(!t.__breakpoints)return e;const{isResponsive:n,toArrayValue:r,media:i}=t.__breakpoints,o={};for(const s in e){let a=lo(e[s],t);if(a==null)continue;if(a=vo(a)&&n(a)?r(a):a,!Array.isArray(a)){o[s]=a;continue}const l=a.slice(0,i.length).length;for(let u=0;ue.startsWith("--")&&typeof t=="string"&&!Yee(t),Qee=(e,t)=>{var n,r;if(t==null)return t;const i=l=>{var u,c;return(c=(u=e.__cssMap)==null?void 0:u[l])==null?void 0:c.varRef},o=l=>{var u;return(u=i(l))!=null?u:l},[s,a]=Kee(t);return t=(r=(n=i(s))!=null?n:o(a))!=null?r:o(t),t};function Zee(e){const{configs:t={},pseudos:n={},theme:r}=e,i=(o,s=!1)=>{var a,l,u;const c=lo(o,r),d=Wee(c)(r);let f={};for(let h in d){const p=d[h];let m=lo(p,r);h in n&&(h=n[h]),Xee(h,m)&&(m=Qee(r,m));let S=t[h];if(S===!0&&(S={property:h}),vo(m)){f[h]=(a=f[h])!=null?a:{},f[h]=uo({},f[h],i(m,!0));continue}let v=(u=(l=S==null?void 0:S.transform)==null?void 0:l.call(S,m,r,c))!=null?u:m;v=S!=null&&S.processResult?i(v,!0):v;const y=lo(S==null?void 0:S.property,r);if(!s&&(S!=null&&S.static)){const g=lo(S.static,r);f=uo({},f,g)}if(y&&Array.isArray(y)){for(const g of y)f[g]=v;continue}if(y){y==="&"&&vo(v)?f=uo({},f,v):f[y]=v;continue}if(vo(v)){f=uo({},f,v);continue}f[h]=v}return f};return i}var Jee=e=>t=>Zee({theme:t,pseudos:Rv,configs:x5})(e);function JTe(e){return e}function eEe(e){return e}function tEe(e){return{definePartsStyle(t){return t},defineMultiStyleConfig(t){return{parts:e,...t}}}}function ete(e,t){if(Array.isArray(e))return e;if(vo(e))return t(e);if(e!=null)return[e]}function tte(e,t){for(let n=t+1;n{uo(u,{[g]:f?y[g]:{[v]:y[g]}})});continue}if(!h){f?uo(u,y):u[v]=y;continue}u[v]=y}}return u}}function rte(e){return t=>{var n;const{variant:r,size:i,theme:o}=t,s=nte(o);return uo({},lo((n=e.baseStyle)!=null?n:{},t),s(e,"sizes",i,t),s(e,"variants",r,t))}}function ite(e,t,n){var r,i,o;return(o=(i=(r=e.__cssMap)==null?void 0:r[`${t}.${n}`])==null?void 0:i.varRef)!=null?o:n}function Oo(e){return Nee(e,["styleConfig","size","variant","colorScheme"])}function ote(e){return e!=null&&typeof e=="object"&&"nodeType"in e&&e.nodeType===Node.ELEMENT_NODE}function nEe(e){var t;return ote(e)&&(t=e.ownerDocument)!=null?t:document}function ste(){return!!(typeof window<"u"&&window.document&&window.document.createElement)}var ate=ste();function lte(e,t){const n={};return Object.keys(e).forEach(r=>{t.includes(r)||(n[r]=e[r])}),n}function ute(e,t,n,r){const i=typeof t=="string"?t.split("."):[t];for(r=0;r{const t=new WeakMap;return(r,i,o,s)=>{if(typeof r>"u")return e(r,i,o);t.has(r)||t.set(r,new Map);const a=t.get(r);if(a.has(i))return a.get(i);const l=e(r,i,o,s);return a.set(i,l),l}},dte=cte(ute);function K7(e,t){const n={};return Object.keys(e).forEach(r=>{const i=e[r];t(i,r,e)&&(n[r]=i)}),n}var Y7=e=>K7(e,t=>t!=null);function fte(e){return typeof e=="function"}function hte(e,...t){return fte(e)?e(...t):e}function pte(...e){return function(n){e.some(r=>(r==null||r(n),n==null?void 0:n.defaultPrevented))}}const X7=1/60*1e3,gte=typeof performance<"u"?()=>performance.now():()=>Date.now(),Q7=typeof window<"u"?e=>window.requestAnimationFrame(e):e=>setTimeout(()=>e(gte()),X7);function mte(e){let t=[],n=[],r=0,i=!1,o=!1;const s=new WeakSet,a={schedule:(l,u=!1,c=!1)=>{const d=c&&i,f=d?t:n;return u&&s.add(l),f.indexOf(l)===-1&&(f.push(l),d&&i&&(r=t.length)),l},cancel:l=>{const u=n.indexOf(l);u!==-1&&n.splice(u,1),s.delete(l)},process:l=>{if(i){o=!0;return}if(i=!0,[t,n]=[n,t],n.length=0,r=t.length,r)for(let u=0;u(e[t]=mte(()=>rh=!0),e),{}),vte=cp.reduce((e,t)=>{const n=Iv[t];return e[t]=(r,i=!1,o=!1)=>(rh||_te(),n.schedule(r,i,o)),e},{}),bte=cp.reduce((e,t)=>(e[t]=Iv[t].cancel,e),{});cp.reduce((e,t)=>(e[t]=()=>Iv[t].process(nc),e),{});const Ste=e=>Iv[e].process(nc),Z7=e=>{rh=!1,nc.delta=fw?X7:Math.max(Math.min(e-nc.timestamp,yte),1),nc.timestamp=e,hw=!0,cp.forEach(Ste),hw=!1,rh&&(fw=!1,Q7(Z7))},_te=()=>{rh=!0,fw=!0,hw||Q7(Z7)},oP=()=>nc;var wte=typeof Element<"u",xte=typeof Map=="function",Cte=typeof Set=="function",Tte=typeof ArrayBuffer=="function"&&!!ArrayBuffer.isView;function fm(e,t){if(e===t)return!0;if(e&&t&&typeof e=="object"&&typeof t=="object"){if(e.constructor!==t.constructor)return!1;var n,r,i;if(Array.isArray(e)){if(n=e.length,n!=t.length)return!1;for(r=n;r--!==0;)if(!fm(e[r],t[r]))return!1;return!0}var o;if(xte&&e instanceof Map&&t instanceof Map){if(e.size!==t.size)return!1;for(o=e.entries();!(r=o.next()).done;)if(!t.has(r.value[0]))return!1;for(o=e.entries();!(r=o.next()).done;)if(!fm(r.value[1],t.get(r.value[0])))return!1;return!0}if(Cte&&e instanceof Set&&t instanceof Set){if(e.size!==t.size)return!1;for(o=e.entries();!(r=o.next()).done;)if(!t.has(r.value[0]))return!1;return!0}if(Tte&&ArrayBuffer.isView(e)&&ArrayBuffer.isView(t)){if(n=e.length,n!=t.length)return!1;for(r=n;r--!==0;)if(e[r]!==t[r])return!1;return!0}if(e.constructor===RegExp)return e.source===t.source&&e.flags===t.flags;if(e.valueOf!==Object.prototype.valueOf&&typeof e.valueOf=="function"&&typeof t.valueOf=="function")return e.valueOf()===t.valueOf();if(e.toString!==Object.prototype.toString&&typeof e.toString=="function"&&typeof t.toString=="function")return e.toString()===t.toString();if(i=Object.keys(e),n=i.length,n!==Object.keys(t).length)return!1;for(r=n;r--!==0;)if(!Object.prototype.hasOwnProperty.call(t,i[r]))return!1;if(wte&&e instanceof Element)return!1;for(r=n;r--!==0;)if(!((i[r]==="_owner"||i[r]==="__v"||i[r]==="__o")&&e.$$typeof)&&!fm(e[i[r]],t[i[r]]))return!1;return!0}return e!==e&&t!==t}var Ete=function(t,n){try{return fm(t,n)}catch(r){if((r.message||"").match(/stack|recursion/i))return console.warn("react-fast-compare cannot handle circular refs"),!1;throw r}};const Pte=Rl(Ete);function J7(e,t={}){var n;const{styleConfig:r,...i}=t,{theme:o,colorMode:s}=V7(),a=e?dte(o,`components.${e}`):void 0,l=r||a,u=uo({theme:o,colorMode:s},(n=l==null?void 0:l.defaultProps)!=null?n:{},Y7(lte(i,["children"]))),c=E.useRef({});if(l){const f=rte(l)(u);Pte(c.current,f)||(c.current=f)}return c.current}function $l(e,t={}){return J7(e,t)}function Mv(e,t={}){return J7(e,t)}var kte=new Set([...Gee,"textStyle","layerStyle","apply","noOfLines","focusBorderColor","errorBorderColor","as","__css","css","sx"]),Ate=new Set(["htmlWidth","htmlHeight","htmlSize","htmlTranslate"]);function Ote(e){return Ate.has(e)||!kte.has(e)}function Rte(e,...t){if(e==null)throw new TypeError("Cannot convert undefined or null to object");const n={...e};for(const r of t)if(r!=null)for(const i in r)Object.prototype.hasOwnProperty.call(r,i)&&(i in n&&delete n[i],n[i]=r[i]);return n}var Ite=/^((children|dangerouslySetInnerHTML|key|ref|autoFocus|defaultValue|defaultChecked|innerHTML|suppressContentEditableWarning|suppressHydrationWarning|valueLink|abbr|accept|acceptCharset|accessKey|action|allow|allowUserMedia|allowPaymentRequest|allowFullScreen|allowTransparency|alt|async|autoComplete|autoPlay|capture|cellPadding|cellSpacing|challenge|charSet|checked|cite|classID|className|cols|colSpan|content|contentEditable|contextMenu|controls|controlsList|coords|crossOrigin|data|dateTime|decoding|default|defer|dir|disabled|disablePictureInPicture|download|draggable|encType|enterKeyHint|form|formAction|formEncType|formMethod|formNoValidate|formTarget|frameBorder|headers|height|hidden|high|href|hrefLang|htmlFor|httpEquiv|id|inputMode|integrity|is|keyParams|keyType|kind|label|lang|list|loading|loop|low|marginHeight|marginWidth|max|maxLength|media|mediaGroup|method|min|minLength|multiple|muted|name|nonce|noValidate|open|optimum|pattern|placeholder|playsInline|poster|preload|profile|radioGroup|readOnly|referrerPolicy|rel|required|reversed|role|rows|rowSpan|sandbox|scope|scoped|scrolling|seamless|selected|shape|size|sizes|slot|span|spellCheck|src|srcDoc|srcLang|srcSet|start|step|style|summary|tabIndex|target|title|translate|type|useMap|value|width|wmode|wrap|about|datatype|inlist|prefix|property|resource|typeof|vocab|autoCapitalize|autoCorrect|autoSave|color|incremental|fallback|inert|itemProp|itemScope|itemType|itemID|itemRef|on|option|results|security|unselectable|accentHeight|accumulate|additive|alignmentBaseline|allowReorder|alphabetic|amplitude|arabicForm|ascent|attributeName|attributeType|autoReverse|azimuth|baseFrequency|baselineShift|baseProfile|bbox|begin|bias|by|calcMode|capHeight|clip|clipPathUnits|clipPath|clipRule|colorInterpolation|colorInterpolationFilters|colorProfile|colorRendering|contentScriptType|contentStyleType|cursor|cx|cy|d|decelerate|descent|diffuseConstant|direction|display|divisor|dominantBaseline|dur|dx|dy|edgeMode|elevation|enableBackground|end|exponent|externalResourcesRequired|fill|fillOpacity|fillRule|filter|filterRes|filterUnits|floodColor|floodOpacity|focusable|fontFamily|fontSize|fontSizeAdjust|fontStretch|fontStyle|fontVariant|fontWeight|format|from|fr|fx|fy|g1|g2|glyphName|glyphOrientationHorizontal|glyphOrientationVertical|glyphRef|gradientTransform|gradientUnits|hanging|horizAdvX|horizOriginX|ideographic|imageRendering|in|in2|intercept|k|k1|k2|k3|k4|kernelMatrix|kernelUnitLength|kerning|keyPoints|keySplines|keyTimes|lengthAdjust|letterSpacing|lightingColor|limitingConeAngle|local|markerEnd|markerMid|markerStart|markerHeight|markerUnits|markerWidth|mask|maskContentUnits|maskUnits|mathematical|mode|numOctaves|offset|opacity|operator|order|orient|orientation|origin|overflow|overlinePosition|overlineThickness|panose1|paintOrder|pathLength|patternContentUnits|patternTransform|patternUnits|pointerEvents|points|pointsAtX|pointsAtY|pointsAtZ|preserveAlpha|preserveAspectRatio|primitiveUnits|r|radius|refX|refY|renderingIntent|repeatCount|repeatDur|requiredExtensions|requiredFeatures|restart|result|rotate|rx|ry|scale|seed|shapeRendering|slope|spacing|specularConstant|specularExponent|speed|spreadMethod|startOffset|stdDeviation|stemh|stemv|stitchTiles|stopColor|stopOpacity|strikethroughPosition|strikethroughThickness|string|stroke|strokeDasharray|strokeDashoffset|strokeLinecap|strokeLinejoin|strokeMiterlimit|strokeOpacity|strokeWidth|surfaceScale|systemLanguage|tableValues|targetX|targetY|textAnchor|textDecoration|textRendering|textLength|to|transform|u1|u2|underlinePosition|underlineThickness|unicode|unicodeBidi|unicodeRange|unitsPerEm|vAlphabetic|vHanging|vIdeographic|vMathematical|values|vectorEffect|version|vertAdvY|vertOriginX|vertOriginY|viewBox|viewTarget|visibility|widths|wordSpacing|writingMode|x|xHeight|x1|x2|xChannelSelector|xlinkActuate|xlinkArcrole|xlinkHref|xlinkRole|xlinkShow|xlinkTitle|xlinkType|xmlBase|xmlns|xmlnsXlink|xmlLang|xmlSpace|y|y1|y2|yChannelSelector|z|zoomAndPan|for|class|autofocus)|(([Dd][Aa][Tt][Aa]|[Aa][Rr][Ii][Aa]|x)-.*))$/,Mte=R7(function(e){return Ite.test(e)||e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&e.charCodeAt(2)<91}),Nte=Mte,Dte=function(t){return t!=="theme"},sP=function(t){return typeof t=="string"&&t.charCodeAt(0)>96?Nte:Dte},aP=function(t,n,r){var i;if(n){var o=n.shouldForwardProp;i=t.__emotion_forwardProp&&o?function(s){return t.__emotion_forwardProp(s)&&o(s)}:o}return typeof i!="function"&&r&&(i=t.__emotion_forwardProp),i},Lte=function(t){var n=t.cache,r=t.serialized,i=t.isStringTag;return M7(n,r,i),CJ(function(){return N7(n,r,i)}),null},$te=function e(t,n){var r=t.__emotion_real===t,i=r&&t.__emotion_base||t,o,s;n!==void 0&&(o=n.label,s=n.target);var a=aP(t,n,r),l=a||sP(i),u=!l("as");return function(){var c=arguments,d=r&&t.__emotion_styles!==void 0?t.__emotion_styles.slice(0):[];if(o!==void 0&&d.push("label:"+o+";"),c[0]==null||c[0].raw===void 0)d.push.apply(d,c);else{d.push(c[0][0]);for(var f=c.length,h=1;ht=>{const{theme:n,css:r,__css:i,sx:o,...s}=t,a=K7(s,(d,f)=>qee(f)),l=hte(e,t),u=Rte({},i,l,Y7(a),o),c=Jee(u)(t.theme);return r?[c,r]:c};function FS(e,t){const{baseStyle:n,...r}=t??{};r.shouldForwardProp||(r.shouldForwardProp=Ote);const i=jte({baseStyle:n}),o=Bte(e,r)(i);return Ve.forwardRef(function(l,u){const{colorMode:c,forced:d}=S5();return Ve.createElement(o,{ref:u,"data-theme":d?c:void 0,...l})})}function Vte(){const e=new Map;return new Proxy(FS,{apply(t,n,r){return FS(...r)},get(t,n){return e.has(n)||e.set(n,FS(n)),e.get(n)}})}var ke=Vte();function Qe(e){return E.forwardRef(e)}var zte=(e,t)=>e.find(n=>n.id===t);function uP(e,t){const n=eM(e,t),r=n?e[n].findIndex(i=>i.id===t):-1;return{position:n,index:r}}function eM(e,t){for(const[n,r]of Object.entries(e))if(zte(r,t))return n}function Ute(e){const t=e.includes("right"),n=e.includes("left");let r="center";return t&&(r="flex-end"),n&&(r="flex-start"),{display:"flex",flexDirection:"column",alignItems:r}}function Gte(e){const n=e==="top"||e==="bottom"?"0 auto":void 0,r=e.includes("top")?"env(safe-area-inset-top, 0px)":void 0,i=e.includes("bottom")?"env(safe-area-inset-bottom, 0px)":void 0,o=e.includes("left")?void 0:"env(safe-area-inset-right, 0px)",s=e.includes("right")?void 0:"env(safe-area-inset-left, 0px)";return{position:"fixed",zIndex:"var(--toast-z-index, 5500)",pointerEvents:"none",display:"flex",flexDirection:"column",margin:n,top:r,bottom:i,right:o,left:s}}function Bn(e,t=[]){const n=E.useRef(e);return E.useEffect(()=>{n.current=e}),E.useCallback((...r)=>{var i;return(i=n.current)==null?void 0:i.call(n,...r)},t)}function Hte(e,t){const n=Bn(e);E.useEffect(()=>{if(t==null)return;let r=null;return r=window.setTimeout(()=>{n()},t),()=>{r&&window.clearTimeout(r)}},[t,n])}function xy(e,t){const n=E.useRef(!1),r=E.useRef(!1);E.useEffect(()=>{if(n.current&&r.current)return e();r.current=!0},t),E.useEffect(()=>(n.current=!0,()=>{n.current=!1}),[])}const tM=E.createContext({transformPagePoint:e=>e,isStatic:!1,reducedMotion:"never"}),Nv=E.createContext({}),dp=E.createContext(null),Dv=typeof document<"u",Cy=Dv?E.useLayoutEffect:E.useEffect,nM=E.createContext({strict:!1});function qte(e,t,n,r){const{visualElement:i}=E.useContext(Nv),o=E.useContext(nM),s=E.useContext(dp),a=E.useContext(tM).reducedMotion,l=E.useRef();r=r||o.renderer,!l.current&&r&&(l.current=r(e,{visualState:t,parent:i,props:n,presenceContext:s,blockInitialAnimation:s?s.initial===!1:!1,reducedMotionConfig:a}));const u=l.current;return E.useInsertionEffect(()=>{u&&u.update(n,s)}),Cy(()=>{u&&u.render()}),E.useEffect(()=>{u&&u.updateFeatures()}),(window.HandoffAppearAnimations?Cy:E.useEffect)(()=>{u&&u.animationState&&u.animationState.animateChanges()}),u}function $u(e){return typeof e=="object"&&Object.prototype.hasOwnProperty.call(e,"current")}function Wte(e,t,n){return E.useCallback(r=>{r&&e.mount&&e.mount(r),t&&(r?t.mount(r):t.unmount()),n&&(typeof n=="function"?n(r):$u(n)&&(n.current=r))},[t])}function ih(e){return typeof e=="string"||Array.isArray(e)}function Lv(e){return typeof e=="object"&&typeof e.start=="function"}const C5=["animate","whileInView","whileFocus","whileHover","whileTap","whileDrag","exit"],T5=["initial",...C5];function $v(e){return Lv(e.animate)||T5.some(t=>ih(e[t]))}function rM(e){return!!($v(e)||e.variants)}function Kte(e,t){if($v(e)){const{initial:n,animate:r}=e;return{initial:n===!1||ih(n)?n:void 0,animate:ih(r)?r:void 0}}return e.inherit!==!1?t:{}}function Yte(e){const{initial:t,animate:n}=Kte(e,E.useContext(Nv));return E.useMemo(()=>({initial:t,animate:n}),[cP(t),cP(n)])}function cP(e){return Array.isArray(e)?e.join(" "):e}const dP={animation:["animate","variants","whileHover","whileTap","exit","whileInView","whileFocus","whileDrag"],exit:["exit"],drag:["drag","dragControls"],focus:["whileFocus"],hover:["whileHover","onHoverStart","onHoverEnd"],tap:["whileTap","onTap","onTapStart","onTapCancel"],pan:["onPan","onPanStart","onPanSessionStart","onPanEnd"],inView:["whileInView","onViewportEnter","onViewportLeave"],layout:["layout","layoutId"]},oh={};for(const e in dP)oh[e]={isEnabled:t=>dP[e].some(n=>!!t[n])};function Xte(e){for(const t in e)oh[t]={...oh[t],...e[t]}}const E5=E.createContext({}),iM=E.createContext({}),Qte=Symbol.for("motionComponentSymbol");function Zte({preloadedFeatures:e,createVisualElement:t,useRender:n,useVisualState:r,Component:i}){e&&Xte(e);function o(a,l){let u;const c={...E.useContext(tM),...a,layoutId:Jte(a)},{isStatic:d}=c,f=Yte(a),h=r(a,d);if(!d&&Dv){f.visualElement=qte(i,h,c,t);const p=E.useContext(iM),m=E.useContext(nM).strict;f.visualElement&&(u=f.visualElement.loadFeatures(c,m,e,p))}return E.createElement(Nv.Provider,{value:f},u&&f.visualElement?E.createElement(u,{visualElement:f.visualElement,...c}):null,n(i,a,Wte(h,f.visualElement,l),h,d,f.visualElement))}const s=E.forwardRef(o);return s[Qte]=i,s}function Jte({layoutId:e}){const t=E.useContext(E5).id;return t&&e!==void 0?t+"-"+e:e}function ene(e){function t(r,i={}){return Zte(e(r,i))}if(typeof Proxy>"u")return t;const n=new Map;return new Proxy(t,{get:(r,i)=>(n.has(i)||n.set(i,t(i)),n.get(i))})}const tne=["animate","circle","defs","desc","ellipse","g","image","line","filter","marker","mask","metadata","path","pattern","polygon","polyline","rect","stop","switch","symbol","svg","text","tspan","use","view"];function P5(e){return typeof e!="string"||e.includes("-")?!1:!!(tne.indexOf(e)>-1||/[A-Z]/.test(e))}const Ty={};function nne(e){Object.assign(Ty,e)}const fp=["transformPerspective","x","y","z","translateX","translateY","translateZ","scale","scaleX","scaleY","rotate","rotateX","rotateY","rotateZ","skew","skewX","skewY"],Fl=new Set(fp);function oM(e,{layout:t,layoutId:n}){return Fl.has(e)||e.startsWith("origin")||(t||n!==void 0)&&(!!Ty[e]||e==="opacity")}const Ir=e=>!!(e&&e.getVelocity),rne={x:"translateX",y:"translateY",z:"translateZ",transformPerspective:"perspective"},ine=fp.length;function one(e,{enableHardwareAcceleration:t=!0,allowTransformNone:n=!0},r,i){let o="";for(let s=0;st=>typeof t=="string"&&t.startsWith(e),aM=sM("--"),pw=sM("var(--"),sne=/var\s*\(\s*--[\w-]+(\s*,\s*(?:(?:[^)(]|\((?:[^)(]+|\([^)(]*\))*\))*)+)?\s*\)/g,ane=(e,t)=>t&&typeof e=="number"?t.transform(e):e,ya=(e,t,n)=>Math.min(Math.max(n,e),t),Bl={test:e=>typeof e=="number",parse:parseFloat,transform:e=>e},hf={...Bl,transform:e=>ya(0,1,e)},hg={...Bl,default:1},pf=e=>Math.round(e*1e5)/1e5,Fv=/(-)?([\d]*\.?[\d])+/g,lM=/(#[0-9a-f]{3,8}|(rgb|hsl)a?\((-?[\d\.]+%?[,\s]+){2}(-?[\d\.]+%?)\s*[\,\/]?\s*[\d\.]*%?\))/gi,lne=/^(#[0-9a-f]{3,8}|(rgb|hsl)a?\((-?[\d\.]+%?[,\s]+){2}(-?[\d\.]+%?)\s*[\,\/]?\s*[\d\.]*%?\))$/i;function hp(e){return typeof e=="string"}const pp=e=>({test:t=>hp(t)&&t.endsWith(e)&&t.split(" ").length===1,parse:parseFloat,transform:t=>`${t}${e}`}),Ms=pp("deg"),bo=pp("%"),_e=pp("px"),une=pp("vh"),cne=pp("vw"),fP={...bo,parse:e=>bo.parse(e)/100,transform:e=>bo.transform(e*100)},hP={...Bl,transform:Math.round},uM={borderWidth:_e,borderTopWidth:_e,borderRightWidth:_e,borderBottomWidth:_e,borderLeftWidth:_e,borderRadius:_e,radius:_e,borderTopLeftRadius:_e,borderTopRightRadius:_e,borderBottomRightRadius:_e,borderBottomLeftRadius:_e,width:_e,maxWidth:_e,height:_e,maxHeight:_e,size:_e,top:_e,right:_e,bottom:_e,left:_e,padding:_e,paddingTop:_e,paddingRight:_e,paddingBottom:_e,paddingLeft:_e,margin:_e,marginTop:_e,marginRight:_e,marginBottom:_e,marginLeft:_e,rotate:Ms,rotateX:Ms,rotateY:Ms,rotateZ:Ms,scale:hg,scaleX:hg,scaleY:hg,scaleZ:hg,skew:Ms,skewX:Ms,skewY:Ms,distance:_e,translateX:_e,translateY:_e,translateZ:_e,x:_e,y:_e,z:_e,perspective:_e,transformPerspective:_e,opacity:hf,originX:fP,originY:fP,originZ:_e,zIndex:hP,fillOpacity:hf,strokeOpacity:hf,numOctaves:hP};function k5(e,t,n,r){const{style:i,vars:o,transform:s,transformOrigin:a}=e;let l=!1,u=!1,c=!0;for(const d in t){const f=t[d];if(aM(d)){o[d]=f;continue}const h=uM[d],p=ane(f,h);if(Fl.has(d)){if(l=!0,s[d]=p,!c)continue;f!==(h.default||0)&&(c=!1)}else d.startsWith("origin")?(u=!0,a[d]=p):i[d]=p}if(t.transform||(l||r?i.transform=one(e.transform,n,c,r):i.transform&&(i.transform="none")),u){const{originX:d="50%",originY:f="50%",originZ:h=0}=a;i.transformOrigin=`${d} ${f} ${h}`}}const A5=()=>({style:{},transform:{},transformOrigin:{},vars:{}});function cM(e,t,n){for(const r in t)!Ir(t[r])&&!oM(r,n)&&(e[r]=t[r])}function dne({transformTemplate:e},t,n){return E.useMemo(()=>{const r=A5();return k5(r,t,{enableHardwareAcceleration:!n},e),Object.assign({},r.vars,r.style)},[t])}function fne(e,t,n){const r=e.style||{},i={};return cM(i,r,e),Object.assign(i,dne(e,t,n)),e.transformValues?e.transformValues(i):i}function hne(e,t,n){const r={},i=fne(e,t,n);return e.drag&&e.dragListener!==!1&&(r.draggable=!1,i.userSelect=i.WebkitUserSelect=i.WebkitTouchCallout="none",i.touchAction=e.drag===!0?"none":`pan-${e.drag==="x"?"y":"x"}`),e.tabIndex===void 0&&(e.onTap||e.onTapStart||e.whileTap)&&(r.tabIndex=0),r.style=i,r}const pne=new Set(["animate","exit","variants","initial","style","values","variants","transition","transformTemplate","transformValues","custom","inherit","onLayoutAnimationStart","onLayoutAnimationComplete","onLayoutMeasure","onBeforeLayoutMeasure","onAnimationStart","onAnimationComplete","onUpdate","onDragStart","onDrag","onDragEnd","onMeasureDragConstraints","onDirectionLock","onDragTransitionEnd","_dragX","_dragY","onHoverStart","onHoverEnd","onViewportEnter","onViewportLeave","ignoreStrict","viewport"]);function Ey(e){return e.startsWith("while")||e.startsWith("drag")&&e!=="draggable"||e.startsWith("layout")||e.startsWith("onTap")||e.startsWith("onPan")||pne.has(e)}let dM=e=>!Ey(e);function gne(e){e&&(dM=t=>t.startsWith("on")?!Ey(t):e(t))}try{gne(require("@emotion/is-prop-valid").default)}catch{}function mne(e,t,n){const r={};for(const i in e)i==="values"&&typeof e.values=="object"||(dM(i)||n===!0&&Ey(i)||!t&&!Ey(i)||e.draggable&&i.startsWith("onDrag"))&&(r[i]=e[i]);return r}function pP(e,t,n){return typeof e=="string"?e:_e.transform(t+n*e)}function yne(e,t,n){const r=pP(t,e.x,e.width),i=pP(n,e.y,e.height);return`${r} ${i}`}const vne={offset:"stroke-dashoffset",array:"stroke-dasharray"},bne={offset:"strokeDashoffset",array:"strokeDasharray"};function Sne(e,t,n=1,r=0,i=!0){e.pathLength=1;const o=i?vne:bne;e[o.offset]=_e.transform(-r);const s=_e.transform(t),a=_e.transform(n);e[o.array]=`${s} ${a}`}function O5(e,{attrX:t,attrY:n,attrScale:r,originX:i,originY:o,pathLength:s,pathSpacing:a=1,pathOffset:l=0,...u},c,d,f){if(k5(e,u,c,f),d){e.style.viewBox&&(e.attrs.viewBox=e.style.viewBox);return}e.attrs=e.style,e.style={};const{attrs:h,style:p,dimensions:m}=e;h.transform&&(m&&(p.transform=h.transform),delete h.transform),m&&(i!==void 0||o!==void 0||p.transform)&&(p.transformOrigin=yne(m,i!==void 0?i:.5,o!==void 0?o:.5)),t!==void 0&&(h.x=t),n!==void 0&&(h.y=n),r!==void 0&&(h.scale=r),s!==void 0&&Sne(h,s,a,l,!1)}const fM=()=>({...A5(),attrs:{}}),R5=e=>typeof e=="string"&&e.toLowerCase()==="svg";function _ne(e,t,n,r){const i=E.useMemo(()=>{const o=fM();return O5(o,t,{enableHardwareAcceleration:!1},R5(r),e.transformTemplate),{...o.attrs,style:{...o.style}}},[t]);if(e.style){const o={};cM(o,e.style,e),i.style={...o,...i.style}}return i}function wne(e=!1){return(n,r,i,{latestValues:o},s)=>{const l=(P5(n)?_ne:hne)(r,o,s,n),c={...mne(r,typeof n=="string",e),...l,ref:i},{children:d}=r,f=E.useMemo(()=>Ir(d)?d.get():d,[d]);return E.createElement(n,{...c,children:f})}}const I5=e=>e.replace(/([a-z])([A-Z])/g,"$1-$2").toLowerCase();function hM(e,{style:t,vars:n},r,i){Object.assign(e.style,t,i&&i.getProjectionStyles(r));for(const o in n)e.style.setProperty(o,n[o])}const pM=new Set(["baseFrequency","diffuseConstant","kernelMatrix","kernelUnitLength","keySplines","keyTimes","limitingConeAngle","markerHeight","markerWidth","numOctaves","targetX","targetY","surfaceScale","specularConstant","specularExponent","stdDeviation","tableValues","viewBox","gradientTransform","pathLength","startOffset","textLength","lengthAdjust"]);function gM(e,t,n,r){hM(e,t,void 0,r);for(const i in t.attrs)e.setAttribute(pM.has(i)?i:I5(i),t.attrs[i])}function M5(e,t){const{style:n}=e,r={};for(const i in n)(Ir(n[i])||t.style&&Ir(t.style[i])||oM(i,e))&&(r[i]=n[i]);return r}function mM(e,t){const n=M5(e,t);for(const r in e)if(Ir(e[r])||Ir(t[r])){const i=fp.indexOf(r)!==-1?"attr"+r.charAt(0).toUpperCase()+r.substring(1):r;n[i]=e[r]}return n}function N5(e,t,n,r={},i={}){return typeof t=="function"&&(t=t(n!==void 0?n:e.custom,r,i)),typeof t=="string"&&(t=e.variants&&e.variants[t]),typeof t=="function"&&(t=t(n!==void 0?n:e.custom,r,i)),t}function yM(e){const t=E.useRef(null);return t.current===null&&(t.current=e()),t.current}const Py=e=>Array.isArray(e),xne=e=>!!(e&&typeof e=="object"&&e.mix&&e.toValue),Cne=e=>Py(e)?e[e.length-1]||0:e;function hm(e){const t=Ir(e)?e.get():e;return xne(t)?t.toValue():t}function Tne({scrapeMotionValuesFromProps:e,createRenderState:t,onMount:n},r,i,o){const s={latestValues:Ene(r,i,o,e),renderState:t()};return n&&(s.mount=a=>n(r,a,s)),s}const vM=e=>(t,n)=>{const r=E.useContext(Nv),i=E.useContext(dp),o=()=>Tne(e,t,r,i);return n?o():yM(o)};function Ene(e,t,n,r){const i={},o=r(e,{});for(const f in o)i[f]=hm(o[f]);let{initial:s,animate:a}=e;const l=$v(e),u=rM(e);t&&u&&!l&&e.inherit!==!1&&(s===void 0&&(s=t.initial),a===void 0&&(a=t.animate));let c=n?n.initial===!1:!1;c=c||s===!1;const d=c?a:s;return d&&typeof d!="boolean"&&!Lv(d)&&(Array.isArray(d)?d:[d]).forEach(h=>{const p=N5(e,h);if(!p)return;const{transitionEnd:m,transition:S,...v}=p;for(const y in v){let g=v[y];if(Array.isArray(g)){const b=c?g.length-1:0;g=g[b]}g!==null&&(i[y]=g)}for(const y in m)i[y]=m[y]}),i}const Pne={useVisualState:vM({scrapeMotionValuesFromProps:mM,createRenderState:fM,onMount:(e,t,{renderState:n,latestValues:r})=>{try{n.dimensions=typeof t.getBBox=="function"?t.getBBox():t.getBoundingClientRect()}catch{n.dimensions={x:0,y:0,width:0,height:0}}O5(n,r,{enableHardwareAcceleration:!1},R5(t.tagName),e.transformTemplate),gM(t,n)}})},kne={useVisualState:vM({scrapeMotionValuesFromProps:M5,createRenderState:A5})};function Ane(e,{forwardMotionProps:t=!1},n,r){return{...P5(e)?Pne:kne,preloadedFeatures:n,useRender:wne(t),createVisualElement:r,Component:e}}function es(e,t,n,r={passive:!0}){return e.addEventListener(t,n,r),()=>e.removeEventListener(t,n)}const bM=e=>e.pointerType==="mouse"?typeof e.button!="number"||e.button<=0:e.isPrimary!==!1;function Bv(e,t="page"){return{point:{x:e[t+"X"],y:e[t+"Y"]}}}const One=e=>t=>bM(t)&&e(t,Bv(t));function rs(e,t,n,r){return es(e,t,One(n),r)}const Rne=(e,t)=>n=>t(e(n)),sa=(...e)=>e.reduce(Rne);function SM(e){let t=null;return()=>{const n=()=>{t=null};return t===null?(t=e,n):!1}}const gP=SM("dragHorizontal"),mP=SM("dragVertical");function _M(e){let t=!1;if(e==="y")t=mP();else if(e==="x")t=gP();else{const n=gP(),r=mP();n&&r?t=()=>{n(),r()}:(n&&n(),r&&r())}return t}function wM(){const e=_M(!0);return e?(e(),!1):!0}class Oa{constructor(t){this.isMounted=!1,this.node=t}update(){}}const on=e=>e;function Ine(e){let t=[],n=[],r=0,i=!1,o=!1;const s=new WeakSet,a={schedule:(l,u=!1,c=!1)=>{const d=c&&i,f=d?t:n;return u&&s.add(l),f.indexOf(l)===-1&&(f.push(l),d&&i&&(r=t.length)),l},cancel:l=>{const u=n.indexOf(l);u!==-1&&n.splice(u,1),s.delete(l)},process:l=>{if(i){o=!0;return}if(i=!0,[t,n]=[n,t],n.length=0,r=t.length,r)for(let u=0;u(d[f]=Ine(()=>n=!0),d),{}),s=d=>o[d].process(i),a=d=>{n=!1,i.delta=r?1e3/60:Math.max(Math.min(d-i.timestamp,Mne),1),i.timestamp=d,i.isProcessing=!0,pg.forEach(s),i.isProcessing=!1,n&&t&&(r=!1,e(a))},l=()=>{n=!0,r=!0,i.isProcessing||e(a)};return{schedule:pg.reduce((d,f)=>{const h=o[f];return d[f]=(p,m=!1,S=!1)=>(n||l(),h.schedule(p,m,S)),d},{}),cancel:d=>pg.forEach(f=>o[f].cancel(d)),state:i,steps:o}}const{schedule:kt,cancel:hs,state:Xn,steps:BS}=Nne(typeof requestAnimationFrame<"u"?requestAnimationFrame:on,!0);function yP(e,t){const n="pointer"+(t?"enter":"leave"),r="onHover"+(t?"Start":"End"),i=(o,s)=>{if(o.type==="touch"||wM())return;const a=e.getProps();e.animationState&&a.whileHover&&e.animationState.setActive("whileHover",t),a[r]&&kt.update(()=>a[r](o,s))};return rs(e.current,n,i,{passive:!e.getProps()[r]})}class Dne extends Oa{mount(){this.unmount=sa(yP(this.node,!0),yP(this.node,!1))}unmount(){}}class Lne extends Oa{constructor(){super(...arguments),this.isActive=!1}onFocus(){let t=!1;try{t=this.node.current.matches(":focus-visible")}catch{t=!0}!t||!this.node.animationState||(this.node.animationState.setActive("whileFocus",!0),this.isActive=!0)}onBlur(){!this.isActive||!this.node.animationState||(this.node.animationState.setActive("whileFocus",!1),this.isActive=!1)}mount(){this.unmount=sa(es(this.node.current,"focus",()=>this.onFocus()),es(this.node.current,"blur",()=>this.onBlur()))}unmount(){}}const xM=(e,t)=>t?e===t?!0:xM(e,t.parentElement):!1;function jS(e,t){if(!t)return;const n=new PointerEvent("pointer"+e);t(n,Bv(n))}class $ne extends Oa{constructor(){super(...arguments),this.removeStartListeners=on,this.removeEndListeners=on,this.removeAccessibleListeners=on,this.startPointerPress=(t,n)=>{if(this.removeEndListeners(),this.isPressing)return;const r=this.node.getProps(),o=rs(window,"pointerup",(a,l)=>{if(!this.checkPressEnd())return;const{onTap:u,onTapCancel:c}=this.node.getProps();kt.update(()=>{xM(this.node.current,a.target)?u&&u(a,l):c&&c(a,l)})},{passive:!(r.onTap||r.onPointerUp)}),s=rs(window,"pointercancel",(a,l)=>this.cancelPress(a,l),{passive:!(r.onTapCancel||r.onPointerCancel)});this.removeEndListeners=sa(o,s),this.startPress(t,n)},this.startAccessiblePress=()=>{const t=o=>{if(o.key!=="Enter"||this.isPressing)return;const s=a=>{a.key!=="Enter"||!this.checkPressEnd()||jS("up",(l,u)=>{const{onTap:c}=this.node.getProps();c&&kt.update(()=>c(l,u))})};this.removeEndListeners(),this.removeEndListeners=es(this.node.current,"keyup",s),jS("down",(a,l)=>{this.startPress(a,l)})},n=es(this.node.current,"keydown",t),r=()=>{this.isPressing&&jS("cancel",(o,s)=>this.cancelPress(o,s))},i=es(this.node.current,"blur",r);this.removeAccessibleListeners=sa(n,i)}}startPress(t,n){this.isPressing=!0;const{onTapStart:r,whileTap:i}=this.node.getProps();i&&this.node.animationState&&this.node.animationState.setActive("whileTap",!0),r&&kt.update(()=>r(t,n))}checkPressEnd(){return this.removeEndListeners(),this.isPressing=!1,this.node.getProps().whileTap&&this.node.animationState&&this.node.animationState.setActive("whileTap",!1),!wM()}cancelPress(t,n){if(!this.checkPressEnd())return;const{onTapCancel:r}=this.node.getProps();r&&kt.update(()=>r(t,n))}mount(){const t=this.node.getProps(),n=rs(this.node.current,"pointerdown",this.startPointerPress,{passive:!(t.onTapStart||t.onPointerStart)}),r=es(this.node.current,"focus",this.startAccessiblePress);this.removeStartListeners=sa(n,r)}unmount(){this.removeStartListeners(),this.removeEndListeners(),this.removeAccessibleListeners()}}const gw=new WeakMap,VS=new WeakMap,Fne=e=>{const t=gw.get(e.target);t&&t(e)},Bne=e=>{e.forEach(Fne)};function jne({root:e,...t}){const n=e||document;VS.has(n)||VS.set(n,{});const r=VS.get(n),i=JSON.stringify(t);return r[i]||(r[i]=new IntersectionObserver(Bne,{root:e,...t})),r[i]}function Vne(e,t,n){const r=jne(t);return gw.set(e,n),r.observe(e),()=>{gw.delete(e),r.unobserve(e)}}const zne={some:0,all:1};class Une extends Oa{constructor(){super(...arguments),this.hasEnteredView=!1,this.isInView=!1}startObserver(){this.unmount();const{viewport:t={}}=this.node.getProps(),{root:n,margin:r,amount:i="some",once:o}=t,s={root:n?n.current:void 0,rootMargin:r,threshold:typeof i=="number"?i:zne[i]},a=l=>{const{isIntersecting:u}=l;if(this.isInView===u||(this.isInView=u,o&&!u&&this.hasEnteredView))return;u&&(this.hasEnteredView=!0),this.node.animationState&&this.node.animationState.setActive("whileInView",u);const{onViewportEnter:c,onViewportLeave:d}=this.node.getProps(),f=u?c:d;f&&f(l)};return Vne(this.node.current,s,a)}mount(){this.startObserver()}update(){if(typeof IntersectionObserver>"u")return;const{props:t,prevProps:n}=this.node;["amount","margin","root"].some(Gne(t,n))&&this.startObserver()}unmount(){}}function Gne({viewport:e={}},{viewport:t={}}={}){return n=>e[n]!==t[n]}const Hne={inView:{Feature:Une},tap:{Feature:$ne},focus:{Feature:Lne},hover:{Feature:Dne}};function CM(e,t){if(!Array.isArray(t))return!1;const n=t.length;if(n!==e.length)return!1;for(let r=0;rt[r]=n.get()),t}function Wne(e){const t={};return e.values.forEach((n,r)=>t[r]=n.getVelocity()),t}function jv(e,t,n){const r=e.getProps();return N5(r,t,n!==void 0?n:r.custom,qne(e),Wne(e))}const Kne="framerAppearId",Yne="data-"+I5(Kne);let Xne=on,D5=on;const aa=e=>e*1e3,is=e=>e/1e3,Qne={current:!1},TM=e=>Array.isArray(e)&&typeof e[0]=="number";function EM(e){return!!(!e||typeof e=="string"&&PM[e]||TM(e)||Array.isArray(e)&&e.every(EM))}const Kd=([e,t,n,r])=>`cubic-bezier(${e}, ${t}, ${n}, ${r})`,PM={linear:"linear",ease:"ease",easeIn:"ease-in",easeOut:"ease-out",easeInOut:"ease-in-out",circIn:Kd([0,.65,.55,1]),circOut:Kd([.55,0,1,.45]),backIn:Kd([.31,.01,.66,-.59]),backOut:Kd([.33,1.53,.69,.99])};function kM(e){if(e)return TM(e)?Kd(e):Array.isArray(e)?e.map(kM):PM[e]}function Zne(e,t,n,{delay:r=0,duration:i,repeat:o=0,repeatType:s="loop",ease:a,times:l}={}){const u={[t]:n};l&&(u.offset=l);const c=kM(a);return Array.isArray(c)&&(u.easing=c),e.animate(u,{delay:r,duration:i,easing:Array.isArray(c)?"linear":c,fill:"both",iterations:o+1,direction:s==="reverse"?"alternate":"normal"})}const vP={waapi:()=>Object.hasOwnProperty.call(Element.prototype,"animate")},zS={},AM={};for(const e in vP)AM[e]=()=>(zS[e]===void 0&&(zS[e]=vP[e]()),zS[e]);function Jne(e,{repeat:t,repeatType:n="loop"}){const r=t&&n!=="loop"&&t%2===1?0:e.length-1;return e[r]}const OM=(e,t,n)=>(((1-3*n+3*t)*e+(3*n-6*t))*e+3*t)*e,ere=1e-7,tre=12;function nre(e,t,n,r,i){let o,s,a=0;do s=t+(n-t)/2,o=OM(s,r,i)-e,o>0?n=s:t=s;while(Math.abs(o)>ere&&++anre(o,0,1,e,n);return o=>o===0||o===1?o:OM(i(o),t,r)}const rre=gp(.42,0,1,1),ire=gp(0,0,.58,1),RM=gp(.42,0,.58,1),ore=e=>Array.isArray(e)&&typeof e[0]!="number",IM=e=>t=>t<=.5?e(2*t)/2:(2-e(2*(1-t)))/2,MM=e=>t=>1-e(1-t),NM=e=>1-Math.sin(Math.acos(e)),L5=MM(NM),sre=IM(L5),DM=gp(.33,1.53,.69,.99),$5=MM(DM),are=IM($5),lre=e=>(e*=2)<1?.5*$5(e):.5*(2-Math.pow(2,-10*(e-1))),ure={linear:on,easeIn:rre,easeInOut:RM,easeOut:ire,circIn:NM,circInOut:sre,circOut:L5,backIn:$5,backInOut:are,backOut:DM,anticipate:lre},bP=e=>{if(Array.isArray(e)){D5(e.length===4);const[t,n,r,i]=e;return gp(t,n,r,i)}else if(typeof e=="string")return ure[e];return e},F5=(e,t)=>n=>!!(hp(n)&&lne.test(n)&&n.startsWith(e)||t&&Object.prototype.hasOwnProperty.call(n,t)),LM=(e,t,n)=>r=>{if(!hp(r))return r;const[i,o,s,a]=r.match(Fv);return{[e]:parseFloat(i),[t]:parseFloat(o),[n]:parseFloat(s),alpha:a!==void 0?parseFloat(a):1}},cre=e=>ya(0,255,e),US={...Bl,transform:e=>Math.round(cre(e))},nl={test:F5("rgb","red"),parse:LM("red","green","blue"),transform:({red:e,green:t,blue:n,alpha:r=1})=>"rgba("+US.transform(e)+", "+US.transform(t)+", "+US.transform(n)+", "+pf(hf.transform(r))+")"};function dre(e){let t="",n="",r="",i="";return e.length>5?(t=e.substring(1,3),n=e.substring(3,5),r=e.substring(5,7),i=e.substring(7,9)):(t=e.substring(1,2),n=e.substring(2,3),r=e.substring(3,4),i=e.substring(4,5),t+=t,n+=n,r+=r,i+=i),{red:parseInt(t,16),green:parseInt(n,16),blue:parseInt(r,16),alpha:i?parseInt(i,16)/255:1}}const mw={test:F5("#"),parse:dre,transform:nl.transform},Fu={test:F5("hsl","hue"),parse:LM("hue","saturation","lightness"),transform:({hue:e,saturation:t,lightness:n,alpha:r=1})=>"hsla("+Math.round(e)+", "+bo.transform(pf(t))+", "+bo.transform(pf(n))+", "+pf(hf.transform(r))+")"},ar={test:e=>nl.test(e)||mw.test(e)||Fu.test(e),parse:e=>nl.test(e)?nl.parse(e):Fu.test(e)?Fu.parse(e):mw.parse(e),transform:e=>hp(e)?e:e.hasOwnProperty("red")?nl.transform(e):Fu.transform(e)},Dt=(e,t,n)=>-n*e+n*t+e;function GS(e,t,n){return n<0&&(n+=1),n>1&&(n-=1),n<1/6?e+(t-e)*6*n:n<1/2?t:n<2/3?e+(t-e)*(2/3-n)*6:e}function fre({hue:e,saturation:t,lightness:n,alpha:r}){e/=360,t/=100,n/=100;let i=0,o=0,s=0;if(!t)i=o=s=n;else{const a=n<.5?n*(1+t):n+t-n*t,l=2*n-a;i=GS(l,a,e+1/3),o=GS(l,a,e),s=GS(l,a,e-1/3)}return{red:Math.round(i*255),green:Math.round(o*255),blue:Math.round(s*255),alpha:r}}const HS=(e,t,n)=>{const r=e*e;return Math.sqrt(Math.max(0,n*(t*t-r)+r))},hre=[mw,nl,Fu],pre=e=>hre.find(t=>t.test(e));function SP(e){const t=pre(e);let n=t.parse(e);return t===Fu&&(n=fre(n)),n}const $M=(e,t)=>{const n=SP(e),r=SP(t),i={...n};return o=>(i.red=HS(n.red,r.red,o),i.green=HS(n.green,r.green,o),i.blue=HS(n.blue,r.blue,o),i.alpha=Dt(n.alpha,r.alpha,o),nl.transform(i))};function gre(e){var t,n;return isNaN(e)&&hp(e)&&(((t=e.match(Fv))===null||t===void 0?void 0:t.length)||0)+(((n=e.match(lM))===null||n===void 0?void 0:n.length)||0)>0}const FM={regex:sne,countKey:"Vars",token:"${v}",parse:on},BM={regex:lM,countKey:"Colors",token:"${c}",parse:ar.parse},jM={regex:Fv,countKey:"Numbers",token:"${n}",parse:Bl.parse};function qS(e,{regex:t,countKey:n,token:r,parse:i}){const o=e.tokenised.match(t);o&&(e["num"+n]=o.length,e.tokenised=e.tokenised.replace(t,r),e.values.push(...o.map(i)))}function ky(e){const t=e.toString(),n={value:t,tokenised:t,values:[],numVars:0,numColors:0,numNumbers:0};return n.value.includes("var(--")&&qS(n,FM),qS(n,BM),qS(n,jM),n}function VM(e){return ky(e).values}function zM(e){const{values:t,numColors:n,numVars:r,tokenised:i}=ky(e),o=t.length;return s=>{let a=i;for(let l=0;ltypeof e=="number"?0:e;function yre(e){const t=VM(e);return zM(e)(t.map(mre))}const va={test:gre,parse:VM,createTransformer:zM,getAnimatableNone:yre},UM=(e,t)=>n=>`${n>0?t:e}`;function GM(e,t){return typeof e=="number"?n=>Dt(e,t,n):ar.test(e)?$M(e,t):e.startsWith("var(")?UM(e,t):qM(e,t)}const HM=(e,t)=>{const n=[...e],r=n.length,i=e.map((o,s)=>GM(o,t[s]));return o=>{for(let s=0;s{const n={...e,...t},r={};for(const i in n)e[i]!==void 0&&t[i]!==void 0&&(r[i]=GM(e[i],t[i]));return i=>{for(const o in r)n[o]=r[o](i);return n}},qM=(e,t)=>{const n=va.createTransformer(t),r=ky(e),i=ky(t);return r.numVars===i.numVars&&r.numColors===i.numColors&&r.numNumbers>=i.numNumbers?sa(HM(r.values,i.values),n):UM(e,t)},sh=(e,t,n)=>{const r=t-e;return r===0?1:(n-e)/r},_P=(e,t)=>n=>Dt(e,t,n);function bre(e){return typeof e=="number"?_P:typeof e=="string"?ar.test(e)?$M:qM:Array.isArray(e)?HM:typeof e=="object"?vre:_P}function Sre(e,t,n){const r=[],i=n||bre(e[0]),o=e.length-1;for(let s=0;st[0];e[0]>e[o-1]&&(e=[...e].reverse(),t=[...t].reverse());const s=Sre(t,r,i),a=s.length,l=u=>{let c=0;if(a>1)for(;cl(ya(e[0],e[o-1],u)):l}function _re(e,t){const n=e[e.length-1];for(let r=1;r<=t;r++){const i=sh(0,t,r);e.push(Dt(n,1,i))}}function wre(e){const t=[0];return _re(t,e.length-1),t}function xre(e,t){return e.map(n=>n*t)}function Cre(e,t){return e.map(()=>t||RM).splice(0,e.length-1)}function Ay({duration:e=300,keyframes:t,times:n,ease:r="easeInOut"}){const i=ore(r)?r.map(bP):bP(r),o={done:!1,value:t[0]},s=xre(n&&n.length===t.length?n:wre(t),e),a=WM(s,t,{ease:Array.isArray(i)?i:Cre(t,i)});return{calculatedDuration:e,next:l=>(o.value=a(l),o.done=l>=e,o)}}function KM(e,t){return t?e*(1e3/t):0}const Tre=5;function YM(e,t,n){const r=Math.max(t-Tre,0);return KM(n-e(r),t-r)}const WS=.001,Ere=.01,wP=10,Pre=.05,kre=1;function Are({duration:e=800,bounce:t=.25,velocity:n=0,mass:r=1}){let i,o;Xne(e<=aa(wP));let s=1-t;s=ya(Pre,kre,s),e=ya(Ere,wP,is(e)),s<1?(i=u=>{const c=u*s,d=c*e,f=c-n,h=yw(u,s),p=Math.exp(-d);return WS-f/h*p},o=u=>{const d=u*s*e,f=d*n+n,h=Math.pow(s,2)*Math.pow(u,2)*e,p=Math.exp(-d),m=yw(Math.pow(u,2),s);return(-i(u)+WS>0?-1:1)*((f-h)*p)/m}):(i=u=>{const c=Math.exp(-u*e),d=(u-n)*e+1;return-WS+c*d},o=u=>{const c=Math.exp(-u*e),d=(n-u)*(e*e);return c*d});const a=5/e,l=Rre(i,o,a);if(e=aa(e),isNaN(l))return{stiffness:100,damping:10,duration:e};{const u=Math.pow(l,2)*r;return{stiffness:u,damping:s*2*Math.sqrt(r*u),duration:e}}}const Ore=12;function Rre(e,t,n){let r=n;for(let i=1;ie[n]!==void 0)}function Nre(e){let t={velocity:0,stiffness:100,damping:10,mass:1,isResolvedFromDuration:!1,...e};if(!xP(e,Mre)&&xP(e,Ire)){const n=Are(e);t={...t,...n,velocity:0,mass:1},t.isResolvedFromDuration=!0}return t}function XM({keyframes:e,restDelta:t,restSpeed:n,...r}){const i=e[0],o=e[e.length-1],s={done:!1,value:i},{stiffness:a,damping:l,mass:u,velocity:c,duration:d,isResolvedFromDuration:f}=Nre(r),h=c?-is(c):0,p=l/(2*Math.sqrt(a*u)),m=o-i,S=is(Math.sqrt(a/u)),v=Math.abs(m)<5;n||(n=v?.01:2),t||(t=v?.005:.5);let y;if(p<1){const g=yw(S,p);y=b=>{const _=Math.exp(-p*S*b);return o-_*((h+p*S*m)/g*Math.sin(g*b)+m*Math.cos(g*b))}}else if(p===1)y=g=>o-Math.exp(-S*g)*(m+(h+S*m)*g);else{const g=S*Math.sqrt(p*p-1);y=b=>{const _=Math.exp(-p*S*b),w=Math.min(g*b,300);return o-_*((h+p*S*m)*Math.sinh(w)+g*m*Math.cosh(w))/g}}return{calculatedDuration:f&&d||null,next:g=>{const b=y(g);if(f)s.done=g>=d;else{let _=h;g!==0&&(p<1?_=YM(y,g,b):_=0);const w=Math.abs(_)<=n,x=Math.abs(o-b)<=t;s.done=w&&x}return s.value=s.done?o:b,s}}}function CP({keyframes:e,velocity:t=0,power:n=.8,timeConstant:r=325,bounceDamping:i=10,bounceStiffness:o=500,modifyTarget:s,min:a,max:l,restDelta:u=.5,restSpeed:c}){const d=e[0],f={done:!1,value:d},h=C=>a!==void 0&&Cl,p=C=>a===void 0?l:l===void 0||Math.abs(a-C)-m*Math.exp(-C/r),g=C=>v+y(C),b=C=>{const k=y(C),P=g(C);f.done=Math.abs(k)<=u,f.value=f.done?v:P};let _,w;const x=C=>{h(f.value)&&(_=C,w=XM({keyframes:[f.value,p(f.value)],velocity:YM(g,C,f.value),damping:i,stiffness:o,restDelta:u,restSpeed:c}))};return x(0),{calculatedDuration:null,next:C=>{let k=!1;return!w&&_===void 0&&(k=!0,b(C),x(C)),_!==void 0&&C>_?w.next(C-_):(!k&&b(C),f)}}}const Dre=e=>{const t=({timestamp:n})=>e(n);return{start:()=>kt.update(t,!0),stop:()=>hs(t),now:()=>Xn.isProcessing?Xn.timestamp:performance.now()}},TP=2e4;function EP(e){let t=0;const n=50;let r=e.next(t);for(;!r.done&&t=TP?1/0:t}const Lre={decay:CP,inertia:CP,tween:Ay,keyframes:Ay,spring:XM};function Oy({autoplay:e=!0,delay:t=0,driver:n=Dre,keyframes:r,type:i="keyframes",repeat:o=0,repeatDelay:s=0,repeatType:a="loop",onPlay:l,onStop:u,onComplete:c,onUpdate:d,...f}){let h=1,p=!1,m,S;const v=()=>{S=new Promise(V=>{m=V})};v();let y;const g=Lre[i]||Ay;let b;g!==Ay&&typeof r[0]!="number"&&(b=WM([0,100],r,{clamp:!1}),r=[0,100]);const _=g({...f,keyframes:r});let w;a==="mirror"&&(w=g({...f,keyframes:[...r].reverse(),velocity:-(f.velocity||0)}));let x="idle",C=null,k=null,P=null;_.calculatedDuration===null&&o&&(_.calculatedDuration=EP(_));const{calculatedDuration:A}=_;let $=1/0,N=1/0;A!==null&&($=A+s,N=$*(o+1)-s);let T=0;const O=V=>{if(k===null)return;h>0&&(k=Math.min(k,V)),h<0&&(k=Math.min(V-N/h,k)),C!==null?T=C:T=Math.round(V-k)*h;const z=T-t*(h>=0?1:-1),U=h>=0?z<0:z>N;T=Math.max(z,0),x==="finished"&&C===null&&(T=N);let K=T,W=_;if(o){const Q=T/$;let J=Math.floor(Q),ne=Q%1;!ne&&Q>=1&&(ne=1),ne===1&&J--,J=Math.min(J,o+1);const Z=!!(J%2);Z&&(a==="reverse"?(ne=1-ne,s&&(ne-=s/$)):a==="mirror"&&(W=w));let me=ya(0,1,ne);T>N&&(me=a==="reverse"&&Z?1:0),K=me*$}const X=U?{done:!1,value:r[0]}:W.next(K);b&&(X.value=b(X.value));let{done:F}=X;!U&&A!==null&&(F=h>=0?T>=N:T<=0);const q=C===null&&(x==="finished"||x==="running"&&F);return d&&d(X.value),q&&R(),X},I=()=>{y&&y.stop(),y=void 0},M=()=>{x="idle",I(),m(),v(),k=P=null},R=()=>{x="finished",c&&c(),I(),m()},D=()=>{if(p)return;y||(y=n(O));const V=y.now();l&&l(),C!==null?k=V-C:(!k||x==="finished")&&(k=V),x==="finished"&&v(),P=k,C=null,x="running",y.start()};e&&D();const L={then(V,z){return S.then(V,z)},get time(){return is(T)},set time(V){V=aa(V),T=V,C!==null||!y||h===0?C=V:k=y.now()-V/h},get duration(){const V=_.calculatedDuration===null?EP(_):_.calculatedDuration;return is(V)},get speed(){return h},set speed(V){V===h||!y||(h=V,L.time=is(T))},get state(){return x},play:D,pause:()=>{x="paused",C=T},stop:()=>{p=!0,x!=="idle"&&(x="idle",u&&u(),M())},cancel:()=>{P!==null&&O(P),M()},complete:()=>{x="finished"},sample:V=>(k=0,O(V))};return L}const $re=new Set(["opacity","clipPath","filter","transform","backgroundColor"]),gg=10,Fre=2e4,Bre=(e,t)=>t.type==="spring"||e==="backgroundColor"||!EM(t.ease);function jre(e,t,{onUpdate:n,onComplete:r,...i}){if(!(AM.waapi()&&$re.has(t)&&!i.repeatDelay&&i.repeatType!=="mirror"&&i.damping!==0&&i.type!=="inertia"))return!1;let s=!1,a,l;const u=()=>{l=new Promise(v=>{a=v})};u();let{keyframes:c,duration:d=300,ease:f,times:h}=i;if(Bre(t,i)){const v=Oy({...i,repeat:0,delay:0});let y={done:!1,value:c[0]};const g=[];let b=0;for(;!y.done&&bp.cancel(),S=()=>{kt.update(m),a(),u()};return p.onfinish=()=>{e.set(Jne(c,i)),r&&r(),S()},{then(v,y){return l.then(v,y)},get time(){return is(p.currentTime||0)},set time(v){p.currentTime=aa(v)},get speed(){return p.playbackRate},set speed(v){p.playbackRate=v},get duration(){return is(d)},play:()=>{s||(p.play(),hs(m))},pause:()=>p.pause(),stop:()=>{if(s=!0,p.playState==="idle")return;const{currentTime:v}=p;if(v){const y=Oy({...i,autoplay:!1});e.setWithVelocity(y.sample(v-gg).value,y.sample(v).value,gg)}S()},complete:()=>p.finish(),cancel:S}}function Vre({keyframes:e,delay:t,onUpdate:n,onComplete:r}){const i=()=>(n&&n(e[e.length-1]),r&&r(),{time:0,speed:1,duration:0,play:on,pause:on,stop:on,then:o=>(o(),Promise.resolve()),cancel:on,complete:on});return t?Oy({keyframes:[0,1],duration:0,delay:t,onComplete:i}):i()}const zre={type:"spring",stiffness:500,damping:25,restSpeed:10},Ure=e=>({type:"spring",stiffness:550,damping:e===0?2*Math.sqrt(550):30,restSpeed:10}),Gre={type:"keyframes",duration:.8},Hre={type:"keyframes",ease:[.25,.1,.35,1],duration:.3},qre=(e,{keyframes:t})=>t.length>2?Gre:Fl.has(e)?e.startsWith("scale")?Ure(t[1]):zre:Hre,vw=(e,t)=>e==="zIndex"?!1:!!(typeof t=="number"||Array.isArray(t)||typeof t=="string"&&(va.test(t)||t==="0")&&!t.startsWith("url(")),Wre=new Set(["brightness","contrast","saturate","opacity"]);function Kre(e){const[t,n]=e.slice(0,-1).split("(");if(t==="drop-shadow")return e;const[r]=n.match(Fv)||[];if(!r)return e;const i=n.replace(r,"");let o=Wre.has(t)?1:0;return r!==n&&(o*=100),t+"("+o+i+")"}const Yre=/([a-z-]*)\(.*?\)/g,bw={...va,getAnimatableNone:e=>{const t=e.match(Yre);return t?t.map(Kre).join(" "):e}},Xre={...uM,color:ar,backgroundColor:ar,outlineColor:ar,fill:ar,stroke:ar,borderColor:ar,borderTopColor:ar,borderRightColor:ar,borderBottomColor:ar,borderLeftColor:ar,filter:bw,WebkitFilter:bw},B5=e=>Xre[e];function QM(e,t){let n=B5(e);return n!==bw&&(n=va),n.getAnimatableNone?n.getAnimatableNone(t):void 0}const ZM=e=>/^0[^.\s]+$/.test(e);function Qre(e){if(typeof e=="number")return e===0;if(e!==null)return e==="none"||e==="0"||ZM(e)}function Zre(e,t,n,r){const i=vw(t,n);let o;Array.isArray(n)?o=[...n]:o=[null,n];const s=r.from!==void 0?r.from:e.get();let a;const l=[];for(let u=0;ui=>{const o=JM(r,e)||{},s=o.delay||r.delay||0;let{elapsed:a=0}=r;a=a-aa(s);const l=Zre(t,e,n,o),u=l[0],c=l[l.length-1],d=vw(e,u),f=vw(e,c);let h={keyframes:l,velocity:t.getVelocity(),ease:"easeOut",...o,delay:-a,onUpdate:p=>{t.set(p),o.onUpdate&&o.onUpdate(p)},onComplete:()=>{i(),o.onComplete&&o.onComplete()}};if(Jre(o)||(h={...h,...qre(e,h)}),h.duration&&(h.duration=aa(h.duration)),h.repeatDelay&&(h.repeatDelay=aa(h.repeatDelay)),!d||!f||Qne.current||o.type===!1)return Vre(h);if(t.owner&&t.owner.current instanceof HTMLElement&&!t.owner.getProps().onUpdate){const p=jre(t,e,h);if(p)return p}return Oy(h)};function Ry(e){return!!(Ir(e)&&e.add)}const eie=e=>/^\-?\d*\.?\d+$/.test(e);function V5(e,t){e.indexOf(t)===-1&&e.push(t)}function z5(e,t){const n=e.indexOf(t);n>-1&&e.splice(n,1)}class U5{constructor(){this.subscriptions=[]}add(t){return V5(this.subscriptions,t),()=>z5(this.subscriptions,t)}notify(t,n,r){const i=this.subscriptions.length;if(i)if(i===1)this.subscriptions[0](t,n,r);else for(let o=0;o!isNaN(parseFloat(e));class nie{constructor(t,n={}){this.version="10.12.22",this.timeDelta=0,this.lastUpdated=0,this.canTrackVelocity=!1,this.events={},this.updateAndNotify=(r,i=!0)=>{this.prev=this.current,this.current=r;const{delta:o,timestamp:s}=Xn;this.lastUpdated!==s&&(this.timeDelta=o,this.lastUpdated=s,kt.postRender(this.scheduleVelocityCheck)),this.prev!==this.current&&this.events.change&&this.events.change.notify(this.current),this.events.velocityChange&&this.events.velocityChange.notify(this.getVelocity()),i&&this.events.renderRequest&&this.events.renderRequest.notify(this.current)},this.scheduleVelocityCheck=()=>kt.postRender(this.velocityCheck),this.velocityCheck=({timestamp:r})=>{r!==this.lastUpdated&&(this.prev=this.current,this.events.velocityChange&&this.events.velocityChange.notify(this.getVelocity()))},this.hasAnimated=!1,this.prev=this.current=t,this.canTrackVelocity=tie(this.current),this.owner=n.owner}onChange(t){return this.on("change",t)}on(t,n){this.events[t]||(this.events[t]=new U5);const r=this.events[t].add(n);return t==="change"?()=>{r(),kt.read(()=>{this.events.change.getSize()||this.stop()})}:r}clearListeners(){for(const t in this.events)this.events[t].clear()}attach(t,n){this.passiveEffect=t,this.stopPassiveEffect=n}set(t,n=!0){!n||!this.passiveEffect?this.updateAndNotify(t,n):this.passiveEffect(t,this.updateAndNotify)}setWithVelocity(t,n,r){this.set(n),this.prev=t,this.timeDelta=r}jump(t){this.updateAndNotify(t),this.prev=t,this.stop(),this.stopPassiveEffect&&this.stopPassiveEffect()}get(){return this.current}getPrevious(){return this.prev}getVelocity(){return this.canTrackVelocity?KM(parseFloat(this.current)-parseFloat(this.prev),this.timeDelta):0}start(t){return this.stop(),new Promise(n=>{this.hasAnimated=!0,this.animation=t(n),this.events.animationStart&&this.events.animationStart.notify()}).then(()=>{this.events.animationComplete&&this.events.animationComplete.notify(),this.clearAnimation()})}stop(){this.animation&&(this.animation.stop(),this.events.animationCancel&&this.events.animationCancel.notify()),this.clearAnimation()}isAnimating(){return!!this.animation}clearAnimation(){delete this.animation}destroy(){this.clearListeners(),this.stop(),this.stopPassiveEffect&&this.stopPassiveEffect()}}function Ec(e,t){return new nie(e,t)}const eN=e=>t=>t.test(e),rie={test:e=>e==="auto",parse:e=>e},tN=[Bl,_e,bo,Ms,cne,une,rie],xd=e=>tN.find(eN(e)),iie=[...tN,ar,va],oie=e=>iie.find(eN(e));function sie(e,t,n){e.hasValue(t)?e.getValue(t).set(n):e.addValue(t,Ec(n))}function aie(e,t){const n=jv(e,t);let{transitionEnd:r={},transition:i={},...o}=n?e.makeTargetAnimatable(n,!1):{};o={...o,...r};for(const s in o){const a=Cne(o[s]);sie(e,s,a)}}function lie(e,t,n){var r,i;const o=Object.keys(t).filter(a=>!e.hasValue(a)),s=o.length;if(s)for(let a=0;al.remove(d))),u.push(m)}return s&&Promise.all(u).then(()=>{s&&aie(e,s)}),u}function Sw(e,t,n={}){const r=jv(e,t,n.custom);let{transition:i=e.getDefaultTransition()||{}}=r||{};n.transitionOverride&&(i=n.transitionOverride);const o=r?()=>Promise.all(nN(e,r,n)):()=>Promise.resolve(),s=e.variantChildren&&e.variantChildren.size?(l=0)=>{const{delayChildren:u=0,staggerChildren:c,staggerDirection:d}=i;return fie(e,t,u+l,c,d,n)}:()=>Promise.resolve(),{when:a}=i;if(a){const[l,u]=a==="beforeChildren"?[o,s]:[s,o];return l().then(()=>u())}else return Promise.all([o(),s(n.delay)])}function fie(e,t,n=0,r=0,i=1,o){const s=[],a=(e.variantChildren.size-1)*r,l=i===1?(u=0)=>u*r:(u=0)=>a-u*r;return Array.from(e.variantChildren).sort(hie).forEach((u,c)=>{u.notify("AnimationStart",t),s.push(Sw(u,t,{...o,delay:n+l(c)}).then(()=>u.notify("AnimationComplete",t)))}),Promise.all(s)}function hie(e,t){return e.sortNodePosition(t)}function pie(e,t,n={}){e.notify("AnimationStart",t);let r;if(Array.isArray(t)){const i=t.map(o=>Sw(e,o,n));r=Promise.all(i)}else if(typeof t=="string")r=Sw(e,t,n);else{const i=typeof t=="function"?jv(e,t,n.custom):t;r=Promise.all(nN(e,i,n))}return r.then(()=>e.notify("AnimationComplete",t))}const gie=[...C5].reverse(),mie=C5.length;function yie(e){return t=>Promise.all(t.map(({animation:n,options:r})=>pie(e,n,r)))}function vie(e){let t=yie(e);const n=Sie();let r=!0;const i=(l,u)=>{const c=jv(e,u);if(c){const{transition:d,transitionEnd:f,...h}=c;l={...l,...h,...f}}return l};function o(l){t=l(e)}function s(l,u){const c=e.getProps(),d=e.getVariantContext(!0)||{},f=[],h=new Set;let p={},m=1/0;for(let v=0;vm&&_;const P=Array.isArray(b)?b:[b];let A=P.reduce(i,{});w===!1&&(A={});const{prevResolvedValues:$={}}=g,N={...$,...A},T=O=>{k=!0,h.delete(O),g.needsAnimating[O]=!0};for(const O in N){const I=A[O],M=$[O];p.hasOwnProperty(O)||(I!==M?Py(I)&&Py(M)?!CM(I,M)||C?T(O):g.protectedKeys[O]=!0:I!==void 0?T(O):h.add(O):I!==void 0&&h.has(O)?T(O):g.protectedKeys[O]=!0)}g.prevProp=b,g.prevResolvedValues=A,g.isActive&&(p={...p,...A}),r&&e.blockInitialAnimation&&(k=!1),k&&!x&&f.push(...P.map(O=>({animation:O,options:{type:y,...l}})))}if(h.size){const v={};h.forEach(y=>{const g=e.getBaseTarget(y);g!==void 0&&(v[y]=g)}),f.push({animation:v})}let S=!!f.length;return r&&c.initial===!1&&!e.manuallyAnimateOnMount&&(S=!1),r=!1,S?t(f):Promise.resolve()}function a(l,u,c){var d;if(n[l].isActive===u)return Promise.resolve();(d=e.variantChildren)===null||d===void 0||d.forEach(h=>{var p;return(p=h.animationState)===null||p===void 0?void 0:p.setActive(l,u)}),n[l].isActive=u;const f=s(c,l);for(const h in n)n[h].protectedKeys={};return f}return{animateChanges:s,setActive:a,setAnimateFunction:o,getState:()=>n}}function bie(e,t){return typeof t=="string"?t!==e:Array.isArray(t)?!CM(t,e):!1}function ja(e=!1){return{isActive:e,protectedKeys:{},needsAnimating:{},prevResolvedValues:{}}}function Sie(){return{animate:ja(!0),whileInView:ja(),whileHover:ja(),whileTap:ja(),whileDrag:ja(),whileFocus:ja(),exit:ja()}}class _ie extends Oa{constructor(t){super(t),t.animationState||(t.animationState=vie(t))}updateAnimationControlsSubscription(){const{animate:t}=this.node.getProps();this.unmount(),Lv(t)&&(this.unmount=t.subscribe(this.node))}mount(){this.updateAnimationControlsSubscription()}update(){const{animate:t}=this.node.getProps(),{animate:n}=this.node.prevProps||{};t!==n&&this.updateAnimationControlsSubscription()}unmount(){}}let wie=0;class xie extends Oa{constructor(){super(...arguments),this.id=wie++}update(){if(!this.node.presenceContext)return;const{isPresent:t,onExitComplete:n,custom:r}=this.node.presenceContext,{isPresent:i}=this.node.prevPresenceContext||{};if(!this.node.animationState||t===i)return;const o=this.node.animationState.setActive("exit",!t,{custom:r??this.node.getProps().custom});n&&!t&&o.then(()=>n(this.id))}mount(){const{register:t}=this.node.presenceContext||{};t&&(this.unmount=t(this.id))}unmount(){}}const Cie={animation:{Feature:_ie},exit:{Feature:xie}},PP=(e,t)=>Math.abs(e-t);function Tie(e,t){const n=PP(e.x,t.x),r=PP(e.y,t.y);return Math.sqrt(n**2+r**2)}class rN{constructor(t,n,{transformPagePoint:r}={}){if(this.startEvent=null,this.lastMoveEvent=null,this.lastMoveEventInfo=null,this.handlers={},this.updatePoint=()=>{if(!(this.lastMoveEvent&&this.lastMoveEventInfo))return;const u=YS(this.lastMoveEventInfo,this.history),c=this.startEvent!==null,d=Tie(u.offset,{x:0,y:0})>=3;if(!c&&!d)return;const{point:f}=u,{timestamp:h}=Xn;this.history.push({...f,timestamp:h});const{onStart:p,onMove:m}=this.handlers;c||(p&&p(this.lastMoveEvent,u),this.startEvent=this.lastMoveEvent),m&&m(this.lastMoveEvent,u)},this.handlePointerMove=(u,c)=>{this.lastMoveEvent=u,this.lastMoveEventInfo=KS(c,this.transformPagePoint),kt.update(this.updatePoint,!0)},this.handlePointerUp=(u,c)=>{if(this.end(),!(this.lastMoveEvent&&this.lastMoveEventInfo))return;const{onEnd:d,onSessionEnd:f}=this.handlers,h=YS(u.type==="pointercancel"?this.lastMoveEventInfo:KS(c,this.transformPagePoint),this.history);this.startEvent&&d&&d(u,h),f&&f(u,h)},!bM(t))return;this.handlers=n,this.transformPagePoint=r;const i=Bv(t),o=KS(i,this.transformPagePoint),{point:s}=o,{timestamp:a}=Xn;this.history=[{...s,timestamp:a}];const{onSessionStart:l}=n;l&&l(t,YS(o,this.history)),this.removeListeners=sa(rs(window,"pointermove",this.handlePointerMove),rs(window,"pointerup",this.handlePointerUp),rs(window,"pointercancel",this.handlePointerUp))}updateHandlers(t){this.handlers=t}end(){this.removeListeners&&this.removeListeners(),hs(this.updatePoint)}}function KS(e,t){return t?{point:t(e.point)}:e}function kP(e,t){return{x:e.x-t.x,y:e.y-t.y}}function YS({point:e},t){return{point:e,delta:kP(e,iN(t)),offset:kP(e,Eie(t)),velocity:Pie(t,.1)}}function Eie(e){return e[0]}function iN(e){return e[e.length-1]}function Pie(e,t){if(e.length<2)return{x:0,y:0};let n=e.length-1,r=null;const i=iN(e);for(;n>=0&&(r=e[n],!(i.timestamp-r.timestamp>aa(t)));)n--;if(!r)return{x:0,y:0};const o=is(i.timestamp-r.timestamp);if(o===0)return{x:0,y:0};const s={x:(i.x-r.x)/o,y:(i.y-r.y)/o};return s.x===1/0&&(s.x=0),s.y===1/0&&(s.y=0),s}function Gr(e){return e.max-e.min}function _w(e,t=0,n=.01){return Math.abs(e-t)<=n}function AP(e,t,n,r=.5){e.origin=r,e.originPoint=Dt(t.min,t.max,e.origin),e.scale=Gr(n)/Gr(t),(_w(e.scale,1,1e-4)||isNaN(e.scale))&&(e.scale=1),e.translate=Dt(n.min,n.max,e.origin)-e.originPoint,(_w(e.translate)||isNaN(e.translate))&&(e.translate=0)}function gf(e,t,n,r){AP(e.x,t.x,n.x,r?r.originX:void 0),AP(e.y,t.y,n.y,r?r.originY:void 0)}function OP(e,t,n){e.min=n.min+t.min,e.max=e.min+Gr(t)}function kie(e,t,n){OP(e.x,t.x,n.x),OP(e.y,t.y,n.y)}function RP(e,t,n){e.min=t.min-n.min,e.max=e.min+Gr(t)}function mf(e,t,n){RP(e.x,t.x,n.x),RP(e.y,t.y,n.y)}function Aie(e,{min:t,max:n},r){return t!==void 0&&en&&(e=r?Dt(n,e,r.max):Math.min(e,n)),e}function IP(e,t,n){return{min:t!==void 0?e.min+t:void 0,max:n!==void 0?e.max+n-(e.max-e.min):void 0}}function Oie(e,{top:t,left:n,bottom:r,right:i}){return{x:IP(e.x,n,i),y:IP(e.y,t,r)}}function MP(e,t){let n=t.min-e.min,r=t.max-e.max;return t.max-t.minr?n=sh(t.min,t.max-r,e.min):r>i&&(n=sh(e.min,e.max-i,t.min)),ya(0,1,n)}function Mie(e,t){const n={};return t.min!==void 0&&(n.min=t.min-e.min),t.max!==void 0&&(n.max=t.max-e.min),n}const ww=.35;function Nie(e=ww){return e===!1?e=0:e===!0&&(e=ww),{x:NP(e,"left","right"),y:NP(e,"top","bottom")}}function NP(e,t,n){return{min:DP(e,t),max:DP(e,n)}}function DP(e,t){return typeof e=="number"?e:e[t]||0}const LP=()=>({translate:0,scale:1,origin:0,originPoint:0}),Bu=()=>({x:LP(),y:LP()}),$P=()=>({min:0,max:0}),en=()=>({x:$P(),y:$P()});function Yi(e){return[e("x"),e("y")]}function oN({top:e,left:t,right:n,bottom:r}){return{x:{min:t,max:n},y:{min:e,max:r}}}function Die({x:e,y:t}){return{top:t.min,right:e.max,bottom:t.max,left:e.min}}function Lie(e,t){if(!t)return e;const n=t({x:e.left,y:e.top}),r=t({x:e.right,y:e.bottom});return{top:n.y,left:n.x,bottom:r.y,right:r.x}}function XS(e){return e===void 0||e===1}function xw({scale:e,scaleX:t,scaleY:n}){return!XS(e)||!XS(t)||!XS(n)}function Wa(e){return xw(e)||sN(e)||e.z||e.rotate||e.rotateX||e.rotateY}function sN(e){return FP(e.x)||FP(e.y)}function FP(e){return e&&e!=="0%"}function Iy(e,t,n){const r=e-n,i=t*r;return n+i}function BP(e,t,n,r,i){return i!==void 0&&(e=Iy(e,i,r)),Iy(e,n,r)+t}function Cw(e,t=0,n=1,r,i){e.min=BP(e.min,t,n,r,i),e.max=BP(e.max,t,n,r,i)}function aN(e,{x:t,y:n}){Cw(e.x,t.translate,t.scale,t.originPoint),Cw(e.y,n.translate,n.scale,n.originPoint)}function $ie(e,t,n,r=!1){const i=n.length;if(!i)return;t.x=t.y=1;let o,s;for(let a=0;a1.0000000000001||e<.999999999999?e:1}function Bs(e,t){e.min=e.min+t,e.max=e.max+t}function VP(e,t,[n,r,i]){const o=t[i]!==void 0?t[i]:.5,s=Dt(e.min,e.max,o);Cw(e,t[n],t[r],s,t.scale)}const Fie=["x","scaleX","originX"],Bie=["y","scaleY","originY"];function ju(e,t){VP(e.x,t,Fie),VP(e.y,t,Bie)}function lN(e,t){return oN(Lie(e.getBoundingClientRect(),t))}function jie(e,t,n){const r=lN(e,n),{scroll:i}=t;return i&&(Bs(r.x,i.offset.x),Bs(r.y,i.offset.y)),r}const Vie=new WeakMap;class zie{constructor(t){this.openGlobalLock=null,this.isDragging=!1,this.currentDirection=null,this.originPoint={x:0,y:0},this.constraints=!1,this.hasMutatedConstraints=!1,this.elastic=en(),this.visualElement=t}start(t,{snapToCursor:n=!1}={}){const{presenceContext:r}=this.visualElement;if(r&&r.isPresent===!1)return;const i=l=>{this.stopAnimation(),n&&this.snapToCursor(Bv(l,"page").point)},o=(l,u)=>{const{drag:c,dragPropagation:d,onDragStart:f}=this.getProps();if(c&&!d&&(this.openGlobalLock&&this.openGlobalLock(),this.openGlobalLock=_M(c),!this.openGlobalLock))return;this.isDragging=!0,this.currentDirection=null,this.resolveConstraints(),this.visualElement.projection&&(this.visualElement.projection.isAnimationBlocked=!0,this.visualElement.projection.target=void 0),Yi(p=>{let m=this.getAxisMotionValue(p).get()||0;if(bo.test(m)){const{projection:S}=this.visualElement;if(S&&S.layout){const v=S.layout.layoutBox[p];v&&(m=Gr(v)*(parseFloat(m)/100))}}this.originPoint[p]=m}),f&&kt.update(()=>f(l,u),!1,!0);const{animationState:h}=this.visualElement;h&&h.setActive("whileDrag",!0)},s=(l,u)=>{const{dragPropagation:c,dragDirectionLock:d,onDirectionLock:f,onDrag:h}=this.getProps();if(!c&&!this.openGlobalLock)return;const{offset:p}=u;if(d&&this.currentDirection===null){this.currentDirection=Uie(p),this.currentDirection!==null&&f&&f(this.currentDirection);return}this.updateAxis("x",u.point,p),this.updateAxis("y",u.point,p),this.visualElement.render(),h&&h(l,u)},a=(l,u)=>this.stop(l,u);this.panSession=new rN(t,{onSessionStart:i,onStart:o,onMove:s,onSessionEnd:a},{transformPagePoint:this.visualElement.getTransformPagePoint()})}stop(t,n){const r=this.isDragging;if(this.cancel(),!r)return;const{velocity:i}=n;this.startAnimation(i);const{onDragEnd:o}=this.getProps();o&&kt.update(()=>o(t,n))}cancel(){this.isDragging=!1;const{projection:t,animationState:n}=this.visualElement;t&&(t.isAnimationBlocked=!1),this.panSession&&this.panSession.end(),this.panSession=void 0;const{dragPropagation:r}=this.getProps();!r&&this.openGlobalLock&&(this.openGlobalLock(),this.openGlobalLock=null),n&&n.setActive("whileDrag",!1)}updateAxis(t,n,r){const{drag:i}=this.getProps();if(!r||!mg(t,i,this.currentDirection))return;const o=this.getAxisMotionValue(t);let s=this.originPoint[t]+r[t];this.constraints&&this.constraints[t]&&(s=Aie(s,this.constraints[t],this.elastic[t])),o.set(s)}resolveConstraints(){const{dragConstraints:t,dragElastic:n}=this.getProps(),{layout:r}=this.visualElement.projection||{},i=this.constraints;t&&$u(t)?this.constraints||(this.constraints=this.resolveRefConstraints()):t&&r?this.constraints=Oie(r.layoutBox,t):this.constraints=!1,this.elastic=Nie(n),i!==this.constraints&&r&&this.constraints&&!this.hasMutatedConstraints&&Yi(o=>{this.getAxisMotionValue(o)&&(this.constraints[o]=Mie(r.layoutBox[o],this.constraints[o]))})}resolveRefConstraints(){const{dragConstraints:t,onMeasureDragConstraints:n}=this.getProps();if(!t||!$u(t))return!1;const r=t.current,{projection:i}=this.visualElement;if(!i||!i.layout)return!1;const o=jie(r,i.root,this.visualElement.getTransformPagePoint());let s=Rie(i.layout.layoutBox,o);if(n){const a=n(Die(s));this.hasMutatedConstraints=!!a,a&&(s=oN(a))}return s}startAnimation(t){const{drag:n,dragMomentum:r,dragElastic:i,dragTransition:o,dragSnapToOrigin:s,onDragTransitionEnd:a}=this.getProps(),l=this.constraints||{},u=Yi(c=>{if(!mg(c,n,this.currentDirection))return;let d=l&&l[c]||{};s&&(d={min:0,max:0});const f=i?200:1e6,h=i?40:1e7,p={type:"inertia",velocity:r?t[c]:0,bounceStiffness:f,bounceDamping:h,timeConstant:750,restDelta:1,restSpeed:10,...o,...d};return this.startAxisValueAnimation(c,p)});return Promise.all(u).then(a)}startAxisValueAnimation(t,n){const r=this.getAxisMotionValue(t);return r.start(j5(t,r,0,n))}stopAnimation(){Yi(t=>this.getAxisMotionValue(t).stop())}getAxisMotionValue(t){const n="_drag"+t.toUpperCase(),r=this.visualElement.getProps(),i=r[n];return i||this.visualElement.getValue(t,(r.initial?r.initial[t]:void 0)||0)}snapToCursor(t){Yi(n=>{const{drag:r}=this.getProps();if(!mg(n,r,this.currentDirection))return;const{projection:i}=this.visualElement,o=this.getAxisMotionValue(n);if(i&&i.layout){const{min:s,max:a}=i.layout.layoutBox[n];o.set(t[n]-Dt(s,a,.5))}})}scalePositionWithinConstraints(){if(!this.visualElement.current)return;const{drag:t,dragConstraints:n}=this.getProps(),{projection:r}=this.visualElement;if(!$u(n)||!r||!this.constraints)return;this.stopAnimation();const i={x:0,y:0};Yi(s=>{const a=this.getAxisMotionValue(s);if(a){const l=a.get();i[s]=Iie({min:l,max:l},this.constraints[s])}});const{transformTemplate:o}=this.visualElement.getProps();this.visualElement.current.style.transform=o?o({},""):"none",r.root&&r.root.updateScroll(),r.updateLayout(),this.resolveConstraints(),Yi(s=>{if(!mg(s,t,null))return;const a=this.getAxisMotionValue(s),{min:l,max:u}=this.constraints[s];a.set(Dt(l,u,i[s]))})}addListeners(){if(!this.visualElement.current)return;Vie.set(this.visualElement,this);const t=this.visualElement.current,n=rs(t,"pointerdown",l=>{const{drag:u,dragListener:c=!0}=this.getProps();u&&c&&this.start(l)}),r=()=>{const{dragConstraints:l}=this.getProps();$u(l)&&(this.constraints=this.resolveRefConstraints())},{projection:i}=this.visualElement,o=i.addEventListener("measure",r);i&&!i.layout&&(i.root&&i.root.updateScroll(),i.updateLayout()),r();const s=es(window,"resize",()=>this.scalePositionWithinConstraints()),a=i.addEventListener("didUpdate",({delta:l,hasLayoutChanged:u})=>{this.isDragging&&u&&(Yi(c=>{const d=this.getAxisMotionValue(c);d&&(this.originPoint[c]+=l[c].translate,d.set(d.get()+l[c].translate))}),this.visualElement.render())});return()=>{s(),n(),o(),a&&a()}}getProps(){const t=this.visualElement.getProps(),{drag:n=!1,dragDirectionLock:r=!1,dragPropagation:i=!1,dragConstraints:o=!1,dragElastic:s=ww,dragMomentum:a=!0}=t;return{...t,drag:n,dragDirectionLock:r,dragPropagation:i,dragConstraints:o,dragElastic:s,dragMomentum:a}}}function mg(e,t,n){return(t===!0||t===e)&&(n===null||n===e)}function Uie(e,t=10){let n=null;return Math.abs(e.y)>t?n="y":Math.abs(e.x)>t&&(n="x"),n}class Gie extends Oa{constructor(t){super(t),this.removeGroupControls=on,this.removeListeners=on,this.controls=new zie(t)}mount(){const{dragControls:t}=this.node.getProps();t&&(this.removeGroupControls=t.subscribe(this.controls)),this.removeListeners=this.controls.addListeners()||on}unmount(){this.removeGroupControls(),this.removeListeners()}}const zP=e=>(t,n)=>{e&&kt.update(()=>e(t,n))};class Hie extends Oa{constructor(){super(...arguments),this.removePointerDownListener=on}onPointerDown(t){this.session=new rN(t,this.createPanHandlers(),{transformPagePoint:this.node.getTransformPagePoint()})}createPanHandlers(){const{onPanSessionStart:t,onPanStart:n,onPan:r,onPanEnd:i}=this.node.getProps();return{onSessionStart:zP(t),onStart:zP(n),onMove:r,onEnd:(o,s)=>{delete this.session,i&&kt.update(()=>i(o,s))}}}mount(){this.removePointerDownListener=rs(this.node.current,"pointerdown",t=>this.onPointerDown(t))}update(){this.session&&this.session.updateHandlers(this.createPanHandlers())}unmount(){this.removePointerDownListener(),this.session&&this.session.end()}}function qie(){const e=E.useContext(dp);if(e===null)return[!0,null];const{isPresent:t,onExitComplete:n,register:r}=e,i=E.useId();return E.useEffect(()=>r(i),[]),!t&&n?[!1,()=>n&&n(i)]:[!0]}function Wie(){return Kie(E.useContext(dp))}function Kie(e){return e===null?!0:e.isPresent}const pm={hasAnimatedSinceResize:!0,hasEverUpdated:!1};function UP(e,t){return t.max===t.min?0:e/(t.max-t.min)*100}const Cd={correct:(e,t)=>{if(!t.target)return e;if(typeof e=="string")if(_e.test(e))e=parseFloat(e);else return e;const n=UP(e,t.target.x),r=UP(e,t.target.y);return`${n}% ${r}%`}},Yie={correct:(e,{treeScale:t,projectionDelta:n})=>{const r=e,i=va.parse(e);if(i.length>5)return r;const o=va.createTransformer(e),s=typeof i[0]!="number"?1:0,a=n.x.scale*t.x,l=n.y.scale*t.y;i[0+s]/=a,i[1+s]/=l;const u=Dt(a,l,.5);return typeof i[2+s]=="number"&&(i[2+s]/=u),typeof i[3+s]=="number"&&(i[3+s]/=u),o(i)}};class Xie extends Ve.Component{componentDidMount(){const{visualElement:t,layoutGroup:n,switchLayoutGroup:r,layoutId:i}=this.props,{projection:o}=t;nne(Qie),o&&(n.group&&n.group.add(o),r&&r.register&&i&&r.register(o),o.root.didUpdate(),o.addEventListener("animationComplete",()=>{this.safeToRemove()}),o.setOptions({...o.options,onExitComplete:()=>this.safeToRemove()})),pm.hasEverUpdated=!0}getSnapshotBeforeUpdate(t){const{layoutDependency:n,visualElement:r,drag:i,isPresent:o}=this.props,s=r.projection;return s&&(s.isPresent=o,i||t.layoutDependency!==n||n===void 0?s.willUpdate():this.safeToRemove(),t.isPresent!==o&&(o?s.promote():s.relegate()||kt.postRender(()=>{const a=s.getStack();(!a||!a.members.length)&&this.safeToRemove()}))),null}componentDidUpdate(){const{projection:t}=this.props.visualElement;t&&(t.root.didUpdate(),queueMicrotask(()=>{!t.currentAnimation&&t.isLead()&&this.safeToRemove()}))}componentWillUnmount(){const{visualElement:t,layoutGroup:n,switchLayoutGroup:r}=this.props,{projection:i}=t;i&&(i.scheduleCheckAfterUnmount(),n&&n.group&&n.group.remove(i),r&&r.deregister&&r.deregister(i))}safeToRemove(){const{safeToRemove:t}=this.props;t&&t()}render(){return null}}function uN(e){const[t,n]=qie(),r=E.useContext(E5);return Ve.createElement(Xie,{...e,layoutGroup:r,switchLayoutGroup:E.useContext(iM),isPresent:t,safeToRemove:n})}const Qie={borderRadius:{...Cd,applyTo:["borderTopLeftRadius","borderTopRightRadius","borderBottomLeftRadius","borderBottomRightRadius"]},borderTopLeftRadius:Cd,borderTopRightRadius:Cd,borderBottomLeftRadius:Cd,borderBottomRightRadius:Cd,boxShadow:Yie},cN=["TopLeft","TopRight","BottomLeft","BottomRight"],Zie=cN.length,GP=e=>typeof e=="string"?parseFloat(e):e,HP=e=>typeof e=="number"||_e.test(e);function Jie(e,t,n,r,i,o){i?(e.opacity=Dt(0,n.opacity!==void 0?n.opacity:1,eoe(r)),e.opacityExit=Dt(t.opacity!==void 0?t.opacity:1,0,toe(r))):o&&(e.opacity=Dt(t.opacity!==void 0?t.opacity:1,n.opacity!==void 0?n.opacity:1,r));for(let s=0;srt?1:n(sh(e,t,r))}function WP(e,t){e.min=t.min,e.max=t.max}function Jr(e,t){WP(e.x,t.x),WP(e.y,t.y)}function KP(e,t,n,r,i){return e-=t,e=Iy(e,1/n,r),i!==void 0&&(e=Iy(e,1/i,r)),e}function noe(e,t=0,n=1,r=.5,i,o=e,s=e){if(bo.test(t)&&(t=parseFloat(t),t=Dt(s.min,s.max,t/100)-s.min),typeof t!="number")return;let a=Dt(o.min,o.max,r);e===o&&(a-=t),e.min=KP(e.min,t,n,a,i),e.max=KP(e.max,t,n,a,i)}function YP(e,t,[n,r,i],o,s){noe(e,t[n],t[r],t[i],t.scale,o,s)}const roe=["x","scaleX","originX"],ioe=["y","scaleY","originY"];function XP(e,t,n,r){YP(e.x,t,roe,n?n.x:void 0,r?r.x:void 0),YP(e.y,t,ioe,n?n.y:void 0,r?r.y:void 0)}function QP(e){return e.translate===0&&e.scale===1}function fN(e){return QP(e.x)&&QP(e.y)}function Tw(e,t){return e.x.min===t.x.min&&e.x.max===t.x.max&&e.y.min===t.y.min&&e.y.max===t.y.max}function ZP(e){return Gr(e.x)/Gr(e.y)}class ooe{constructor(){this.members=[]}add(t){V5(this.members,t),t.scheduleRender()}remove(t){if(z5(this.members,t),t===this.prevLead&&(this.prevLead=void 0),t===this.lead){const n=this.members[this.members.length-1];n&&this.promote(n)}}relegate(t){const n=this.members.findIndex(i=>t===i);if(n===0)return!1;let r;for(let i=n;i>=0;i--){const o=this.members[i];if(o.isPresent!==!1){r=o;break}}return r?(this.promote(r),!0):!1}promote(t,n){const r=this.lead;if(t!==r&&(this.prevLead=r,this.lead=t,t.show(),r)){r.instance&&r.scheduleRender(),t.scheduleRender(),t.resumeFrom=r,n&&(t.resumeFrom.preserveOpacity=!0),r.snapshot&&(t.snapshot=r.snapshot,t.snapshot.latestValues=r.animationValues||r.latestValues),t.root&&t.root.isUpdating&&(t.isLayoutDirty=!0);const{crossfade:i}=t.options;i===!1&&r.hide()}}exitAnimationComplete(){this.members.forEach(t=>{const{options:n,resumingFrom:r}=t;n.onExitComplete&&n.onExitComplete(),r&&r.options.onExitComplete&&r.options.onExitComplete()})}scheduleRender(){this.members.forEach(t=>{t.instance&&t.scheduleRender(!1)})}removeLeadSnapshot(){this.lead&&this.lead.snapshot&&(this.lead.snapshot=void 0)}}function JP(e,t,n){let r="";const i=e.x.translate/t.x,o=e.y.translate/t.y;if((i||o)&&(r=`translate3d(${i}px, ${o}px, 0) `),(t.x!==1||t.y!==1)&&(r+=`scale(${1/t.x}, ${1/t.y}) `),n){const{rotate:l,rotateX:u,rotateY:c}=n;l&&(r+=`rotate(${l}deg) `),u&&(r+=`rotateX(${u}deg) `),c&&(r+=`rotateY(${c}deg) `)}const s=e.x.scale*t.x,a=e.y.scale*t.y;return(s!==1||a!==1)&&(r+=`scale(${s}, ${a})`),r||"none"}const soe=(e,t)=>e.depth-t.depth;class aoe{constructor(){this.children=[],this.isDirty=!1}add(t){V5(this.children,t),this.isDirty=!0}remove(t){z5(this.children,t),this.isDirty=!0}forEach(t){this.isDirty&&this.children.sort(soe),this.isDirty=!1,this.children.forEach(t)}}function loe(e,t){const n=performance.now(),r=({timestamp:i})=>{const o=i-n;o>=t&&(hs(r),e(o-t))};return kt.read(r,!0),()=>hs(r)}function uoe(e){window.MotionDebug&&window.MotionDebug.record(e)}function coe(e){return e instanceof SVGElement&&e.tagName!=="svg"}function doe(e,t,n){const r=Ir(e)?e:Ec(e);return r.start(j5("",r,t,n)),r.animation}const e6=["","X","Y","Z"],t6=1e3;let foe=0;const Ka={type:"projectionFrame",totalNodes:0,resolvedTargetDeltas:0,recalculatedProjection:0};function hN({attachResizeListener:e,defaultParent:t,measureScroll:n,checkIsScrollRoot:r,resetTransform:i}){return class{constructor(s={},a=t==null?void 0:t()){this.id=foe++,this.animationId=0,this.children=new Set,this.options={},this.isTreeAnimating=!1,this.isAnimationBlocked=!1,this.isLayoutDirty=!1,this.isProjectionDirty=!1,this.isSharedProjectionDirty=!1,this.isTransformDirty=!1,this.updateManuallyBlocked=!1,this.updateBlockedByResize=!1,this.isUpdating=!1,this.isSVG=!1,this.needsReset=!1,this.shouldResetTransform=!1,this.treeScale={x:1,y:1},this.eventHandlers=new Map,this.hasTreeAnimated=!1,this.updateScheduled=!1,this.checkUpdateFailed=()=>{this.isUpdating&&(this.isUpdating=!1,this.clearAllSnapshots())},this.updateProjection=()=>{Ka.totalNodes=Ka.resolvedTargetDeltas=Ka.recalculatedProjection=0,this.nodes.forEach(goe),this.nodes.forEach(Soe),this.nodes.forEach(_oe),this.nodes.forEach(moe),uoe(Ka)},this.hasProjected=!1,this.isVisible=!0,this.animationProgress=0,this.sharedNodes=new Map,this.latestValues=s,this.root=a?a.root||a:this,this.path=a?[...a.path,a]:[],this.parent=a,this.depth=a?a.depth+1:0;for(let l=0;lthis.root.updateBlockedByResize=!1;e(s,()=>{this.root.updateBlockedByResize=!0,d&&d(),d=loe(f,250),pm.hasAnimatedSinceResize&&(pm.hasAnimatedSinceResize=!1,this.nodes.forEach(r6))})}l&&this.root.registerSharedNode(l,this),this.options.animate!==!1&&c&&(l||u)&&this.addEventListener("didUpdate",({delta:d,hasLayoutChanged:f,hasRelativeTargetChanged:h,layout:p})=>{if(this.isTreeAnimationBlocked()){this.target=void 0,this.relativeTarget=void 0;return}const m=this.options.transition||c.getDefaultTransition()||Eoe,{onLayoutAnimationStart:S,onLayoutAnimationComplete:v}=c.getProps(),y=!this.targetLayout||!Tw(this.targetLayout,p)||h,g=!f&&h;if(this.options.layoutRoot||this.resumeFrom&&this.resumeFrom.instance||g||f&&(y||!this.currentAnimation)){this.resumeFrom&&(this.resumingFrom=this.resumeFrom,this.resumingFrom.resumingFrom=void 0),this.setAnimationOrigin(d,g);const b={...JM(m,"layout"),onPlay:S,onComplete:v};(c.shouldReduceMotion||this.options.layoutRoot)&&(b.delay=0,b.type=!1),this.startAnimation(b)}else f||r6(this),this.isLead()&&this.options.onExitComplete&&this.options.onExitComplete();this.targetLayout=p})}unmount(){this.options.layoutId&&this.willUpdate(),this.root.nodes.remove(this);const s=this.getStack();s&&s.remove(this),this.parent&&this.parent.children.delete(this),this.instance=void 0,hs(this.updateProjection)}blockUpdate(){this.updateManuallyBlocked=!0}unblockUpdate(){this.updateManuallyBlocked=!1}isUpdateBlocked(){return this.updateManuallyBlocked||this.updateBlockedByResize}isTreeAnimationBlocked(){return this.isAnimationBlocked||this.parent&&this.parent.isTreeAnimationBlocked()||!1}startUpdate(){this.isUpdateBlocked()||(this.isUpdating=!0,this.nodes&&this.nodes.forEach(woe),this.animationId++)}getTransformTemplate(){const{visualElement:s}=this.options;return s&&s.getProps().transformTemplate}willUpdate(s=!0){if(this.root.hasTreeAnimated=!0,this.root.isUpdateBlocked()){this.options.onExitComplete&&this.options.onExitComplete();return}if(!this.root.isUpdating&&this.root.startUpdate(),this.isLayoutDirty)return;this.isLayoutDirty=!0;for(let c=0;cthis.update()))}clearAllSnapshots(){this.nodes.forEach(yoe),this.sharedNodes.forEach(xoe)}scheduleUpdateProjection(){kt.preRender(this.updateProjection,!1,!0)}scheduleCheckAfterUnmount(){kt.postRender(()=>{this.isLayoutDirty?this.root.didUpdate():this.root.checkUpdateFailed()})}updateSnapshot(){this.snapshot||!this.instance||(this.snapshot=this.measure())}updateLayout(){if(!this.instance||(this.updateScroll(),!(this.options.alwaysMeasureLayout&&this.isLead())&&!this.isLayoutDirty))return;if(this.resumeFrom&&!this.resumeFrom.instance)for(let l=0;l{const _=b/1e3;i6(d.x,s.x,_),i6(d.y,s.y,_),this.setTargetDelta(d),this.relativeTarget&&this.relativeTargetOrigin&&this.layout&&this.relativeParent&&this.relativeParent.layout&&(mf(f,this.layout.layoutBox,this.relativeParent.layout.layoutBox),Coe(this.relativeTarget,this.relativeTargetOrigin,f,_),g&&Tw(this.relativeTarget,g)&&(this.isProjectionDirty=!1),g||(g=en()),Jr(g,this.relativeTarget)),m&&(this.animationValues=c,Jie(c,u,this.latestValues,_,y,v)),this.root.scheduleUpdateProjection(),this.scheduleRender(),this.animationProgress=_},this.mixTargetDelta(this.options.layoutRoot?1e3:0)}startAnimation(s){this.notifyListeners("animationStart"),this.currentAnimation&&this.currentAnimation.stop(),this.resumingFrom&&this.resumingFrom.currentAnimation&&this.resumingFrom.currentAnimation.stop(),this.pendingAnimation&&(hs(this.pendingAnimation),this.pendingAnimation=void 0),this.pendingAnimation=kt.update(()=>{pm.hasAnimatedSinceResize=!0,this.currentAnimation=doe(0,t6,{...s,onUpdate:a=>{this.mixTargetDelta(a),s.onUpdate&&s.onUpdate(a)},onComplete:()=>{s.onComplete&&s.onComplete(),this.completeAnimation()}}),this.resumingFrom&&(this.resumingFrom.currentAnimation=this.currentAnimation),this.pendingAnimation=void 0})}completeAnimation(){this.resumingFrom&&(this.resumingFrom.currentAnimation=void 0,this.resumingFrom.preserveOpacity=void 0);const s=this.getStack();s&&s.exitAnimationComplete(),this.resumingFrom=this.currentAnimation=this.animationValues=void 0,this.notifyListeners("animationComplete")}finishAnimation(){this.currentAnimation&&(this.mixTargetDelta&&this.mixTargetDelta(t6),this.currentAnimation.stop()),this.completeAnimation()}applyTransformsToTarget(){const s=this.getLead();let{targetWithTransforms:a,target:l,layout:u,latestValues:c}=s;if(!(!a||!l||!u)){if(this!==s&&this.layout&&u&&pN(this.options.animationType,this.layout.layoutBox,u.layoutBox)){l=this.target||en();const d=Gr(this.layout.layoutBox.x);l.x.min=s.target.x.min,l.x.max=l.x.min+d;const f=Gr(this.layout.layoutBox.y);l.y.min=s.target.y.min,l.y.max=l.y.min+f}Jr(a,l),ju(a,c),gf(this.projectionDeltaWithTransform,this.layoutCorrected,a,c)}}registerSharedNode(s,a){this.sharedNodes.has(s)||this.sharedNodes.set(s,new ooe),this.sharedNodes.get(s).add(a);const u=a.options.initialPromotionConfig;a.promote({transition:u?u.transition:void 0,preserveFollowOpacity:u&&u.shouldPreserveFollowOpacity?u.shouldPreserveFollowOpacity(a):void 0})}isLead(){const s=this.getStack();return s?s.lead===this:!0}getLead(){var s;const{layoutId:a}=this.options;return a?((s=this.getStack())===null||s===void 0?void 0:s.lead)||this:this}getPrevLead(){var s;const{layoutId:a}=this.options;return a?(s=this.getStack())===null||s===void 0?void 0:s.prevLead:void 0}getStack(){const{layoutId:s}=this.options;if(s)return this.root.sharedNodes.get(s)}promote({needsReset:s,transition:a,preserveFollowOpacity:l}={}){const u=this.getStack();u&&u.promote(this,l),s&&(this.projectionDelta=void 0,this.needsReset=!0),a&&this.setOptions({transition:a})}relegate(){const s=this.getStack();return s?s.relegate(this):!1}resetRotation(){const{visualElement:s}=this.options;if(!s)return;let a=!1;const{latestValues:l}=s;if((l.rotate||l.rotateX||l.rotateY||l.rotateZ)&&(a=!0),!a)return;const u={};for(let c=0;c{var a;return(a=s.currentAnimation)===null||a===void 0?void 0:a.stop()}),this.root.nodes.forEach(n6),this.root.sharedNodes.clear()}}}function hoe(e){e.updateLayout()}function poe(e){var t;const n=((t=e.resumeFrom)===null||t===void 0?void 0:t.snapshot)||e.snapshot;if(e.isLead()&&e.layout&&n&&e.hasListeners("didUpdate")){const{layoutBox:r,measuredBox:i}=e.layout,{animationType:o}=e.options,s=n.source!==e.layout.source;o==="size"?Yi(d=>{const f=s?n.measuredBox[d]:n.layoutBox[d],h=Gr(f);f.min=r[d].min,f.max=f.min+h}):pN(o,n.layoutBox,r)&&Yi(d=>{const f=s?n.measuredBox[d]:n.layoutBox[d],h=Gr(r[d]);f.max=f.min+h,e.relativeTarget&&!e.currentAnimation&&(e.isProjectionDirty=!0,e.relativeTarget[d].max=e.relativeTarget[d].min+h)});const a=Bu();gf(a,r,n.layoutBox);const l=Bu();s?gf(l,e.applyTransform(i,!0),n.measuredBox):gf(l,r,n.layoutBox);const u=!fN(a);let c=!1;if(!e.resumeFrom){const d=e.getClosestProjectingParent();if(d&&!d.resumeFrom){const{snapshot:f,layout:h}=d;if(f&&h){const p=en();mf(p,n.layoutBox,f.layoutBox);const m=en();mf(m,r,h.layoutBox),Tw(p,m)||(c=!0),d.options.layoutRoot&&(e.relativeTarget=m,e.relativeTargetOrigin=p,e.relativeParent=d)}}}e.notifyListeners("didUpdate",{layout:r,snapshot:n,delta:l,layoutDelta:a,hasLayoutChanged:u,hasRelativeTargetChanged:c})}else if(e.isLead()){const{onExitComplete:r}=e.options;r&&r()}e.options.transition=void 0}function goe(e){Ka.totalNodes++,e.parent&&(e.isProjecting()||(e.isProjectionDirty=e.parent.isProjectionDirty),e.isSharedProjectionDirty||(e.isSharedProjectionDirty=!!(e.isProjectionDirty||e.parent.isProjectionDirty||e.parent.isSharedProjectionDirty)),e.isTransformDirty||(e.isTransformDirty=e.parent.isTransformDirty))}function moe(e){e.isProjectionDirty=e.isSharedProjectionDirty=e.isTransformDirty=!1}function yoe(e){e.clearSnapshot()}function n6(e){e.clearMeasurements()}function voe(e){e.isLayoutDirty=!1}function boe(e){const{visualElement:t}=e.options;t&&t.getProps().onBeforeLayoutMeasure&&t.notify("BeforeLayoutMeasure"),e.resetTransform()}function r6(e){e.finishAnimation(),e.targetDelta=e.relativeTarget=e.target=void 0,e.isProjectionDirty=!0}function Soe(e){e.resolveTargetDelta()}function _oe(e){e.calcProjection()}function woe(e){e.resetRotation()}function xoe(e){e.removeLeadSnapshot()}function i6(e,t,n){e.translate=Dt(t.translate,0,n),e.scale=Dt(t.scale,1,n),e.origin=t.origin,e.originPoint=t.originPoint}function o6(e,t,n,r){e.min=Dt(t.min,n.min,r),e.max=Dt(t.max,n.max,r)}function Coe(e,t,n,r){o6(e.x,t.x,n.x,r),o6(e.y,t.y,n.y,r)}function Toe(e){return e.animationValues&&e.animationValues.opacityExit!==void 0}const Eoe={duration:.45,ease:[.4,0,.1,1]};function s6(e){e.min=Math.round(e.min*2)/2,e.max=Math.round(e.max*2)/2}function Poe(e){s6(e.x),s6(e.y)}function pN(e,t,n){return e==="position"||e==="preserve-aspect"&&!_w(ZP(t),ZP(n),.2)}const koe=hN({attachResizeListener:(e,t)=>es(e,"resize",t),measureScroll:()=>({x:document.documentElement.scrollLeft||document.body.scrollLeft,y:document.documentElement.scrollTop||document.body.scrollTop}),checkIsScrollRoot:()=>!0}),QS={current:void 0},gN=hN({measureScroll:e=>({x:e.scrollLeft,y:e.scrollTop}),defaultParent:()=>{if(!QS.current){const e=new koe({});e.mount(window),e.setOptions({layoutScroll:!0}),QS.current=e}return QS.current},resetTransform:(e,t)=>{e.style.transform=t!==void 0?t:"none"},checkIsScrollRoot:e=>window.getComputedStyle(e).position==="fixed"}),Aoe={pan:{Feature:Hie},drag:{Feature:Gie,ProjectionNode:gN,MeasureLayout:uN}},Ooe=/var\((--[a-zA-Z0-9-_]+),? ?([a-zA-Z0-9 ()%#.,-]+)?\)/;function Roe(e){const t=Ooe.exec(e);if(!t)return[,];const[,n,r]=t;return[n,r]}function Ew(e,t,n=1){const[r,i]=Roe(e);if(!r)return;const o=window.getComputedStyle(t).getPropertyValue(r);return o?o.trim():pw(i)?Ew(i,t,n+1):i}function Ioe(e,{...t},n){const r=e.current;if(!(r instanceof Element))return{target:t,transitionEnd:n};n&&(n={...n}),e.values.forEach(i=>{const o=i.get();if(!pw(o))return;const s=Ew(o,r);s&&i.set(s)});for(const i in t){const o=t[i];if(!pw(o))continue;const s=Ew(o,r);s&&(t[i]=s,n||(n={}),n[i]===void 0&&(n[i]=o))}return{target:t,transitionEnd:n}}const Moe=new Set(["width","height","top","left","right","bottom","x","y","translateX","translateY"]),mN=e=>Moe.has(e),Noe=e=>Object.keys(e).some(mN),a6=e=>e===Bl||e===_e,l6=(e,t)=>parseFloat(e.split(", ")[t]),u6=(e,t)=>(n,{transform:r})=>{if(r==="none"||!r)return 0;const i=r.match(/^matrix3d\((.+)\)$/);if(i)return l6(i[1],t);{const o=r.match(/^matrix\((.+)\)$/);return o?l6(o[1],e):0}},Doe=new Set(["x","y","z"]),Loe=fp.filter(e=>!Doe.has(e));function $oe(e){const t=[];return Loe.forEach(n=>{const r=e.getValue(n);r!==void 0&&(t.push([n,r.get()]),r.set(n.startsWith("scale")?1:0))}),t.length&&e.render(),t}const Pc={width:({x:e},{paddingLeft:t="0",paddingRight:n="0"})=>e.max-e.min-parseFloat(t)-parseFloat(n),height:({y:e},{paddingTop:t="0",paddingBottom:n="0"})=>e.max-e.min-parseFloat(t)-parseFloat(n),top:(e,{top:t})=>parseFloat(t),left:(e,{left:t})=>parseFloat(t),bottom:({y:e},{top:t})=>parseFloat(t)+(e.max-e.min),right:({x:e},{left:t})=>parseFloat(t)+(e.max-e.min),x:u6(4,13),y:u6(5,14)};Pc.translateX=Pc.x;Pc.translateY=Pc.y;const Foe=(e,t,n)=>{const r=t.measureViewportBox(),i=t.current,o=getComputedStyle(i),{display:s}=o,a={};s==="none"&&t.setStaticValue("display",e.display||"block"),n.forEach(u=>{a[u]=Pc[u](r,o)}),t.render();const l=t.measureViewportBox();return n.forEach(u=>{const c=t.getValue(u);c&&c.jump(a[u]),e[u]=Pc[u](l,o)}),e},Boe=(e,t,n={},r={})=>{t={...t},r={...r};const i=Object.keys(t).filter(mN);let o=[],s=!1;const a=[];if(i.forEach(l=>{const u=e.getValue(l);if(!e.hasValue(l))return;let c=n[l],d=xd(c);const f=t[l];let h;if(Py(f)){const p=f.length,m=f[0]===null?1:0;c=f[m],d=xd(c);for(let S=m;S=0?window.pageYOffset:null,u=Foe(t,e,a);return o.length&&o.forEach(([c,d])=>{e.getValue(c).set(d)}),e.render(),Dv&&l!==null&&window.scrollTo({top:l}),{target:u,transitionEnd:r}}else return{target:t,transitionEnd:r}};function joe(e,t,n,r){return Noe(t)?Boe(e,t,n,r):{target:t,transitionEnd:r}}const Voe=(e,t,n,r)=>{const i=Ioe(e,t,r);return t=i.target,r=i.transitionEnd,joe(e,t,n,r)},Pw={current:null},yN={current:!1};function zoe(){if(yN.current=!0,!!Dv)if(window.matchMedia){const e=window.matchMedia("(prefers-reduced-motion)"),t=()=>Pw.current=e.matches;e.addListener(t),t()}else Pw.current=!1}function Uoe(e,t,n){const{willChange:r}=t;for(const i in t){const o=t[i],s=n[i];if(Ir(o))e.addValue(i,o),Ry(r)&&r.add(i);else if(Ir(s))e.addValue(i,Ec(o,{owner:e})),Ry(r)&&r.remove(i);else if(s!==o)if(e.hasValue(i)){const a=e.getValue(i);!a.hasAnimated&&a.set(o)}else{const a=e.getStaticValue(i);e.addValue(i,Ec(a!==void 0?a:o,{owner:e}))}}for(const i in n)t[i]===void 0&&e.removeValue(i);return t}const c6=new WeakMap,vN=Object.keys(oh),Goe=vN.length,d6=["AnimationStart","AnimationComplete","Update","BeforeLayoutMeasure","LayoutMeasure","LayoutAnimationStart","LayoutAnimationComplete"],Hoe=T5.length;class qoe{constructor({parent:t,props:n,presenceContext:r,reducedMotionConfig:i,visualState:o},s={}){this.current=null,this.children=new Set,this.isVariantNode=!1,this.isControllingVariants=!1,this.shouldReduceMotion=null,this.values=new Map,this.features={},this.valueSubscriptions=new Map,this.prevMotionValues={},this.events={},this.propEventSubscriptions={},this.notifyUpdate=()=>this.notify("Update",this.latestValues),this.render=()=>{this.current&&(this.triggerBuild(),this.renderInstance(this.current,this.renderState,this.props.style,this.projection))},this.scheduleRender=()=>kt.render(this.render,!1,!0);const{latestValues:a,renderState:l}=o;this.latestValues=a,this.baseTarget={...a},this.initialValues=n.initial?{...a}:{},this.renderState=l,this.parent=t,this.props=n,this.presenceContext=r,this.depth=t?t.depth+1:0,this.reducedMotionConfig=i,this.options=s,this.isControllingVariants=$v(n),this.isVariantNode=rM(n),this.isVariantNode&&(this.variantChildren=new Set),this.manuallyAnimateOnMount=!!(t&&t.current);const{willChange:u,...c}=this.scrapeMotionValuesFromProps(n,{});for(const d in c){const f=c[d];a[d]!==void 0&&Ir(f)&&(f.set(a[d],!1),Ry(u)&&u.add(d))}}scrapeMotionValuesFromProps(t,n){return{}}mount(t){this.current=t,c6.set(t,this),this.projection&&!this.projection.instance&&this.projection.mount(t),this.parent&&this.isVariantNode&&!this.isControllingVariants&&(this.removeFromVariantTree=this.parent.addVariantChild(this)),this.values.forEach((n,r)=>this.bindToMotionValue(r,n)),yN.current||zoe(),this.shouldReduceMotion=this.reducedMotionConfig==="never"?!1:this.reducedMotionConfig==="always"?!0:Pw.current,this.parent&&this.parent.children.add(this),this.update(this.props,this.presenceContext)}unmount(){c6.delete(this.current),this.projection&&this.projection.unmount(),hs(this.notifyUpdate),hs(this.render),this.valueSubscriptions.forEach(t=>t()),this.removeFromVariantTree&&this.removeFromVariantTree(),this.parent&&this.parent.children.delete(this);for(const t in this.events)this.events[t].clear();for(const t in this.features)this.features[t].unmount();this.current=null}bindToMotionValue(t,n){const r=Fl.has(t),i=n.on("change",s=>{this.latestValues[t]=s,this.props.onUpdate&&kt.update(this.notifyUpdate,!1,!0),r&&this.projection&&(this.projection.isTransformDirty=!0)}),o=n.on("renderRequest",this.scheduleRender);this.valueSubscriptions.set(t,()=>{i(),o()})}sortNodePosition(t){return!this.current||!this.sortInstanceNodePosition||this.type!==t.type?0:this.sortInstanceNodePosition(this.current,t.current)}loadFeatures({children:t,...n},r,i,o){let s,a;for(let l=0;lthis.scheduleRender(),animationType:typeof u=="string"?u:"both",initialPromotionConfig:o,layoutScroll:f,layoutRoot:h})}return a}updateFeatures(){for(const t in this.features){const n=this.features[t];n.isMounted?n.update():(n.mount(),n.isMounted=!0)}}triggerBuild(){this.build(this.renderState,this.latestValues,this.options,this.props)}measureViewportBox(){return this.current?this.measureInstanceViewportBox(this.current,this.props):en()}getStaticValue(t){return this.latestValues[t]}setStaticValue(t,n){this.latestValues[t]=n}makeTargetAnimatable(t,n=!0){return this.makeTargetAnimatableFromInstance(t,this.props,n)}update(t,n){(t.transformTemplate||this.props.transformTemplate)&&this.scheduleRender(),this.prevProps=this.props,this.props=t,this.prevPresenceContext=this.presenceContext,this.presenceContext=n;for(let r=0;rn.variantChildren.delete(t)}addValue(t,n){n!==this.values.get(t)&&(this.removeValue(t),this.bindToMotionValue(t,n)),this.values.set(t,n),this.latestValues[t]=n.get()}removeValue(t){this.values.delete(t);const n=this.valueSubscriptions.get(t);n&&(n(),this.valueSubscriptions.delete(t)),delete this.latestValues[t],this.removeValueFromRenderState(t,this.renderState)}hasValue(t){return this.values.has(t)}getValue(t,n){if(this.props.values&&this.props.values[t])return this.props.values[t];let r=this.values.get(t);return r===void 0&&n!==void 0&&(r=Ec(n,{owner:this}),this.addValue(t,r)),r}readValue(t){var n;return this.latestValues[t]!==void 0||!this.current?this.latestValues[t]:(n=this.getBaseTargetFromProps(this.props,t))!==null&&n!==void 0?n:this.readValueFromInstance(this.current,t,this.options)}setBaseTarget(t,n){this.baseTarget[t]=n}getBaseTarget(t){var n;const{initial:r}=this.props,i=typeof r=="string"||typeof r=="object"?(n=N5(this.props,r))===null||n===void 0?void 0:n[t]:void 0;if(r&&i!==void 0)return i;const o=this.getBaseTargetFromProps(this.props,t);return o!==void 0&&!Ir(o)?o:this.initialValues[t]!==void 0&&i===void 0?void 0:this.baseTarget[t]}on(t,n){return this.events[t]||(this.events[t]=new U5),this.events[t].add(n)}notify(t,...n){this.events[t]&&this.events[t].notify(...n)}}class bN extends qoe{sortInstanceNodePosition(t,n){return t.compareDocumentPosition(n)&2?1:-1}getBaseTargetFromProps(t,n){return t.style?t.style[n]:void 0}removeValueFromRenderState(t,{vars:n,style:r}){delete n[t],delete r[t]}makeTargetAnimatableFromInstance({transition:t,transitionEnd:n,...r},{transformValues:i},o){let s=cie(r,t||{},this);if(i&&(n&&(n=i(n)),r&&(r=i(r)),s&&(s=i(s))),o){lie(this,r,s);const a=Voe(this,r,s,n);n=a.transitionEnd,r=a.target}return{transition:t,transitionEnd:n,...r}}}function Woe(e){return window.getComputedStyle(e)}class Koe extends bN{readValueFromInstance(t,n){if(Fl.has(n)){const r=B5(n);return r&&r.default||0}else{const r=Woe(t),i=(aM(n)?r.getPropertyValue(n):r[n])||0;return typeof i=="string"?i.trim():i}}measureInstanceViewportBox(t,{transformPagePoint:n}){return lN(t,n)}build(t,n,r,i){k5(t,n,r,i.transformTemplate)}scrapeMotionValuesFromProps(t,n){return M5(t,n)}handleChildMotionValue(){this.childSubscription&&(this.childSubscription(),delete this.childSubscription);const{children:t}=this.props;Ir(t)&&(this.childSubscription=t.on("change",n=>{this.current&&(this.current.textContent=`${n}`)}))}renderInstance(t,n,r,i){hM(t,n,r,i)}}class Yoe extends bN{constructor(){super(...arguments),this.isSVGTag=!1}getBaseTargetFromProps(t,n){return t[n]}readValueFromInstance(t,n){if(Fl.has(n)){const r=B5(n);return r&&r.default||0}return n=pM.has(n)?n:I5(n),t.getAttribute(n)}measureInstanceViewportBox(){return en()}scrapeMotionValuesFromProps(t,n){return mM(t,n)}build(t,n,r,i){O5(t,n,r,this.isSVGTag,i.transformTemplate)}renderInstance(t,n,r,i){gM(t,n,r,i)}mount(t){this.isSVGTag=R5(t.tagName),super.mount(t)}}const Xoe=(e,t)=>P5(e)?new Yoe(t,{enableHardwareAcceleration:!1}):new Koe(t,{enableHardwareAcceleration:!0}),Qoe={layout:{ProjectionNode:gN,MeasureLayout:uN}},Zoe={...Cie,...Hne,...Aoe,...Qoe},G5=ene((e,t)=>Ane(e,t,Zoe,Xoe));function SN(){const e=E.useRef(!1);return Cy(()=>(e.current=!0,()=>{e.current=!1}),[]),e}function Joe(){const e=SN(),[t,n]=E.useState(0),r=E.useCallback(()=>{e.current&&n(t+1)},[t]);return[E.useCallback(()=>kt.postRender(r),[r]),t]}class ese extends E.Component{getSnapshotBeforeUpdate(t){const n=this.props.childRef.current;if(n&&t.isPresent&&!this.props.isPresent){const r=this.props.sizeRef.current;r.height=n.offsetHeight||0,r.width=n.offsetWidth||0,r.top=n.offsetTop,r.left=n.offsetLeft}return null}componentDidUpdate(){}render(){return this.props.children}}function tse({children:e,isPresent:t}){const n=E.useId(),r=E.useRef(null),i=E.useRef({width:0,height:0,top:0,left:0});return E.useInsertionEffect(()=>{const{width:o,height:s,top:a,left:l}=i.current;if(t||!r.current||!o||!s)return;r.current.dataset.motionPopId=n;const u=document.createElement("style");return document.head.appendChild(u),u.sheet&&u.sheet.insertRule(` + [data-motion-pop-id="${n}"] { + position: absolute !important; + width: ${o}px !important; + height: ${s}px !important; + top: ${a}px !important; + left: ${l}px !important; + } + `),()=>{document.head.removeChild(u)}},[t]),E.createElement(ese,{isPresent:t,childRef:r,sizeRef:i},E.cloneElement(e,{ref:r}))}const ZS=({children:e,initial:t,isPresent:n,onExitComplete:r,custom:i,presenceAffectsLayout:o,mode:s})=>{const a=yM(nse),l=E.useId(),u=E.useMemo(()=>({id:l,initial:t,isPresent:n,custom:i,onExitComplete:c=>{a.set(c,!0);for(const d of a.values())if(!d)return;r&&r()},register:c=>(a.set(c,!1),()=>a.delete(c))}),o?void 0:[n]);return E.useMemo(()=>{a.forEach((c,d)=>a.set(d,!1))},[n]),E.useEffect(()=>{!n&&!a.size&&r&&r()},[n]),s==="popLayout"&&(e=E.createElement(tse,{isPresent:n},e)),E.createElement(dp.Provider,{value:u},e)};function nse(){return new Map}function rse(e){return E.useEffect(()=>()=>e(),[])}const yu=e=>e.key||"";function ise(e,t){e.forEach(n=>{const r=yu(n);t.set(r,n)})}function ose(e){const t=[];return E.Children.forEach(e,n=>{E.isValidElement(n)&&t.push(n)}),t}const H5=({children:e,custom:t,initial:n=!0,onExitComplete:r,exitBeforeEnter:i,presenceAffectsLayout:o=!0,mode:s="sync"})=>{const a=E.useContext(E5).forceRender||Joe()[0],l=SN(),u=ose(e);let c=u;const d=E.useRef(new Map).current,f=E.useRef(c),h=E.useRef(new Map).current,p=E.useRef(!0);if(Cy(()=>{p.current=!1,ise(u,h),f.current=c}),rse(()=>{p.current=!0,h.clear(),d.clear()}),p.current)return E.createElement(E.Fragment,null,c.map(y=>E.createElement(ZS,{key:yu(y),isPresent:!0,initial:n?void 0:!1,presenceAffectsLayout:o,mode:s},y)));c=[...c];const m=f.current.map(yu),S=u.map(yu),v=m.length;for(let y=0;y{if(S.indexOf(g)!==-1)return;const b=h.get(g);if(!b)return;const _=m.indexOf(g);let w=y;if(!w){const x=()=>{h.delete(g),d.delete(g);const C=f.current.findIndex(k=>k.key===g);if(f.current.splice(C,1),!d.size){if(f.current=u,l.current===!1)return;a(),r&&r()}};w=E.createElement(ZS,{key:yu(b),isPresent:!1,onExitComplete:x,custom:t,presenceAffectsLayout:o,mode:s},b),d.set(g,w)}c.splice(_,0,w)}),c=c.map(y=>{const g=y.key;return d.has(g)?y:E.createElement(ZS,{key:yu(y),isPresent:!0,presenceAffectsLayout:o,mode:s},y)}),E.createElement(E.Fragment,null,d.size?c:c.map(y=>E.cloneElement(y)))};var sse={initial:e=>{const{position:t}=e,n=["top","bottom"].includes(t)?"y":"x";let r=["top-right","bottom-right"].includes(t)?1:-1;return t==="bottom"&&(r=1),{opacity:0,[n]:r*24}},animate:{opacity:1,y:0,x:0,scale:1,transition:{duration:.4,ease:[.4,0,.2,1]}},exit:{opacity:0,scale:.85,transition:{duration:.2,ease:[.4,0,1,1]}}},_N=E.memo(e=>{const{id:t,message:n,onCloseComplete:r,onRequestRemove:i,requestClose:o=!1,position:s="bottom",duration:a=5e3,containerStyle:l,motionVariants:u=sse,toastSpacing:c="0.5rem"}=e,[d,f]=E.useState(a),h=Wie();xy(()=>{h||r==null||r()},[h]),xy(()=>{f(a)},[a]);const p=()=>f(null),m=()=>f(a),S=()=>{h&&i()};E.useEffect(()=>{h&&o&&i()},[h,o,i]),Hte(S,d);const v=E.useMemo(()=>({pointerEvents:"auto",maxWidth:560,minWidth:300,margin:c,...l}),[l,c]),y=E.useMemo(()=>Ute(s),[s]);return j.jsx(G5.div,{layout:!0,className:"chakra-toast",variants:u,initial:"initial",animate:"animate",exit:"exit",onHoverStart:p,onHoverEnd:m,custom:{position:s},style:y,children:j.jsx(ke.div,{role:"status","aria-atomic":"true",className:"chakra-toast__inner",__css:v,children:lo(n,{id:t,onClose:S})})})});_N.displayName="ToastComponent";function ase(e,t){var n;const r=e??"bottom",o={"top-start":{ltr:"top-left",rtl:"top-right"},"top-end":{ltr:"top-right",rtl:"top-left"},"bottom-start":{ltr:"bottom-left",rtl:"bottom-right"},"bottom-end":{ltr:"bottom-right",rtl:"bottom-left"}}[r];return(n=o==null?void 0:o[t])!=null?n:r}var f6={path:j.jsxs("g",{stroke:"currentColor",strokeWidth:"1.5",children:[j.jsx("path",{strokeLinecap:"round",fill:"none",d:"M9,9a3,3,0,1,1,4,2.829,1.5,1.5,0,0,0-1,1.415V14.25"}),j.jsx("path",{fill:"currentColor",strokeLinecap:"round",d:"M12,17.25a.375.375,0,1,0,.375.375A.375.375,0,0,0,12,17.25h0"}),j.jsx("circle",{fill:"none",strokeMiterlimit:"10",cx:"12",cy:"12",r:"11.25"})]}),viewBox:"0 0 24 24"},jl=Qe((e,t)=>{const{as:n,viewBox:r,color:i="currentColor",focusable:o=!1,children:s,className:a,__css:l,...u}=e,c=Gn("chakra-icon",a),d=$l("Icon",e),f={w:"1em",h:"1em",display:"inline-block",lineHeight:"1em",flexShrink:0,color:i,...l,...d},h={ref:t,focusable:o,className:c,__css:f},p=r??f6.viewBox;if(n&&typeof n!="string")return j.jsx(ke.svg,{as:n,...h,...u});const m=s??f6.path;return j.jsx(ke.svg,{verticalAlign:"middle",viewBox:p,...h,...u,children:m})});jl.displayName="Icon";function lse(e){return j.jsx(jl,{viewBox:"0 0 24 24",...e,children:j.jsx("path",{fill:"currentColor",d:"M12,0A12,12,0,1,0,24,12,12.014,12.014,0,0,0,12,0Zm6.927,8.2-6.845,9.289a1.011,1.011,0,0,1-1.43.188L5.764,13.769a1,1,0,1,1,1.25-1.562l4.076,3.261,6.227-8.451A1,1,0,1,1,18.927,8.2Z"})})}function use(e){return j.jsx(jl,{viewBox:"0 0 24 24",...e,children:j.jsx("path",{fill:"currentColor",d:"M12,0A12,12,0,1,0,24,12,12.013,12.013,0,0,0,12,0Zm.25,5a1.5,1.5,0,1,1-1.5,1.5A1.5,1.5,0,0,1,12.25,5ZM14.5,18.5h-4a1,1,0,0,1,0-2h.75a.25.25,0,0,0,.25-.25v-4.5a.25.25,0,0,0-.25-.25H10.5a1,1,0,0,1,0-2h1a2,2,0,0,1,2,2v4.75a.25.25,0,0,0,.25.25h.75a1,1,0,1,1,0,2Z"})})}function h6(e){return j.jsx(jl,{viewBox:"0 0 24 24",...e,children:j.jsx("path",{fill:"currentColor",d:"M11.983,0a12.206,12.206,0,0,0-8.51,3.653A11.8,11.8,0,0,0,0,12.207,11.779,11.779,0,0,0,11.8,24h.214A12.111,12.111,0,0,0,24,11.791h0A11.766,11.766,0,0,0,11.983,0ZM10.5,16.542a1.476,1.476,0,0,1,1.449-1.53h.027a1.527,1.527,0,0,1,1.523,1.47,1.475,1.475,0,0,1-1.449,1.53h-.027A1.529,1.529,0,0,1,10.5,16.542ZM11,12.5v-6a1,1,0,0,1,2,0v6a1,1,0,1,1-2,0Z"})})}var cse=kJ({"0%":{transform:"rotate(0deg)"},"100%":{transform:"rotate(360deg)"}}),Vv=Qe((e,t)=>{const n=$l("Spinner",e),{label:r="Loading...",thickness:i="2px",speed:o="0.45s",emptyColor:s="transparent",className:a,...l}=Oo(e),u=Gn("chakra-spinner",a),c={display:"inline-block",borderColor:"currentColor",borderStyle:"solid",borderRadius:"99999px",borderWidth:i,borderBottomColor:s,borderLeftColor:s,animation:`${cse} ${o} linear infinite`,...n};return j.jsx(ke.div,{ref:t,__css:c,className:u,...l,children:r&&j.jsx(ke.span,{srOnly:!0,children:r})})});Vv.displayName="Spinner";var[dse,q5]=Si({name:"AlertContext",hookName:"useAlertContext",providerName:""}),[fse,W5]=Si({name:"AlertStylesContext",hookName:"useAlertStyles",providerName:""}),wN={info:{icon:use,colorScheme:"blue"},warning:{icon:h6,colorScheme:"orange"},success:{icon:lse,colorScheme:"green"},error:{icon:h6,colorScheme:"red"},loading:{icon:Vv,colorScheme:"blue"}};function hse(e){return wN[e].colorScheme}function pse(e){return wN[e].icon}var xN=Qe(function(t,n){const r=W5(),{status:i}=q5(),o={display:"inline",...r.description};return j.jsx(ke.div,{ref:n,"data-status":i,...t,className:Gn("chakra-alert__desc",t.className),__css:o})});xN.displayName="AlertDescription";function CN(e){const{status:t}=q5(),n=pse(t),r=W5(),i=t==="loading"?r.spinner:r.icon;return j.jsx(ke.span,{display:"inherit","data-status":t,...e,className:Gn("chakra-alert__icon",e.className),__css:i,children:e.children||j.jsx(n,{h:"100%",w:"100%"})})}CN.displayName="AlertIcon";var TN=Qe(function(t,n){const r=W5(),{status:i}=q5();return j.jsx(ke.div,{ref:n,"data-status":i,...t,className:Gn("chakra-alert__title",t.className),__css:r.title})});TN.displayName="AlertTitle";var EN=Qe(function(t,n){var r;const{status:i="info",addRole:o=!0,...s}=Oo(t),a=(r=t.colorScheme)!=null?r:hse(i),l=Mv("Alert",{...t,colorScheme:a}),u={width:"100%",display:"flex",alignItems:"center",position:"relative",overflow:"hidden",...l.container};return j.jsx(dse,{value:{status:i},children:j.jsx(fse,{value:l,children:j.jsx(ke.div,{"data-status":i,role:o?"alert":void 0,ref:n,...s,className:Gn("chakra-alert",t.className),__css:u})})})});EN.displayName="Alert";function gse(e){return j.jsx(jl,{focusable:"false","aria-hidden":!0,...e,children:j.jsx("path",{fill:"currentColor",d:"M.439,21.44a1.5,1.5,0,0,0,2.122,2.121L11.823,14.3a.25.25,0,0,1,.354,0l9.262,9.263a1.5,1.5,0,1,0,2.122-2.121L14.3,12.177a.25.25,0,0,1,0-.354l9.263-9.262A1.5,1.5,0,0,0,21.439.44L12.177,9.7a.25.25,0,0,1-.354,0L2.561.44A1.5,1.5,0,0,0,.439,2.561L9.7,11.823a.25.25,0,0,1,0,.354Z"})})}var PN=Qe(function(t,n){const r=$l("CloseButton",t),{children:i,isDisabled:o,__css:s,...a}=Oo(t),l={outline:0,display:"flex",alignItems:"center",justifyContent:"center",flexShrink:0};return j.jsx(ke.button,{type:"button","aria-label":"Close",ref:n,disabled:o,__css:{...l,...r,...s},...a,children:i||j.jsx(gse,{width:"1em",height:"1em"})})});PN.displayName="CloseButton";var mse={top:[],"top-left":[],"top-right":[],"bottom-left":[],bottom:[],"bottom-right":[]},ro=yse(mse);function yse(e){let t=e;const n=new Set,r=i=>{t=i(t),n.forEach(o=>o())};return{getState:()=>t,subscribe:i=>(n.add(i),()=>{r(()=>e),n.delete(i)}),removeToast:(i,o)=>{r(s=>({...s,[o]:s[o].filter(a=>a.id!=i)}))},notify:(i,o)=>{const s=vse(i,o),{position:a,id:l}=s;return r(u=>{var c,d;const h=a.includes("top")?[s,...(c=u[a])!=null?c:[]]:[...(d=u[a])!=null?d:[],s];return{...u,[a]:h}}),l},update:(i,o)=>{i&&r(s=>{const a={...s},{position:l,index:u}=uP(a,i);return l&&u!==-1&&(a[l][u]={...a[l][u],...o,message:kN(o)}),a})},closeAll:({positions:i}={})=>{r(o=>(i??["bottom","bottom-right","bottom-left","top","top-left","top-right"]).reduce((l,u)=>(l[u]=o[u].map(c=>({...c,requestClose:!0})),l),{...o}))},close:i=>{r(o=>{const s=eM(o,i);return s?{...o,[s]:o[s].map(a=>a.id==i?{...a,requestClose:!0}:a)}:o})},isActive:i=>!!uP(ro.getState(),i).position}}var p6=0;function vse(e,t={}){var n,r;p6+=1;const i=(n=t.id)!=null?n:p6,o=(r=t.position)!=null?r:"bottom";return{id:i,message:e,position:o,duration:t.duration,onCloseComplete:t.onCloseComplete,onRequestRemove:()=>ro.removeToast(String(i),o),status:t.status,requestClose:!1,containerStyle:t.containerStyle}}var bse=e=>{const{status:t,variant:n="solid",id:r,title:i,isClosable:o,onClose:s,description:a,colorScheme:l,icon:u}=e,c=r?{root:`toast-${r}`,title:`toast-${r}-title`,description:`toast-${r}-description`}:void 0;return j.jsxs(EN,{addRole:!1,status:t,variant:n,id:c==null?void 0:c.root,alignItems:"start",borderRadius:"md",boxShadow:"lg",paddingEnd:8,textAlign:"start",width:"auto",colorScheme:l,children:[j.jsx(CN,{children:u}),j.jsxs(ke.div,{flex:"1",maxWidth:"100%",children:[i&&j.jsx(TN,{id:c==null?void 0:c.title,children:i}),a&&j.jsx(xN,{id:c==null?void 0:c.description,display:"block",children:a})]}),o&&j.jsx(PN,{size:"sm",onClick:s,position:"absolute",insetEnd:1,top:1})]})};function kN(e={}){const{render:t,toastComponent:n=bse}=e;return i=>typeof t=="function"?t({...i,...e}):j.jsx(n,{...i,...e})}function Sse(e,t){const n=i=>{var o;return{...t,...i,position:ase((o=i==null?void 0:i.position)!=null?o:t==null?void 0:t.position,e)}},r=i=>{const o=n(i),s=kN(o);return ro.notify(s,o)};return r.update=(i,o)=>{ro.update(i,n(o))},r.promise=(i,o)=>{const s=r({...o.loading,status:"loading",duration:null});i.then(a=>r.update(s,{status:"success",duration:5e3,...lo(o.success,a)})).catch(a=>r.update(s,{status:"error",duration:5e3,...lo(o.error,a)}))},r.closeAll=ro.closeAll,r.close=ro.close,r.isActive=ro.isActive,r}var[iEe,_se]=Si({name:"ToastOptionsContext",strict:!1}),oEe=e=>{const t=E.useSyncExternalStore(ro.subscribe,ro.getState,ro.getState),{motionVariants:n,component:r=_N,portalProps:i}=e,s=Object.keys(t).map(a=>{const l=t[a];return j.jsx("div",{role:"region","aria-live":"polite",id:`chakra-toast-manager-${a}`,style:Gte(a),children:j.jsx(H5,{initial:!1,children:l.map(u=>j.jsx(r,{motionVariants:n,...u},u.id))})},a)});return j.jsx(up,{...i,children:s})};function wse(e){const{theme:t}=V7(),n=_se();return E.useMemo(()=>Sse(t.direction,{...n,...e}),[e,t.direction,n])}function xse(e,t){if(e!=null){if(typeof e=="function"){e(t);return}try{e.current=t}catch{throw new Error(`Cannot assign value '${t}' to ref '${e}'`)}}}function fi(...e){return t=>{e.forEach(n=>{xse(n,t)})}}function Cse(...e){return E.useMemo(()=>fi(...e),e)}function Tse(e){const{value:t,defaultValue:n,onChange:r,shouldUpdate:i=(f,h)=>f!==h}=e,o=Bn(r),s=Bn(i),[a,l]=E.useState(n),u=t!==void 0,c=u?t:a,d=Bn(f=>{const p=typeof f=="function"?f(c):f;s(c,p)&&(u||l(p),o(p))},[u,o,c,s]);return[c,d]}var kw=Qe(function(t,n){const{htmlWidth:r,htmlHeight:i,alt:o,...s}=t;return j.jsx("img",{width:r,height:i,ref:n,alt:o,...s})});kw.displayName="NativeImage";function Ese(e){const{loading:t,src:n,srcSet:r,onLoad:i,onError:o,crossOrigin:s,sizes:a,ignoreFallback:l}=e,[u,c]=E.useState("pending");E.useEffect(()=>{c(n?"loading":"pending")},[n]);const d=E.useRef(),f=E.useCallback(()=>{if(!n)return;h();const p=new Image;p.src=n,s&&(p.crossOrigin=s),r&&(p.srcset=r),a&&(p.sizes=a),t&&(p.loading=t),p.onload=m=>{h(),c("loaded"),i==null||i(m)},p.onerror=m=>{h(),c("failed"),o==null||o(m)},d.current=p},[n,s,r,a,i,o,t]),h=()=>{d.current&&(d.current.onload=null,d.current.onerror=null,d.current=null)};return nh(()=>{if(!l)return u==="loading"&&f(),()=>{h()}},[u,f,l]),l?"loaded":u}var Pse=(e,t)=>e!=="loaded"&&t==="beforeLoadOrError"||e==="failed"&&t==="onError";function kse(e,t=[]){const n=Object.assign({},e);for(const r of t)r in n&&delete n[r];return n}var K5=Qe(function(t,n){const{fallbackSrc:r,fallback:i,src:o,srcSet:s,align:a,fit:l,loading:u,ignoreFallback:c,crossOrigin:d,fallbackStrategy:f="beforeLoadOrError",referrerPolicy:h,...p}=t,m=r!==void 0||i!==void 0,S=u!=null||c||!m,v=Ese({...t,crossOrigin:d,ignoreFallback:S}),y=Pse(v,f),g={ref:n,objectFit:l,objectPosition:a,...S?p:kse(p,["onError","onLoad"])};return y?i||j.jsx(ke.img,{as:kw,className:"chakra-image__placeholder",src:r,...g}):j.jsx(ke.img,{as:kw,src:o,srcSet:s,crossOrigin:d,loading:u,referrerPolicy:h,className:"chakra-image",...g})});K5.displayName="Image";function Ase(e){return E.Children.toArray(e).filter(t=>E.isValidElement(t))}var[sEe,Ose]=Si({strict:!1,name:"ButtonGroupContext"});function Rse(e){const[t,n]=E.useState(!e);return{ref:E.useCallback(o=>{o&&n(o.tagName==="BUTTON")},[]),type:t?"button":void 0}}function Aw(e){const{children:t,className:n,...r}=e,i=E.isValidElement(t)?E.cloneElement(t,{"aria-hidden":!0,focusable:!1}):t,o=Gn("chakra-button__icon",n);return j.jsx(ke.span,{display:"inline-flex",alignSelf:"center",flexShrink:0,...r,className:o,children:i})}Aw.displayName="ButtonIcon";function Ow(e){const{label:t,placement:n,spacing:r="0.5rem",children:i=j.jsx(Vv,{color:"currentColor",width:"1em",height:"1em"}),className:o,__css:s,...a}=e,l=Gn("chakra-button__spinner",o),u=n==="start"?"marginEnd":"marginStart",c=E.useMemo(()=>({display:"flex",alignItems:"center",position:t?"relative":"absolute",[u]:t?r:0,fontSize:"1em",lineHeight:"normal",...s}),[s,t,u,r]);return j.jsx(ke.div,{className:l,...a,__css:c,children:i})}Ow.displayName="ButtonSpinner";var AN=Qe((e,t)=>{const n=Ose(),r=$l("Button",{...n,...e}),{isDisabled:i=n==null?void 0:n.isDisabled,isLoading:o,isActive:s,children:a,leftIcon:l,rightIcon:u,loadingText:c,iconSpacing:d="0.5rem",type:f,spinner:h,spinnerPlacement:p="start",className:m,as:S,...v}=Oo(e),y=E.useMemo(()=>{const w={...r==null?void 0:r._focus,zIndex:1};return{display:"inline-flex",appearance:"none",alignItems:"center",justifyContent:"center",userSelect:"none",position:"relative",whiteSpace:"nowrap",verticalAlign:"middle",outline:"none",...r,...!!n&&{_focus:w}}},[r,n]),{ref:g,type:b}=Rse(S),_={rightIcon:u,leftIcon:l,iconSpacing:d,children:a};return j.jsxs(ke.button,{ref:Cse(t,g),as:S,type:f??b,"data-active":Lu(s),"data-loading":Lu(o),__css:y,className:Gn("chakra-button",m),...v,disabled:i||o,children:[o&&p==="start"&&j.jsx(Ow,{className:"chakra-button__spinner--start",label:c,placement:"start",spacing:d,children:h}),o?c||j.jsx(ke.span,{opacity:0,children:j.jsx(g6,{..._})}):j.jsx(g6,{..._}),o&&p==="end"&&j.jsx(Ow,{className:"chakra-button__spinner--end",label:c,placement:"end",spacing:d,children:h})]})});AN.displayName="Button";function g6(e){const{leftIcon:t,rightIcon:n,children:r,iconSpacing:i}=e;return j.jsxs(j.Fragment,{children:[t&&j.jsx(Aw,{marginEnd:i,children:t}),r,n&&j.jsx(Aw,{marginStart:i,children:n})]})}var ON=Qe((e,t)=>{const{icon:n,children:r,isRound:i,"aria-label":o,...s}=e,a=n||r,l=E.isValidElement(a)?E.cloneElement(a,{"aria-hidden":!0,focusable:!1}):null;return j.jsx(AN,{padding:"0",borderRadius:i?"full":void 0,ref:t,"aria-label":o,...s,children:l})});ON.displayName="IconButton";var[Ise,RN]=Si({name:"FormControlStylesContext",errorMessage:`useFormControlStyles returned is 'undefined'. Seems you forgot to wrap the components in "" `}),[Mse,zv]=Si({strict:!1,name:"FormControlContext"});function Nse(e){const{id:t,isRequired:n,isInvalid:r,isDisabled:i,isReadOnly:o,...s}=e,a=E.useId(),l=t||`field-${a}`,u=`${l}-label`,c=`${l}-feedback`,d=`${l}-helptext`,[f,h]=E.useState(!1),[p,m]=E.useState(!1),[S,v]=E.useState(!1),y=E.useCallback((x={},C=null)=>({id:d,...x,ref:fi(C,k=>{k&&m(!0)})}),[d]),g=E.useCallback((x={},C=null)=>({...x,ref:C,"data-focus":Lu(S),"data-disabled":Lu(i),"data-invalid":Lu(r),"data-readonly":Lu(o),id:x.id!==void 0?x.id:u,htmlFor:x.htmlFor!==void 0?x.htmlFor:l}),[l,i,S,r,o,u]),b=E.useCallback((x={},C=null)=>({id:c,...x,ref:fi(C,k=>{k&&h(!0)}),"aria-live":"polite"}),[c]),_=E.useCallback((x={},C=null)=>({...x,...s,ref:C,role:"group"}),[s]),w=E.useCallback((x={},C=null)=>({...x,ref:C,role:"presentation","aria-hidden":!0,children:x.children||"*"}),[]);return{isRequired:!!n,isInvalid:!!r,isReadOnly:!!o,isDisabled:!!i,isFocused:!!S,onFocus:()=>v(!0),onBlur:()=>v(!1),hasFeedbackText:f,setHasFeedbackText:h,hasHelpText:p,setHasHelpText:m,id:l,labelId:u,feedbackId:c,helpTextId:d,htmlProps:s,getHelpTextProps:y,getErrorMessageProps:b,getRootProps:_,getLabelProps:g,getRequiredIndicatorProps:w}}var IN=Qe(function(t,n){const r=Mv("Form",t),i=Oo(t),{getRootProps:o,htmlProps:s,...a}=Nse(i),l=Gn("chakra-form-control",t.className);return j.jsx(Mse,{value:a,children:j.jsx(Ise,{value:r,children:j.jsx(ke.div,{...o({},n),className:l,__css:r.container})})})});IN.displayName="FormControl";var Dse=Qe(function(t,n){const r=zv(),i=RN(),o=Gn("chakra-form__helper-text",t.className);return j.jsx(ke.div,{...r==null?void 0:r.getHelpTextProps(t,n),__css:i.helperText,className:o})});Dse.displayName="FormHelperText";var MN=Qe(function(t,n){var r;const i=$l("FormLabel",t),o=Oo(t),{className:s,children:a,requiredIndicator:l=j.jsx(NN,{}),optionalIndicator:u=null,...c}=o,d=zv(),f=(r=d==null?void 0:d.getLabelProps(c,n))!=null?r:{ref:n,...c};return j.jsxs(ke.label,{...f,className:Gn("chakra-form__label",o.className),__css:{display:"block",textAlign:"start",...i},children:[a,d!=null&&d.isRequired?l:u]})});MN.displayName="FormLabel";var NN=Qe(function(t,n){const r=zv(),i=RN();if(!(r!=null&&r.isRequired))return null;const o=Gn("chakra-form__required-indicator",t.className);return j.jsx(ke.span,{...r==null?void 0:r.getRequiredIndicatorProps(t,n),__css:i.requiredIndicator,className:o})});NN.displayName="RequiredIndicator";function aEe(e){const{isDisabled:t,isInvalid:n,isReadOnly:r,isRequired:i,...o}=DN(e);return{...o,disabled:t,readOnly:r,required:i,"aria-invalid":tc(n),"aria-required":tc(i),"aria-readonly":tc(r)}}function DN(e){var t,n,r;const i=zv(),{id:o,disabled:s,readOnly:a,required:l,isRequired:u,isInvalid:c,isReadOnly:d,isDisabled:f,onFocus:h,onBlur:p,...m}=e,S=e["aria-describedby"]?[e["aria-describedby"]]:[];return i!=null&&i.hasFeedbackText&&(i!=null&&i.isInvalid)&&S.push(i.feedbackId),i!=null&&i.hasHelpText&&S.push(i.helpTextId),{...m,"aria-describedby":S.join(" ")||void 0,id:o??(i==null?void 0:i.id),isDisabled:(t=s??f)!=null?t:i==null?void 0:i.isDisabled,isReadOnly:(n=a??d)!=null?n:i==null?void 0:i.isReadOnly,isRequired:(r=l??u)!=null?r:i==null?void 0:i.isRequired,isInvalid:c??(i==null?void 0:i.isInvalid),onFocus:Ln(i==null?void 0:i.onFocus,h),onBlur:Ln(i==null?void 0:i.onBlur,p)}}function Lse(e){const t=parseFloat(e);return typeof t!="number"||Number.isNaN(t)?0:t}function Y5(e,t){let n=Lse(e);const r=10**(t??10);return n=Math.round(n*r)/r,t?n.toFixed(t):n.toString()}function Rw(e){if(!Number.isFinite(e))return 0;let t=1,n=0;for(;Math.round(e*t)/t!==e;)t*=10,n+=1;return n}function m6(e,t,n){return(e-t)*100/(n-t)}function $se(e,t,n){return(n-t)*e+t}function y6(e,t,n){const r=Math.round((e-t)/n)*n+t,i=Rw(n);return Y5(r,i)}function gm(e,t,n){return e==null?e:(n{var P;return r==null?"":(P=JS(r,o,n))!=null?P:""}),f=typeof i<"u",h=f?i:c,p=LN(Ns(h),o),m=n??p,S=E.useCallback(P=>{P!==h&&(f||d(P.toString()),u==null||u(P.toString(),Ns(P)))},[u,f,h]),v=E.useCallback(P=>{let A=P;return l&&(A=gm(A,s,a)),Y5(A,m)},[m,l,a,s]),y=E.useCallback((P=o)=>{let A;h===""?A=Ns(P):A=Ns(h)+P,A=v(A),S(A)},[v,o,S,h]),g=E.useCallback((P=o)=>{let A;h===""?A=Ns(-P):A=Ns(h)-P,A=v(A),S(A)},[v,o,S,h]),b=E.useCallback(()=>{var P;let A;r==null?A="":A=(P=JS(r,o,n))!=null?P:s,S(A)},[r,n,o,S,s]),_=E.useCallback(P=>{var A;const $=(A=JS(P,o,m))!=null?A:s;S($)},[m,o,S,s]),w=Ns(h);return{isOutOfRange:w>a||w{const o=typeof e=="function"?e():e??document;if(!(!n||!o))return o.addEventListener(t,i,r),()=>{o.removeEventListener(t,i,r)}},[t,e,r,i,n]),()=>{const o=typeof e=="function"?e():e??document;o==null||o.removeEventListener(t,i,r)}}function $N(e){return e!=null&&typeof e=="object"&&"nodeType"in e&&e.nodeType===Node.ELEMENT_NODE}function Bse(e){var t;if(!$N(e))return!1;const n=(t=e.ownerDocument.defaultView)!=null?t:window;return e instanceof n.HTMLElement}function lEe(e){var t,n;return(n=(t=FN(e))==null?void 0:t.defaultView)!=null?n:window}function FN(e){return $N(e)?e.ownerDocument:document}function uEe(e){return FN(e).activeElement}function jse(e){const t=e.ownerDocument.defaultView||window,{overflow:n,overflowX:r,overflowY:i}=t.getComputedStyle(e);return/auto|scroll|overlay|hidden/.test(n+i+r)}function Vse(e){return e.localName==="html"?e:e.assignedSlot||e.parentElement||e.ownerDocument.documentElement}function BN(e){return["html","body","#document"].includes(e.localName)?e.ownerDocument.body:Bse(e)&&jse(e)?e:BN(Vse(e))}var zse=ate?E.useLayoutEffect:E.useEffect;function v6(e,t=[]){const n=E.useRef(e);return zse(()=>{n.current=e}),E.useCallback((...r)=>{var i;return(i=n.current)==null?void 0:i.call(n,...r)},t)}function Use(e,t){const n=E.useId();return E.useMemo(()=>e||[t,n].filter(Boolean).join("-"),[e,t,n])}function Gse(e,t){const n=e!==void 0;return[n,n&&typeof e<"u"?e:t]}function jN(e={}){const{onClose:t,onOpen:n,isOpen:r,id:i}=e,o=v6(n),s=v6(t),[a,l]=E.useState(e.defaultIsOpen||!1),[u,c]=Gse(r,a),d=Use(i,"disclosure"),f=E.useCallback(()=>{u||l(!1),s==null||s()},[u,s]),h=E.useCallback(()=>{u||l(!0),o==null||o()},[u,o]),p=E.useCallback(()=>{(c?f:h)()},[c,h,f]);return{isOpen:!!c,onOpen:h,onClose:f,onToggle:p,isControlled:u,getButtonProps:(m={})=>({...m,"aria-expanded":c,"aria-controls":d,onClick:pte(m.onClick,p)}),getDisclosureProps:(m={})=>({...m,hidden:!c,id:d})}}function Hse(e,t){return Array.isArray(e)?e.map(n=>n===null?null:t(n)):vo(e)?Object.keys(e).reduce((n,r)=>(n[r]=t(e[r]),n),{}):e!=null?t(e):null}var VN=e=>j.jsx(ke.div,{className:"chakra-stack__item",...e,__css:{display:"inline-block",flex:"0 0 auto",minWidth:0,...e.__css}});VN.displayName="StackItem";function qse(e){const{spacing:t,direction:n}=e,r={column:{my:t,mx:0,borderLeftWidth:0,borderBottomWidth:"1px"},"column-reverse":{my:t,mx:0,borderLeftWidth:0,borderBottomWidth:"1px"},row:{mx:t,my:0,borderLeftWidth:"1px",borderBottomWidth:0},"row-reverse":{mx:t,my:0,borderLeftWidth:"1px",borderBottomWidth:0}};return{"&":Hse(n,i=>r[i])}}var zN=Qe((e,t)=>{const{isInline:n,direction:r,align:i,justify:o,spacing:s="0.5rem",wrap:a,children:l,divider:u,className:c,shouldWrapChildren:d,...f}=e,h=n?"row":r??"column",p=E.useMemo(()=>qse({spacing:s,direction:h}),[s,h]),m=!!u,S=!d&&!m,v=E.useMemo(()=>{const g=Ase(l);return S?g:g.map((b,_)=>{const w=typeof b.key<"u"?b.key:_,x=_+1===g.length,k=d?j.jsx(VN,{children:b},w):b;if(!m)return k;const P=E.cloneElement(u,{__css:p}),A=x?null:P;return j.jsxs(E.Fragment,{children:[k,A]},w)})},[u,p,m,S,d,l]),y=Gn("chakra-stack",c);return j.jsx(ke.div,{ref:t,display:"flex",alignItems:i,justifyContent:o,flexDirection:h,flexWrap:a,gap:m?void 0:s,className:y,...f,children:v})});zN.displayName="Stack";var UN=Qe((e,t)=>j.jsx(zN,{align:"center",...e,direction:"row",ref:t}));UN.displayName="HStack";var Iw=Qe(function(t,n){const r=$l("Heading",t),{className:i,...o}=Oo(t);return j.jsx(ke.h2,{ref:n,className:Gn("chakra-heading",t.className),...o,__css:r})});Iw.displayName="Heading";var X5=ke("div");X5.displayName="Box";var GN=Qe(function(t,n){const{size:r,centerContent:i=!0,...o}=t,s=i?{display:"flex",alignItems:"center",justifyContent:"center"}:{};return j.jsx(X5,{ref:n,boxSize:r,__css:{...s,flexShrink:0,flexGrow:0},...o})});GN.displayName="Square";var Wse=Qe(function(t,n){const{size:r,...i}=t;return j.jsx(GN,{size:r,ref:n,borderRadius:"9999px",...i})});Wse.displayName="Circle";var Q5=Qe(function(t,n){const{direction:r,align:i,justify:o,wrap:s,basis:a,grow:l,shrink:u,...c}=t,d={display:"flex",flexDirection:r,alignItems:i,justifyContent:o,flexWrap:s,flexBasis:a,flexGrow:l,flexShrink:u};return j.jsx(ke.div,{ref:n,__css:d,...c})});Q5.displayName="Flex";var ru=(e,t)=>({var:e,varRef:t?`var(${e}, ${t})`:`var(${e})`}),Fn={arrowShadowColor:ru("--popper-arrow-shadow-color"),arrowSize:ru("--popper-arrow-size","8px"),arrowSizeHalf:ru("--popper-arrow-size-half"),arrowBg:ru("--popper-arrow-bg"),transformOrigin:ru("--popper-transform-origin"),arrowOffset:ru("--popper-arrow-offset")};function Kse(e){if(e.includes("top"))return"1px 1px 0px 0 var(--popper-arrow-shadow-color)";if(e.includes("bottom"))return"-1px -1px 0px 0 var(--popper-arrow-shadow-color)";if(e.includes("right"))return"-1px 1px 0px 0 var(--popper-arrow-shadow-color)";if(e.includes("left"))return"1px -1px 0px 0 var(--popper-arrow-shadow-color)"}var Yse={top:"bottom center","top-start":"bottom left","top-end":"bottom right",bottom:"top center","bottom-start":"top left","bottom-end":"top right",left:"right center","left-start":"right top","left-end":"right bottom",right:"left center","right-start":"left top","right-end":"left bottom"},Xse=e=>Yse[e],b6={scroll:!0,resize:!0};function Qse(e){let t;return typeof e=="object"?t={enabled:!0,options:{...b6,...e}}:t={enabled:e,options:b6},t}var Zse={name:"matchWidth",enabled:!0,phase:"beforeWrite",requires:["computeStyles"],fn:({state:e})=>{e.styles.popper.width=`${e.rects.reference.width}px`},effect:({state:e})=>()=>{const t=e.elements.reference;e.elements.popper.style.width=`${t.offsetWidth}px`}},Jse={name:"transformOrigin",enabled:!0,phase:"write",fn:({state:e})=>{S6(e)},effect:({state:e})=>()=>{S6(e)}},S6=e=>{e.elements.popper.style.setProperty(Fn.transformOrigin.var,Xse(e.placement))},eae={name:"positionArrow",enabled:!0,phase:"afterWrite",fn:({state:e})=>{tae(e)}},tae=e=>{var t;if(!e.placement)return;const n=nae(e.placement);if((t=e.elements)!=null&&t.arrow&&n){Object.assign(e.elements.arrow.style,{[n.property]:n.value,width:Fn.arrowSize.varRef,height:Fn.arrowSize.varRef,zIndex:-1});const r={[Fn.arrowSizeHalf.var]:`calc(${Fn.arrowSize.varRef} / 2 - 1px)`,[Fn.arrowOffset.var]:`calc(${Fn.arrowSizeHalf.varRef} * -1)`};for(const i in r)e.elements.arrow.style.setProperty(i,r[i])}},nae=e=>{if(e.startsWith("top"))return{property:"bottom",value:Fn.arrowOffset.varRef};if(e.startsWith("bottom"))return{property:"top",value:Fn.arrowOffset.varRef};if(e.startsWith("left"))return{property:"right",value:Fn.arrowOffset.varRef};if(e.startsWith("right"))return{property:"left",value:Fn.arrowOffset.varRef}},rae={name:"innerArrow",enabled:!0,phase:"main",requires:["arrow"],fn:({state:e})=>{_6(e)},effect:({state:e})=>()=>{_6(e)}},_6=e=>{if(!e.elements.arrow)return;const t=e.elements.arrow.querySelector("[data-popper-arrow-inner]");if(!t)return;const n=Kse(e.placement);n&&t.style.setProperty("--popper-arrow-default-shadow",n),Object.assign(t.style,{transform:"rotate(45deg)",background:Fn.arrowBg.varRef,top:0,left:0,width:"100%",height:"100%",position:"absolute",zIndex:"inherit",boxShadow:"var(--popper-arrow-shadow, var(--popper-arrow-default-shadow))"})},iae={"start-start":{ltr:"left-start",rtl:"right-start"},"start-end":{ltr:"left-end",rtl:"right-end"},"end-start":{ltr:"right-start",rtl:"left-start"},"end-end":{ltr:"right-end",rtl:"left-end"},start:{ltr:"left",rtl:"right"},end:{ltr:"right",rtl:"left"}},oae={"auto-start":"auto-end","auto-end":"auto-start","top-start":"top-end","top-end":"top-start","bottom-start":"bottom-end","bottom-end":"bottom-start"};function sae(e,t="ltr"){var n,r;const i=((n=iae[e])==null?void 0:n[t])||e;return t==="ltr"?i:(r=oae[e])!=null?r:i}var kr="top",yi="bottom",vi="right",Ar="left",Z5="auto",mp=[kr,yi,vi,Ar],kc="start",ah="end",aae="clippingParents",HN="viewport",Td="popper",lae="reference",w6=mp.reduce(function(e,t){return e.concat([t+"-"+kc,t+"-"+ah])},[]),qN=[].concat(mp,[Z5]).reduce(function(e,t){return e.concat([t,t+"-"+kc,t+"-"+ah])},[]),uae="beforeRead",cae="read",dae="afterRead",fae="beforeMain",hae="main",pae="afterMain",gae="beforeWrite",mae="write",yae="afterWrite",vae=[uae,cae,dae,fae,hae,pae,gae,mae,yae];function wo(e){return e?(e.nodeName||"").toLowerCase():null}function Hr(e){if(e==null)return window;if(e.toString()!=="[object Window]"){var t=e.ownerDocument;return t&&t.defaultView||window}return e}function wl(e){var t=Hr(e).Element;return e instanceof t||e instanceof Element}function hi(e){var t=Hr(e).HTMLElement;return e instanceof t||e instanceof HTMLElement}function J5(e){if(typeof ShadowRoot>"u")return!1;var t=Hr(e).ShadowRoot;return e instanceof t||e instanceof ShadowRoot}function bae(e){var t=e.state;Object.keys(t.elements).forEach(function(n){var r=t.styles[n]||{},i=t.attributes[n]||{},o=t.elements[n];!hi(o)||!wo(o)||(Object.assign(o.style,r),Object.keys(i).forEach(function(s){var a=i[s];a===!1?o.removeAttribute(s):o.setAttribute(s,a===!0?"":a)}))})}function Sae(e){var t=e.state,n={popper:{position:t.options.strategy,left:"0",top:"0",margin:"0"},arrow:{position:"absolute"},reference:{}};return Object.assign(t.elements.popper.style,n.popper),t.styles=n,t.elements.arrow&&Object.assign(t.elements.arrow.style,n.arrow),function(){Object.keys(t.elements).forEach(function(r){var i=t.elements[r],o=t.attributes[r]||{},s=Object.keys(t.styles.hasOwnProperty(r)?t.styles[r]:n[r]),a=s.reduce(function(l,u){return l[u]="",l},{});!hi(i)||!wo(i)||(Object.assign(i.style,a),Object.keys(o).forEach(function(l){i.removeAttribute(l)}))})}}const _ae={name:"applyStyles",enabled:!0,phase:"write",fn:bae,effect:Sae,requires:["computeStyles"]};function So(e){return e.split("-")[0]}var ul=Math.max,My=Math.min,Ac=Math.round;function Mw(){var e=navigator.userAgentData;return e!=null&&e.brands&&Array.isArray(e.brands)?e.brands.map(function(t){return t.brand+"/"+t.version}).join(" "):navigator.userAgent}function WN(){return!/^((?!chrome|android).)*safari/i.test(Mw())}function Oc(e,t,n){t===void 0&&(t=!1),n===void 0&&(n=!1);var r=e.getBoundingClientRect(),i=1,o=1;t&&hi(e)&&(i=e.offsetWidth>0&&Ac(r.width)/e.offsetWidth||1,o=e.offsetHeight>0&&Ac(r.height)/e.offsetHeight||1);var s=wl(e)?Hr(e):window,a=s.visualViewport,l=!WN()&&n,u=(r.left+(l&&a?a.offsetLeft:0))/i,c=(r.top+(l&&a?a.offsetTop:0))/o,d=r.width/i,f=r.height/o;return{width:d,height:f,top:c,right:u+d,bottom:c+f,left:u,x:u,y:c}}function e3(e){var t=Oc(e),n=e.offsetWidth,r=e.offsetHeight;return Math.abs(t.width-n)<=1&&(n=t.width),Math.abs(t.height-r)<=1&&(r=t.height),{x:e.offsetLeft,y:e.offsetTop,width:n,height:r}}function KN(e,t){var n=t.getRootNode&&t.getRootNode();if(e.contains(t))return!0;if(n&&J5(n)){var r=t;do{if(r&&e.isSameNode(r))return!0;r=r.parentNode||r.host}while(r)}return!1}function ps(e){return Hr(e).getComputedStyle(e)}function wae(e){return["table","td","th"].indexOf(wo(e))>=0}function Ra(e){return((wl(e)?e.ownerDocument:e.document)||window.document).documentElement}function Uv(e){return wo(e)==="html"?e:e.assignedSlot||e.parentNode||(J5(e)?e.host:null)||Ra(e)}function x6(e){return!hi(e)||ps(e).position==="fixed"?null:e.offsetParent}function xae(e){var t=/firefox/i.test(Mw()),n=/Trident/i.test(Mw());if(n&&hi(e)){var r=ps(e);if(r.position==="fixed")return null}var i=Uv(e);for(J5(i)&&(i=i.host);hi(i)&&["html","body"].indexOf(wo(i))<0;){var o=ps(i);if(o.transform!=="none"||o.perspective!=="none"||o.contain==="paint"||["transform","perspective"].indexOf(o.willChange)!==-1||t&&o.willChange==="filter"||t&&o.filter&&o.filter!=="none")return i;i=i.parentNode}return null}function yp(e){for(var t=Hr(e),n=x6(e);n&&wae(n)&&ps(n).position==="static";)n=x6(n);return n&&(wo(n)==="html"||wo(n)==="body"&&ps(n).position==="static")?t:n||xae(e)||t}function t3(e){return["top","bottom"].indexOf(e)>=0?"x":"y"}function yf(e,t,n){return ul(e,My(t,n))}function Cae(e,t,n){var r=yf(e,t,n);return r>n?n:r}function YN(){return{top:0,right:0,bottom:0,left:0}}function XN(e){return Object.assign({},YN(),e)}function QN(e,t){return t.reduce(function(n,r){return n[r]=e,n},{})}var Tae=function(t,n){return t=typeof t=="function"?t(Object.assign({},n.rects,{placement:n.placement})):t,XN(typeof t!="number"?t:QN(t,mp))};function Eae(e){var t,n=e.state,r=e.name,i=e.options,o=n.elements.arrow,s=n.modifiersData.popperOffsets,a=So(n.placement),l=t3(a),u=[Ar,vi].indexOf(a)>=0,c=u?"height":"width";if(!(!o||!s)){var d=Tae(i.padding,n),f=e3(o),h=l==="y"?kr:Ar,p=l==="y"?yi:vi,m=n.rects.reference[c]+n.rects.reference[l]-s[l]-n.rects.popper[c],S=s[l]-n.rects.reference[l],v=yp(o),y=v?l==="y"?v.clientHeight||0:v.clientWidth||0:0,g=m/2-S/2,b=d[h],_=y-f[c]-d[p],w=y/2-f[c]/2+g,x=yf(b,w,_),C=l;n.modifiersData[r]=(t={},t[C]=x,t.centerOffset=x-w,t)}}function Pae(e){var t=e.state,n=e.options,r=n.element,i=r===void 0?"[data-popper-arrow]":r;i!=null&&(typeof i=="string"&&(i=t.elements.popper.querySelector(i),!i)||KN(t.elements.popper,i)&&(t.elements.arrow=i))}const kae={name:"arrow",enabled:!0,phase:"main",fn:Eae,effect:Pae,requires:["popperOffsets"],requiresIfExists:["preventOverflow"]};function Rc(e){return e.split("-")[1]}var Aae={top:"auto",right:"auto",bottom:"auto",left:"auto"};function Oae(e,t){var n=e.x,r=e.y,i=t.devicePixelRatio||1;return{x:Ac(n*i)/i||0,y:Ac(r*i)/i||0}}function C6(e){var t,n=e.popper,r=e.popperRect,i=e.placement,o=e.variation,s=e.offsets,a=e.position,l=e.gpuAcceleration,u=e.adaptive,c=e.roundOffsets,d=e.isFixed,f=s.x,h=f===void 0?0:f,p=s.y,m=p===void 0?0:p,S=typeof c=="function"?c({x:h,y:m}):{x:h,y:m};h=S.x,m=S.y;var v=s.hasOwnProperty("x"),y=s.hasOwnProperty("y"),g=Ar,b=kr,_=window;if(u){var w=yp(n),x="clientHeight",C="clientWidth";if(w===Hr(n)&&(w=Ra(n),ps(w).position!=="static"&&a==="absolute"&&(x="scrollHeight",C="scrollWidth")),w=w,i===kr||(i===Ar||i===vi)&&o===ah){b=yi;var k=d&&w===_&&_.visualViewport?_.visualViewport.height:w[x];m-=k-r.height,m*=l?1:-1}if(i===Ar||(i===kr||i===yi)&&o===ah){g=vi;var P=d&&w===_&&_.visualViewport?_.visualViewport.width:w[C];h-=P-r.width,h*=l?1:-1}}var A=Object.assign({position:a},u&&Aae),$=c===!0?Oae({x:h,y:m},Hr(n)):{x:h,y:m};if(h=$.x,m=$.y,l){var N;return Object.assign({},A,(N={},N[b]=y?"0":"",N[g]=v?"0":"",N.transform=(_.devicePixelRatio||1)<=1?"translate("+h+"px, "+m+"px)":"translate3d("+h+"px, "+m+"px, 0)",N))}return Object.assign({},A,(t={},t[b]=y?m+"px":"",t[g]=v?h+"px":"",t.transform="",t))}function Rae(e){var t=e.state,n=e.options,r=n.gpuAcceleration,i=r===void 0?!0:r,o=n.adaptive,s=o===void 0?!0:o,a=n.roundOffsets,l=a===void 0?!0:a,u={placement:So(t.placement),variation:Rc(t.placement),popper:t.elements.popper,popperRect:t.rects.popper,gpuAcceleration:i,isFixed:t.options.strategy==="fixed"};t.modifiersData.popperOffsets!=null&&(t.styles.popper=Object.assign({},t.styles.popper,C6(Object.assign({},u,{offsets:t.modifiersData.popperOffsets,position:t.options.strategy,adaptive:s,roundOffsets:l})))),t.modifiersData.arrow!=null&&(t.styles.arrow=Object.assign({},t.styles.arrow,C6(Object.assign({},u,{offsets:t.modifiersData.arrow,position:"absolute",adaptive:!1,roundOffsets:l})))),t.attributes.popper=Object.assign({},t.attributes.popper,{"data-popper-placement":t.placement})}const Iae={name:"computeStyles",enabled:!0,phase:"beforeWrite",fn:Rae,data:{}};var yg={passive:!0};function Mae(e){var t=e.state,n=e.instance,r=e.options,i=r.scroll,o=i===void 0?!0:i,s=r.resize,a=s===void 0?!0:s,l=Hr(t.elements.popper),u=[].concat(t.scrollParents.reference,t.scrollParents.popper);return o&&u.forEach(function(c){c.addEventListener("scroll",n.update,yg)}),a&&l.addEventListener("resize",n.update,yg),function(){o&&u.forEach(function(c){c.removeEventListener("scroll",n.update,yg)}),a&&l.removeEventListener("resize",n.update,yg)}}const Nae={name:"eventListeners",enabled:!0,phase:"write",fn:function(){},effect:Mae,data:{}};var Dae={left:"right",right:"left",bottom:"top",top:"bottom"};function ym(e){return e.replace(/left|right|bottom|top/g,function(t){return Dae[t]})}var Lae={start:"end",end:"start"};function T6(e){return e.replace(/start|end/g,function(t){return Lae[t]})}function n3(e){var t=Hr(e),n=t.pageXOffset,r=t.pageYOffset;return{scrollLeft:n,scrollTop:r}}function r3(e){return Oc(Ra(e)).left+n3(e).scrollLeft}function $ae(e,t){var n=Hr(e),r=Ra(e),i=n.visualViewport,o=r.clientWidth,s=r.clientHeight,a=0,l=0;if(i){o=i.width,s=i.height;var u=WN();(u||!u&&t==="fixed")&&(a=i.offsetLeft,l=i.offsetTop)}return{width:o,height:s,x:a+r3(e),y:l}}function Fae(e){var t,n=Ra(e),r=n3(e),i=(t=e.ownerDocument)==null?void 0:t.body,o=ul(n.scrollWidth,n.clientWidth,i?i.scrollWidth:0,i?i.clientWidth:0),s=ul(n.scrollHeight,n.clientHeight,i?i.scrollHeight:0,i?i.clientHeight:0),a=-r.scrollLeft+r3(e),l=-r.scrollTop;return ps(i||n).direction==="rtl"&&(a+=ul(n.clientWidth,i?i.clientWidth:0)-o),{width:o,height:s,x:a,y:l}}function i3(e){var t=ps(e),n=t.overflow,r=t.overflowX,i=t.overflowY;return/auto|scroll|overlay|hidden/.test(n+i+r)}function ZN(e){return["html","body","#document"].indexOf(wo(e))>=0?e.ownerDocument.body:hi(e)&&i3(e)?e:ZN(Uv(e))}function vf(e,t){var n;t===void 0&&(t=[]);var r=ZN(e),i=r===((n=e.ownerDocument)==null?void 0:n.body),o=Hr(r),s=i?[o].concat(o.visualViewport||[],i3(r)?r:[]):r,a=t.concat(s);return i?a:a.concat(vf(Uv(s)))}function Nw(e){return Object.assign({},e,{left:e.x,top:e.y,right:e.x+e.width,bottom:e.y+e.height})}function Bae(e,t){var n=Oc(e,!1,t==="fixed");return n.top=n.top+e.clientTop,n.left=n.left+e.clientLeft,n.bottom=n.top+e.clientHeight,n.right=n.left+e.clientWidth,n.width=e.clientWidth,n.height=e.clientHeight,n.x=n.left,n.y=n.top,n}function E6(e,t,n){return t===HN?Nw($ae(e,n)):wl(t)?Bae(t,n):Nw(Fae(Ra(e)))}function jae(e){var t=vf(Uv(e)),n=["absolute","fixed"].indexOf(ps(e).position)>=0,r=n&&hi(e)?yp(e):e;return wl(r)?t.filter(function(i){return wl(i)&&KN(i,r)&&wo(i)!=="body"}):[]}function Vae(e,t,n,r){var i=t==="clippingParents"?jae(e):[].concat(t),o=[].concat(i,[n]),s=o[0],a=o.reduce(function(l,u){var c=E6(e,u,r);return l.top=ul(c.top,l.top),l.right=My(c.right,l.right),l.bottom=My(c.bottom,l.bottom),l.left=ul(c.left,l.left),l},E6(e,s,r));return a.width=a.right-a.left,a.height=a.bottom-a.top,a.x=a.left,a.y=a.top,a}function JN(e){var t=e.reference,n=e.element,r=e.placement,i=r?So(r):null,o=r?Rc(r):null,s=t.x+t.width/2-n.width/2,a=t.y+t.height/2-n.height/2,l;switch(i){case kr:l={x:s,y:t.y-n.height};break;case yi:l={x:s,y:t.y+t.height};break;case vi:l={x:t.x+t.width,y:a};break;case Ar:l={x:t.x-n.width,y:a};break;default:l={x:t.x,y:t.y}}var u=i?t3(i):null;if(u!=null){var c=u==="y"?"height":"width";switch(o){case kc:l[u]=l[u]-(t[c]/2-n[c]/2);break;case ah:l[u]=l[u]+(t[c]/2-n[c]/2);break}}return l}function lh(e,t){t===void 0&&(t={});var n=t,r=n.placement,i=r===void 0?e.placement:r,o=n.strategy,s=o===void 0?e.strategy:o,a=n.boundary,l=a===void 0?aae:a,u=n.rootBoundary,c=u===void 0?HN:u,d=n.elementContext,f=d===void 0?Td:d,h=n.altBoundary,p=h===void 0?!1:h,m=n.padding,S=m===void 0?0:m,v=XN(typeof S!="number"?S:QN(S,mp)),y=f===Td?lae:Td,g=e.rects.popper,b=e.elements[p?y:f],_=Vae(wl(b)?b:b.contextElement||Ra(e.elements.popper),l,c,s),w=Oc(e.elements.reference),x=JN({reference:w,element:g,strategy:"absolute",placement:i}),C=Nw(Object.assign({},g,x)),k=f===Td?C:w,P={top:_.top-k.top+v.top,bottom:k.bottom-_.bottom+v.bottom,left:_.left-k.left+v.left,right:k.right-_.right+v.right},A=e.modifiersData.offset;if(f===Td&&A){var $=A[i];Object.keys(P).forEach(function(N){var T=[vi,yi].indexOf(N)>=0?1:-1,O=[kr,yi].indexOf(N)>=0?"y":"x";P[N]+=$[O]*T})}return P}function zae(e,t){t===void 0&&(t={});var n=t,r=n.placement,i=n.boundary,o=n.rootBoundary,s=n.padding,a=n.flipVariations,l=n.allowedAutoPlacements,u=l===void 0?qN:l,c=Rc(r),d=c?a?w6:w6.filter(function(p){return Rc(p)===c}):mp,f=d.filter(function(p){return u.indexOf(p)>=0});f.length===0&&(f=d);var h=f.reduce(function(p,m){return p[m]=lh(e,{placement:m,boundary:i,rootBoundary:o,padding:s})[So(m)],p},{});return Object.keys(h).sort(function(p,m){return h[p]-h[m]})}function Uae(e){if(So(e)===Z5)return[];var t=ym(e);return[T6(e),t,T6(t)]}function Gae(e){var t=e.state,n=e.options,r=e.name;if(!t.modifiersData[r]._skip){for(var i=n.mainAxis,o=i===void 0?!0:i,s=n.altAxis,a=s===void 0?!0:s,l=n.fallbackPlacements,u=n.padding,c=n.boundary,d=n.rootBoundary,f=n.altBoundary,h=n.flipVariations,p=h===void 0?!0:h,m=n.allowedAutoPlacements,S=t.options.placement,v=So(S),y=v===S,g=l||(y||!p?[ym(S)]:Uae(S)),b=[S].concat(g).reduce(function(K,W){return K.concat(So(W)===Z5?zae(t,{placement:W,boundary:c,rootBoundary:d,padding:u,flipVariations:p,allowedAutoPlacements:m}):W)},[]),_=t.rects.reference,w=t.rects.popper,x=new Map,C=!0,k=b[0],P=0;P=0,O=T?"width":"height",I=lh(t,{placement:A,boundary:c,rootBoundary:d,altBoundary:f,padding:u}),M=T?N?vi:Ar:N?yi:kr;_[O]>w[O]&&(M=ym(M));var R=ym(M),D=[];if(o&&D.push(I[$]<=0),a&&D.push(I[M]<=0,I[R]<=0),D.every(function(K){return K})){k=A,C=!1;break}x.set(A,D)}if(C)for(var L=p?3:1,V=function(W){var X=b.find(function(F){var q=x.get(F);if(q)return q.slice(0,W).every(function(Q){return Q})});if(X)return k=X,"break"},z=L;z>0;z--){var U=V(z);if(U==="break")break}t.placement!==k&&(t.modifiersData[r]._skip=!0,t.placement=k,t.reset=!0)}}const Hae={name:"flip",enabled:!0,phase:"main",fn:Gae,requiresIfExists:["offset"],data:{_skip:!1}};function P6(e,t,n){return n===void 0&&(n={x:0,y:0}),{top:e.top-t.height-n.y,right:e.right-t.width+n.x,bottom:e.bottom-t.height+n.y,left:e.left-t.width-n.x}}function k6(e){return[kr,vi,yi,Ar].some(function(t){return e[t]>=0})}function qae(e){var t=e.state,n=e.name,r=t.rects.reference,i=t.rects.popper,o=t.modifiersData.preventOverflow,s=lh(t,{elementContext:"reference"}),a=lh(t,{altBoundary:!0}),l=P6(s,r),u=P6(a,i,o),c=k6(l),d=k6(u);t.modifiersData[n]={referenceClippingOffsets:l,popperEscapeOffsets:u,isReferenceHidden:c,hasPopperEscaped:d},t.attributes.popper=Object.assign({},t.attributes.popper,{"data-popper-reference-hidden":c,"data-popper-escaped":d})}const Wae={name:"hide",enabled:!0,phase:"main",requiresIfExists:["preventOverflow"],fn:qae};function Kae(e,t,n){var r=So(e),i=[Ar,kr].indexOf(r)>=0?-1:1,o=typeof n=="function"?n(Object.assign({},t,{placement:e})):n,s=o[0],a=o[1];return s=s||0,a=(a||0)*i,[Ar,vi].indexOf(r)>=0?{x:a,y:s}:{x:s,y:a}}function Yae(e){var t=e.state,n=e.options,r=e.name,i=n.offset,o=i===void 0?[0,0]:i,s=qN.reduce(function(c,d){return c[d]=Kae(d,t.rects,o),c},{}),a=s[t.placement],l=a.x,u=a.y;t.modifiersData.popperOffsets!=null&&(t.modifiersData.popperOffsets.x+=l,t.modifiersData.popperOffsets.y+=u),t.modifiersData[r]=s}const Xae={name:"offset",enabled:!0,phase:"main",requires:["popperOffsets"],fn:Yae};function Qae(e){var t=e.state,n=e.name;t.modifiersData[n]=JN({reference:t.rects.reference,element:t.rects.popper,strategy:"absolute",placement:t.placement})}const Zae={name:"popperOffsets",enabled:!0,phase:"read",fn:Qae,data:{}};function Jae(e){return e==="x"?"y":"x"}function ele(e){var t=e.state,n=e.options,r=e.name,i=n.mainAxis,o=i===void 0?!0:i,s=n.altAxis,a=s===void 0?!1:s,l=n.boundary,u=n.rootBoundary,c=n.altBoundary,d=n.padding,f=n.tether,h=f===void 0?!0:f,p=n.tetherOffset,m=p===void 0?0:p,S=lh(t,{boundary:l,rootBoundary:u,padding:d,altBoundary:c}),v=So(t.placement),y=Rc(t.placement),g=!y,b=t3(v),_=Jae(b),w=t.modifiersData.popperOffsets,x=t.rects.reference,C=t.rects.popper,k=typeof m=="function"?m(Object.assign({},t.rects,{placement:t.placement})):m,P=typeof k=="number"?{mainAxis:k,altAxis:k}:Object.assign({mainAxis:0,altAxis:0},k),A=t.modifiersData.offset?t.modifiersData.offset[t.placement]:null,$={x:0,y:0};if(w){if(o){var N,T=b==="y"?kr:Ar,O=b==="y"?yi:vi,I=b==="y"?"height":"width",M=w[b],R=M+S[T],D=M-S[O],L=h?-C[I]/2:0,V=y===kc?x[I]:C[I],z=y===kc?-C[I]:-x[I],U=t.elements.arrow,K=h&&U?e3(U):{width:0,height:0},W=t.modifiersData["arrow#persistent"]?t.modifiersData["arrow#persistent"].padding:YN(),X=W[T],F=W[O],q=yf(0,x[I],K[I]),Q=g?x[I]/2-L-q-X-P.mainAxis:V-q-X-P.mainAxis,J=g?-x[I]/2+L+q+F+P.mainAxis:z+q+F+P.mainAxis,ne=t.elements.arrow&&yp(t.elements.arrow),Z=ne?b==="y"?ne.clientTop||0:ne.clientLeft||0:0,me=(N=A==null?void 0:A[b])!=null?N:0,ae=M+Q-me-Z,oe=M+J-me,Ce=yf(h?My(R,ae):R,M,h?ul(D,oe):D);w[b]=Ce,$[b]=Ce-M}if(a){var se,qe=b==="x"?kr:Ar,yt=b==="x"?yi:vi,$e=w[_],Fe=_==="y"?"height":"width",Ie=$e+S[qe],nt=$e-S[yt],xt=[kr,Ar].indexOf(v)!==-1,yn=(se=A==null?void 0:A[_])!=null?se:0,an=xt?Ie:$e-x[Fe]-C[Fe]-yn+P.altAxis,Ot=xt?$e+x[Fe]+C[Fe]-yn-P.altAxis:nt,ee=h&&xt?Cae(an,$e,Ot):yf(h?an:Ie,$e,h?Ot:nt);w[_]=ee,$[_]=ee-$e}t.modifiersData[r]=$}}const tle={name:"preventOverflow",enabled:!0,phase:"main",fn:ele,requiresIfExists:["offset"]};function nle(e){return{scrollLeft:e.scrollLeft,scrollTop:e.scrollTop}}function rle(e){return e===Hr(e)||!hi(e)?n3(e):nle(e)}function ile(e){var t=e.getBoundingClientRect(),n=Ac(t.width)/e.offsetWidth||1,r=Ac(t.height)/e.offsetHeight||1;return n!==1||r!==1}function ole(e,t,n){n===void 0&&(n=!1);var r=hi(t),i=hi(t)&&ile(t),o=Ra(t),s=Oc(e,i,n),a={scrollLeft:0,scrollTop:0},l={x:0,y:0};return(r||!r&&!n)&&((wo(t)!=="body"||i3(o))&&(a=rle(t)),hi(t)?(l=Oc(t,!0),l.x+=t.clientLeft,l.y+=t.clientTop):o&&(l.x=r3(o))),{x:s.left+a.scrollLeft-l.x,y:s.top+a.scrollTop-l.y,width:s.width,height:s.height}}function sle(e){var t=new Map,n=new Set,r=[];e.forEach(function(o){t.set(o.name,o)});function i(o){n.add(o.name);var s=[].concat(o.requires||[],o.requiresIfExists||[]);s.forEach(function(a){if(!n.has(a)){var l=t.get(a);l&&i(l)}}),r.push(o)}return e.forEach(function(o){n.has(o.name)||i(o)}),r}function ale(e){var t=sle(e);return vae.reduce(function(n,r){return n.concat(t.filter(function(i){return i.phase===r}))},[])}function lle(e){var t;return function(){return t||(t=new Promise(function(n){Promise.resolve().then(function(){t=void 0,n(e())})})),t}}function ule(e){var t=e.reduce(function(n,r){var i=n[r.name];return n[r.name]=i?Object.assign({},i,r,{options:Object.assign({},i.options,r.options),data:Object.assign({},i.data,r.data)}):r,n},{});return Object.keys(t).map(function(n){return t[n]})}var A6={placement:"bottom",modifiers:[],strategy:"absolute"};function O6(){for(var e=arguments.length,t=new Array(e),n=0;n{}),g=E.useCallback(()=>{var P;!t||!p.current||!m.current||((P=y.current)==null||P.call(y),S.current=fle(p.current,m.current,{placement:v,modifiers:[rae,eae,Jse,{...Zse,enabled:!!f},{name:"eventListeners",...Qse(s)},{name:"arrow",options:{padding:o}},{name:"offset",options:{offset:a??[0,l]}},{name:"flip",enabled:!!u,options:{padding:8}},{name:"preventOverflow",enabled:!!d,options:{boundary:c}},...n??[]],strategy:i}),S.current.forceUpdate(),y.current=S.current.destroy)},[v,t,n,f,s,o,a,l,u,d,c,i]);E.useEffect(()=>()=>{var P;!p.current&&!m.current&&((P=S.current)==null||P.destroy(),S.current=null)},[]);const b=E.useCallback(P=>{p.current=P,g()},[g]),_=E.useCallback((P={},A=null)=>({...P,ref:fi(b,A)}),[b]),w=E.useCallback(P=>{m.current=P,g()},[g]),x=E.useCallback((P={},A=null)=>({...P,ref:fi(w,A),style:{...P.style,position:i,minWidth:f?void 0:"max-content",inset:"0 auto auto 0"}}),[i,w,f]),C=E.useCallback((P={},A=null)=>{const{size:$,shadowColor:N,bg:T,style:O,...I}=P;return{...I,ref:A,"data-popper-arrow":"",style:ple(P)}},[]),k=E.useCallback((P={},A=null)=>({...P,ref:A,"data-popper-arrow-inner":""}),[]);return{update(){var P;(P=S.current)==null||P.update()},forceUpdate(){var P;(P=S.current)==null||P.forceUpdate()},transformOrigin:Fn.transformOrigin.varRef,referenceRef:b,popperRef:w,getPopperProps:x,getArrowProps:C,getArrowInnerProps:k,getReferenceProps:_}}function ple(e){const{size:t,shadowColor:n,bg:r,style:i}=e,o={...i,position:"absolute"};return t&&(o["--popper-arrow-size"]=t),n&&(o["--popper-arrow-shadow-color"]=n),r&&(o["--popper-arrow-bg"]=r),o}function gle(e={}){const{onClose:t,onOpen:n,isOpen:r,id:i}=e,o=Bn(n),s=Bn(t),[a,l]=E.useState(e.defaultIsOpen||!1),u=r!==void 0?r:a,c=r!==void 0,d=E.useId(),f=i??`disclosure-${d}`,h=E.useCallback(()=>{c||l(!1),s==null||s()},[c,s]),p=E.useCallback(()=>{c||l(!0),o==null||o()},[c,o]),m=E.useCallback(()=>{u?h():p()},[u,p,h]);function S(y={}){return{...y,"aria-expanded":u,"aria-controls":f,onClick(g){var b;(b=y.onClick)==null||b.call(y,g),m()}}}function v(y={}){return{...y,hidden:!u,id:f}}return{isOpen:u,onOpen:p,onClose:h,onToggle:m,isControlled:c,getButtonProps:S,getDisclosureProps:v}}var mle=e=>j.jsx(jl,{viewBox:"0 0 24 24",...e,children:j.jsx("path",{fill:"currentColor",d:"M21,5H3C2.621,5,2.275,5.214,2.105,5.553C1.937,5.892,1.973,6.297,2.2,6.6l9,12 c0.188,0.252,0.485,0.4,0.8,0.4s0.611-0.148,0.8-0.4l9-12c0.228-0.303,0.264-0.708,0.095-1.047C21.725,5.214,21.379,5,21,5z"})}),yle=e=>j.jsx(jl,{viewBox:"0 0 24 24",...e,children:j.jsx("path",{fill:"currentColor",d:"M12.8,5.4c-0.377-0.504-1.223-0.504-1.6,0l-9,12c-0.228,0.303-0.264,0.708-0.095,1.047 C2.275,18.786,2.621,19,3,19h18c0.379,0,0.725-0.214,0.895-0.553c0.169-0.339,0.133-0.744-0.095-1.047L12.8,5.4z"})});function R6(e,t,n,r){E.useEffect(()=>{var i;if(!e.current||!r)return;const o=(i=e.current.ownerDocument.defaultView)!=null?i:window,s=Array.isArray(t)?t:[t],a=new o.MutationObserver(l=>{for(const u of l)u.type==="attributes"&&u.attributeName&&s.includes(u.attributeName)&&n(u)});return a.observe(e.current,{attributes:!0,attributeFilter:s}),()=>a.disconnect()})}function vle(e,t){const n=Bn(e);E.useEffect(()=>{let r=null;const i=()=>n();return t!==null&&(r=window.setInterval(i,t)),()=>{r&&window.clearInterval(r)}},[t,n])}var ble=50,I6=300;function Sle(e,t){const[n,r]=E.useState(!1),[i,o]=E.useState(null),[s,a]=E.useState(!0),l=E.useRef(null),u=()=>clearTimeout(l.current);vle(()=>{i==="increment"&&e(),i==="decrement"&&t()},n?ble:null);const c=E.useCallback(()=>{s&&e(),l.current=setTimeout(()=>{a(!1),r(!0),o("increment")},I6)},[e,s]),d=E.useCallback(()=>{s&&t(),l.current=setTimeout(()=>{a(!1),r(!0),o("decrement")},I6)},[t,s]),f=E.useCallback(()=>{a(!0),r(!1),u()},[]);return E.useEffect(()=>()=>u(),[]),{up:c,down:d,stop:f,isSpinning:n}}var _le=/^[Ee0-9+\-.]$/;function wle(e){return _le.test(e)}function xle(e,t){if(e.key==null)return!0;const n=e.ctrlKey||e.altKey||e.metaKey;return!(e.key.length===1)||n?!0:t(e.key)}function Cle(e={}){const{focusInputOnChange:t=!0,clampValueOnBlur:n=!0,keepWithinRange:r=!0,min:i=Number.MIN_SAFE_INTEGER,max:o=Number.MAX_SAFE_INTEGER,step:s=1,isReadOnly:a,isDisabled:l,isRequired:u,isInvalid:c,pattern:d="[0-9]*(.[0-9]+)?",inputMode:f="decimal",allowMouseWheel:h,id:p,onChange:m,precision:S,name:v,"aria-describedby":y,"aria-label":g,"aria-labelledby":b,onFocus:_,onBlur:w,onInvalid:x,getAriaValueText:C,isValidCharacter:k,format:P,parse:A,...$}=e,N=Bn(_),T=Bn(w),O=Bn(x),I=Bn(k??wle),M=Bn(C),R=Fse(e),{update:D,increment:L,decrement:V}=R,[z,U]=E.useState(!1),K=!(a||l),W=E.useRef(null),X=E.useRef(null),F=E.useRef(null),q=E.useRef(null),Q=E.useCallback(ee=>ee.split("").filter(I).join(""),[I]),J=E.useCallback(ee=>{var Se;return(Se=A==null?void 0:A(ee))!=null?Se:ee},[A]),ne=E.useCallback(ee=>{var Se;return((Se=P==null?void 0:P(ee))!=null?Se:ee).toString()},[P]);xy(()=>{(R.valueAsNumber>o||R.valueAsNumber{if(!W.current)return;if(W.current.value!=R.value){const Se=J(W.current.value);R.setValue(Q(Se))}},[J,Q]);const Z=E.useCallback((ee=s)=>{K&&L(ee)},[L,K,s]),me=E.useCallback((ee=s)=>{K&&V(ee)},[V,K,s]),ae=Sle(Z,me);R6(F,"disabled",ae.stop,ae.isSpinning),R6(q,"disabled",ae.stop,ae.isSpinning);const oe=E.useCallback(ee=>{if(ee.nativeEvent.isComposing)return;const Te=J(ee.currentTarget.value);D(Q(Te)),X.current={start:ee.currentTarget.selectionStart,end:ee.currentTarget.selectionEnd}},[D,Q,J]),Ce=E.useCallback(ee=>{var Se,Te,Me;N==null||N(ee),X.current&&(ee.target.selectionStart=(Te=X.current.start)!=null?Te:(Se=ee.currentTarget.value)==null?void 0:Se.length,ee.currentTarget.selectionEnd=(Me=X.current.end)!=null?Me:ee.currentTarget.selectionStart)},[N]),se=E.useCallback(ee=>{if(ee.nativeEvent.isComposing)return;xle(ee,I)||ee.preventDefault();const Se=qe(ee)*s,Te=ee.key,ie={ArrowUp:()=>Z(Se),ArrowDown:()=>me(Se),Home:()=>D(i),End:()=>D(o)}[Te];ie&&(ee.preventDefault(),ie(ee))},[I,s,Z,me,D,i,o]),qe=ee=>{let Se=1;return(ee.metaKey||ee.ctrlKey)&&(Se=.1),ee.shiftKey&&(Se=10),Se},yt=E.useMemo(()=>{const ee=M==null?void 0:M(R.value);if(ee!=null)return ee;const Se=R.value.toString();return Se||void 0},[R.value,M]),$e=E.useCallback(()=>{let ee=R.value;if(R.value==="")return;/^[eE]/.test(R.value.toString())?R.setValue(""):(R.valueAsNumbero&&(ee=o),R.cast(ee))},[R,o,i]),Fe=E.useCallback(()=>{U(!1),n&&$e()},[n,U,$e]),Ie=E.useCallback(()=>{t&&requestAnimationFrame(()=>{var ee;(ee=W.current)==null||ee.focus()})},[t]),nt=E.useCallback(ee=>{ee.preventDefault(),ae.up(),Ie()},[Ie,ae]),xt=E.useCallback(ee=>{ee.preventDefault(),ae.down(),Ie()},[Ie,ae]);mm(()=>W.current,"wheel",ee=>{var Se,Te;const ie=((Te=(Se=W.current)==null?void 0:Se.ownerDocument)!=null?Te:document).activeElement===W.current;if(!h||!ie)return;ee.preventDefault();const pe=qe(ee)*s,Qt=Math.sign(ee.deltaY);Qt===-1?Z(pe):Qt===1&&me(pe)},{passive:!1});const yn=E.useCallback((ee={},Se=null)=>{const Te=l||r&&R.isAtMax;return{...ee,ref:fi(Se,F),role:"button",tabIndex:-1,onPointerDown:Ln(ee.onPointerDown,Me=>{Me.button!==0||Te||nt(Me)}),onPointerLeave:Ln(ee.onPointerLeave,ae.stop),onPointerUp:Ln(ee.onPointerUp,ae.stop),disabled:Te,"aria-disabled":tc(Te)}},[R.isAtMax,r,nt,ae.stop,l]),an=E.useCallback((ee={},Se=null)=>{const Te=l||r&&R.isAtMin;return{...ee,ref:fi(Se,q),role:"button",tabIndex:-1,onPointerDown:Ln(ee.onPointerDown,Me=>{Me.button!==0||Te||xt(Me)}),onPointerLeave:Ln(ee.onPointerLeave,ae.stop),onPointerUp:Ln(ee.onPointerUp,ae.stop),disabled:Te,"aria-disabled":tc(Te)}},[R.isAtMin,r,xt,ae.stop,l]),Ot=E.useCallback((ee={},Se=null)=>{var Te,Me,ie,pe;return{name:v,inputMode:f,type:"text",pattern:d,"aria-labelledby":b,"aria-label":g,"aria-describedby":y,id:p,disabled:l,...ee,readOnly:(Te=ee.readOnly)!=null?Te:a,"aria-readonly":(Me=ee.readOnly)!=null?Me:a,"aria-required":(ie=ee.required)!=null?ie:u,required:(pe=ee.required)!=null?pe:u,ref:fi(W,Se),value:ne(R.value),role:"spinbutton","aria-valuemin":i,"aria-valuemax":o,"aria-valuenow":Number.isNaN(R.valueAsNumber)?void 0:R.valueAsNumber,"aria-invalid":tc(c??R.isOutOfRange),"aria-valuetext":yt,autoComplete:"off",autoCorrect:"off",onChange:Ln(ee.onChange,oe),onKeyDown:Ln(ee.onKeyDown,se),onFocus:Ln(ee.onFocus,Ce,()=>U(!0)),onBlur:Ln(ee.onBlur,T,Fe)}},[v,f,d,b,g,ne,y,p,l,u,a,c,R.value,R.valueAsNumber,R.isOutOfRange,i,o,yt,oe,se,Ce,T,Fe]);return{value:ne(R.value),valueAsNumber:R.valueAsNumber,isFocused:z,isDisabled:l,isReadOnly:a,getIncrementButtonProps:yn,getDecrementButtonProps:an,getInputProps:Ot,htmlProps:$}}var[Tle,Gv]=Si({name:"NumberInputStylesContext",errorMessage:`useNumberInputStyles returned is 'undefined'. Seems you forgot to wrap the components in "" `}),[Ele,o3]=Si({name:"NumberInputContext",errorMessage:"useNumberInputContext: `context` is undefined. Seems you forgot to wrap number-input's components within "}),eD=Qe(function(t,n){const r=Mv("NumberInput",t),i=Oo(t),o=DN(i),{htmlProps:s,...a}=Cle(o),l=E.useMemo(()=>a,[a]);return j.jsx(Ele,{value:l,children:j.jsx(Tle,{value:r,children:j.jsx(ke.div,{...s,ref:n,className:Gn("chakra-numberinput",t.className),__css:{position:"relative",zIndex:0,...r.root}})})})});eD.displayName="NumberInput";var tD=Qe(function(t,n){const r=Gv();return j.jsx(ke.div,{"aria-hidden":!0,ref:n,...t,__css:{display:"flex",flexDirection:"column",position:"absolute",top:"0",insetEnd:"0px",margin:"1px",height:"calc(100% - 2px)",zIndex:1,...r.stepperGroup}})});tD.displayName="NumberInputStepper";var nD=Qe(function(t,n){const{getInputProps:r}=o3(),i=r(t,n),o=Gv();return j.jsx(ke.input,{...i,className:Gn("chakra-numberinput__field",t.className),__css:{width:"100%",...o.field}})});nD.displayName="NumberInputField";var rD=ke("div",{baseStyle:{display:"flex",justifyContent:"center",alignItems:"center",flex:1,transitionProperty:"common",transitionDuration:"normal",userSelect:"none",cursor:"pointer",lineHeight:"normal"}}),iD=Qe(function(t,n){var r;const i=Gv(),{getDecrementButtonProps:o}=o3(),s=o(t,n);return j.jsx(rD,{...s,__css:i.stepper,children:(r=t.children)!=null?r:j.jsx(mle,{})})});iD.displayName="NumberDecrementStepper";var oD=Qe(function(t,n){var r;const{getIncrementButtonProps:i}=o3(),o=i(t,n),s=Gv();return j.jsx(rD,{...o,__css:s.stepper,children:(r=t.children)!=null?r:j.jsx(yle,{})})});oD.displayName="NumberIncrementStepper";var iu=e=>e?"":void 0,e_=e=>e?!0:void 0,vp=(...e)=>e.filter(Boolean).join(" ");function t_(...e){return function(n){e.some(r=>(r==null||r(n),n==null?void 0:n.defaultPrevented))}}function cEe(e){return{root:`slider-root-${e}`,getThumb:t=>`slider-thumb-${e}-${t}`,getInput:t=>`slider-input-${e}-${t}`,track:`slider-track-${e}`,innerTrack:`slider-filled-track-${e}`,getMarker:t=>`slider-marker-${e}-${t}`,output:`slider-output-${e}`}}function vg(e){const{orientation:t,vertical:n,horizontal:r}=e;return t==="vertical"?n:r}var vm={width:0,height:0},bg=e=>e||vm;function Ple(e){const{orientation:t,thumbPercents:n,thumbRects:r,isReversed:i}=e,o=m=>{var S;const v=(S=r[m])!=null?S:vm;return{position:"absolute",userSelect:"none",WebkitUserSelect:"none",MozUserSelect:"none",msUserSelect:"none",touchAction:"none",...vg({orientation:t,vertical:{bottom:`calc(${n[m]}% - ${v.height/2}px)`},horizontal:{left:`calc(${n[m]}% - ${v.width/2}px)`}})}},s=t==="vertical"?r.reduce((m,S)=>bg(m).height>bg(S).height?m:S,vm):r.reduce((m,S)=>bg(m).width>bg(S).width?m:S,vm),a={position:"relative",touchAction:"none",WebkitTapHighlightColor:"rgba(0,0,0,0)",userSelect:"none",outline:0,...vg({orientation:t,vertical:s?{paddingLeft:s.width/2,paddingRight:s.width/2}:{},horizontal:s?{paddingTop:s.height/2,paddingBottom:s.height/2}:{}})},l={position:"absolute",...vg({orientation:t,vertical:{left:"50%",transform:"translateX(-50%)",height:"100%"},horizontal:{top:"50%",transform:"translateY(-50%)",width:"100%"}})},u=n.length===1,c=[0,i?100-n[0]:n[0]],d=u?c:n;let f=d[0];!u&&i&&(f=100-f);const h=Math.abs(d[d.length-1]-d[0]),p={...l,...vg({orientation:t,vertical:i?{height:`${h}%`,top:`${f}%`}:{height:`${h}%`,bottom:`${f}%`},horizontal:i?{width:`${h}%`,right:`${f}%`}:{width:`${h}%`,left:`${f}%`}})};return{trackStyle:l,innerTrackStyle:p,rootStyle:a,getThumbStyle:o}}function kle(e){const{isReversed:t,direction:n,orientation:r}=e;return n==="ltr"||r==="vertical"?t:!t}function Ale(e,t,n,r){return e.addEventListener(t,n,r),()=>{e.removeEventListener(t,n,r)}}function Ole(e){const t=Ile(e);return typeof t.PointerEvent<"u"&&e instanceof t.PointerEvent?e.pointerType==="mouse":e instanceof t.MouseEvent}function sD(e){return!!e.touches}function Rle(e){return sD(e)&&e.touches.length>1}function Ile(e){var t;return(t=e.view)!=null?t:window}function Mle(e,t="page"){const n=e.touches[0]||e.changedTouches[0];return{x:n[`${t}X`],y:n[`${t}Y`]}}function Nle(e,t="page"){return{x:e[`${t}X`],y:e[`${t}Y`]}}function aD(e,t="page"){return sD(e)?Mle(e,t):Nle(e,t)}function Dle(e){return t=>{const n=Ole(t);(!n||n&&t.button===0)&&e(t)}}function Lle(e,t=!1){function n(i){e(i,{point:aD(i)})}return t?Dle(n):n}function bm(e,t,n,r){return Ale(e,t,Lle(n,t==="pointerdown"),r)}var $le=Object.defineProperty,Fle=(e,t,n)=>t in e?$le(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,xi=(e,t,n)=>(Fle(e,typeof t!="symbol"?t+"":t,n),n),Ble=class{constructor(e,t,n){xi(this,"history",[]),xi(this,"startEvent",null),xi(this,"lastEvent",null),xi(this,"lastEventInfo",null),xi(this,"handlers",{}),xi(this,"removeListeners",()=>{}),xi(this,"threshold",3),xi(this,"win"),xi(this,"updatePoint",()=>{if(!(this.lastEvent&&this.lastEventInfo))return;const a=n_(this.lastEventInfo,this.history),l=this.startEvent!==null,u=Ule(a.offset,{x:0,y:0})>=this.threshold;if(!l&&!u)return;const{timestamp:c}=oP();this.history.push({...a.point,timestamp:c});const{onStart:d,onMove:f}=this.handlers;l||(d==null||d(this.lastEvent,a),this.startEvent=this.lastEvent),f==null||f(this.lastEvent,a)}),xi(this,"onPointerMove",(a,l)=>{this.lastEvent=a,this.lastEventInfo=l,vte.update(this.updatePoint,!0)}),xi(this,"onPointerUp",(a,l)=>{const u=n_(l,this.history),{onEnd:c,onSessionEnd:d}=this.handlers;d==null||d(a,u),this.end(),!(!c||!this.startEvent)&&(c==null||c(a,u))});var r;if(this.win=(r=e.view)!=null?r:window,Rle(e))return;this.handlers=t,n&&(this.threshold=n),e.stopPropagation(),e.preventDefault();const i={point:aD(e)},{timestamp:o}=oP();this.history=[{...i.point,timestamp:o}];const{onSessionStart:s}=t;s==null||s(e,n_(i,this.history)),this.removeListeners=zle(bm(this.win,"pointermove",this.onPointerMove),bm(this.win,"pointerup",this.onPointerUp),bm(this.win,"pointercancel",this.onPointerUp))}updateHandlers(e){this.handlers=e}end(){var e;(e=this.removeListeners)==null||e.call(this),bte.update(this.updatePoint)}};function M6(e,t){return{x:e.x-t.x,y:e.y-t.y}}function n_(e,t){return{point:e.point,delta:M6(e.point,t[t.length-1]),offset:M6(e.point,t[0]),velocity:Vle(t,.1)}}var jle=e=>e*1e3;function Vle(e,t){if(e.length<2)return{x:0,y:0};let n=e.length-1,r=null;const i=e[e.length-1];for(;n>=0&&(r=e[n],!(i.timestamp-r.timestamp>jle(t)));)n--;if(!r)return{x:0,y:0};const o=(i.timestamp-r.timestamp)/1e3;if(o===0)return{x:0,y:0};const s={x:(i.x-r.x)/o,y:(i.y-r.y)/o};return s.x===1/0&&(s.x=0),s.y===1/0&&(s.y=0),s}function zle(...e){return t=>e.reduce((n,r)=>r(n),t)}function r_(e,t){return Math.abs(e-t)}function N6(e){return"x"in e&&"y"in e}function Ule(e,t){if(typeof e=="number"&&typeof t=="number")return r_(e,t);if(N6(e)&&N6(t)){const n=r_(e.x,t.x),r=r_(e.y,t.y);return Math.sqrt(n**2+r**2)}return 0}function lD(e){const t=E.useRef(null);return t.current=e,t}function Gle(e,t){const{onPan:n,onPanStart:r,onPanEnd:i,onPanSessionStart:o,onPanSessionEnd:s,threshold:a}=t,l=!!(n||r||i||o||s),u=E.useRef(null),c=lD({onSessionStart:o,onSessionEnd:s,onStart:r,onMove:n,onEnd(d,f){u.current=null,i==null||i(d,f)}});E.useEffect(()=>{var d;(d=u.current)==null||d.updateHandlers(c.current)}),E.useEffect(()=>{const d=e.current;if(!d||!l)return;function f(h){u.current=new Ble(h,c.current,a)}return bm(d,"pointerdown",f)},[e,l,c,a]),E.useEffect(()=>()=>{var d;(d=u.current)==null||d.end(),u.current=null},[])}function Hle(e,t){if(!e){t(void 0);return}t({width:e.offsetWidth,height:e.offsetHeight});const n=e.ownerDocument.defaultView??window,r=new n.ResizeObserver(i=>{if(!Array.isArray(i)||!i.length)return;const[o]=i;let s,a;if("borderBoxSize"in o){const l=o.borderBoxSize,u=Array.isArray(l)?l[0]:l;s=u.inlineSize,a=u.blockSize}else s=e.offsetWidth,a=e.offsetHeight;t({width:s,height:a})});return r.observe(e,{box:"border-box"}),()=>r.unobserve(e)}var qle=globalThis!=null&&globalThis.document?E.useLayoutEffect:E.useEffect;function Wle(e,t){var n,r;if(!e||!e.parentElement)return;const i=(r=(n=e.ownerDocument)==null?void 0:n.defaultView)!=null?r:window,o=new i.MutationObserver(()=>{t()});return o.observe(e.parentElement,{childList:!0}),()=>{o.disconnect()}}function Kle({getNodes:e,observeMutation:t=!0}){const[n,r]=E.useState([]),[i,o]=E.useState(0);return qle(()=>{const s=e(),a=s.map((l,u)=>Hle(l,c=>{r(d=>[...d.slice(0,u),c,...d.slice(u+1)])}));if(t){const l=s[0];a.push(Wle(l,()=>{o(u=>u+1)}))}return()=>{a.forEach(l=>{l==null||l()})}},[i]),n}function Yle(e){return typeof e=="object"&&e!==null&&"current"in e}function Xle(e){const[t]=Kle({observeMutation:!1,getNodes(){return[Yle(e)?e.current:e]}});return t}function Qle(e){var t;const{min:n=0,max:r=100,onChange:i,value:o,defaultValue:s,isReversed:a,direction:l="ltr",orientation:u="horizontal",id:c,isDisabled:d,isReadOnly:f,onChangeStart:h,onChangeEnd:p,step:m=1,getAriaValueText:S,"aria-valuetext":v,"aria-label":y,"aria-labelledby":g,name:b,focusThumbOnChange:_=!0,...w}=e,x=Bn(h),C=Bn(p),k=Bn(S),P=kle({isReversed:a,direction:l,orientation:u}),[A,$]=Tse({value:o,defaultValue:s??Jle(n,r),onChange:i}),[N,T]=E.useState(!1),[O,I]=E.useState(!1),M=!(d||f),R=(r-n)/10,D=m||(r-n)/100,L=gm(A,n,r),V=r-L+n,U=m6(P?V:L,n,r),K=u==="vertical",W=lD({min:n,max:r,step:m,isDisabled:d,value:L,isInteractive:M,isReversed:P,isVertical:K,eventSource:null,focusThumbOnChange:_,orientation:u}),X=E.useRef(null),F=E.useRef(null),q=E.useRef(null),Q=E.useId(),J=c??Q,[ne,Z]=[`slider-thumb-${J}`,`slider-track-${J}`],me=E.useCallback(ie=>{var pe,Qt;if(!X.current)return;const Rt=W.current;Rt.eventSource="pointer";const ut=X.current.getBoundingClientRect(),{clientX:nr,clientY:Lo}=(Qt=(pe=ie.touches)==null?void 0:pe[0])!=null?Qt:ie,Xr=K?ut.bottom-Lo:nr-ut.left,$o=K?ut.height:ut.width;let ct=Xr/$o;P&&(ct=1-ct);let We=$se(ct,Rt.min,Rt.max);return Rt.step&&(We=parseFloat(y6(We,Rt.min,Rt.step))),We=gm(We,Rt.min,Rt.max),We},[K,P,W]),ae=E.useCallback(ie=>{const pe=W.current;pe.isInteractive&&(ie=parseFloat(y6(ie,pe.min,D)),ie=gm(ie,pe.min,pe.max),$(ie))},[D,$,W]),oe=E.useMemo(()=>({stepUp(ie=D){const pe=P?L-ie:L+ie;ae(pe)},stepDown(ie=D){const pe=P?L+ie:L-ie;ae(pe)},reset(){ae(s||0)},stepTo(ie){ae(ie)}}),[ae,P,L,D,s]),Ce=E.useCallback(ie=>{const pe=W.current,Rt={ArrowRight:()=>oe.stepUp(),ArrowUp:()=>oe.stepUp(),ArrowLeft:()=>oe.stepDown(),ArrowDown:()=>oe.stepDown(),PageUp:()=>oe.stepUp(R),PageDown:()=>oe.stepDown(R),Home:()=>ae(pe.min),End:()=>ae(pe.max)}[ie.key];Rt&&(ie.preventDefault(),ie.stopPropagation(),Rt(ie),pe.eventSource="keyboard")},[oe,ae,R,W]),se=(t=k==null?void 0:k(L))!=null?t:v,qe=Xle(F),{getThumbStyle:yt,rootStyle:$e,trackStyle:Fe,innerTrackStyle:Ie}=E.useMemo(()=>{const ie=W.current,pe=qe??{width:0,height:0};return Ple({isReversed:P,orientation:ie.orientation,thumbRects:[pe],thumbPercents:[U]})},[P,qe,U,W]),nt=E.useCallback(()=>{W.current.focusThumbOnChange&&setTimeout(()=>{var pe;return(pe=F.current)==null?void 0:pe.focus()})},[W]);xy(()=>{const ie=W.current;nt(),ie.eventSource==="keyboard"&&(C==null||C(ie.value))},[L,C]);function xt(ie){const pe=me(ie);pe!=null&&pe!==W.current.value&&$(pe)}Gle(q,{onPanSessionStart(ie){const pe=W.current;pe.isInteractive&&(T(!0),nt(),xt(ie),x==null||x(pe.value))},onPanSessionEnd(){const ie=W.current;ie.isInteractive&&(T(!1),C==null||C(ie.value))},onPan(ie){W.current.isInteractive&&xt(ie)}});const yn=E.useCallback((ie={},pe=null)=>({...ie,...w,ref:fi(pe,q),tabIndex:-1,"aria-disabled":e_(d),"data-focused":iu(O),style:{...ie.style,...$e}}),[w,d,O,$e]),an=E.useCallback((ie={},pe=null)=>({...ie,ref:fi(pe,X),id:Z,"data-disabled":iu(d),style:{...ie.style,...Fe}}),[d,Z,Fe]),Ot=E.useCallback((ie={},pe=null)=>({...ie,ref:pe,style:{...ie.style,...Ie}}),[Ie]),ee=E.useCallback((ie={},pe=null)=>({...ie,ref:fi(pe,F),role:"slider",tabIndex:M?0:void 0,id:ne,"data-active":iu(N),"aria-valuetext":se,"aria-valuemin":n,"aria-valuemax":r,"aria-valuenow":L,"aria-orientation":u,"aria-disabled":e_(d),"aria-readonly":e_(f),"aria-label":y,"aria-labelledby":y?void 0:g,style:{...ie.style,...yt(0)},onKeyDown:t_(ie.onKeyDown,Ce),onFocus:t_(ie.onFocus,()=>I(!0)),onBlur:t_(ie.onBlur,()=>I(!1))}),[M,ne,N,se,n,r,L,u,d,f,y,g,yt,Ce]),Se=E.useCallback((ie,pe=null)=>{const Qt=!(ie.valuer),Rt=L>=ie.value,ut=m6(ie.value,n,r),nr={position:"absolute",pointerEvents:"none",...Zle({orientation:u,vertical:{bottom:P?`${100-ut}%`:`${ut}%`},horizontal:{left:P?`${100-ut}%`:`${ut}%`}})};return{...ie,ref:pe,role:"presentation","aria-hidden":!0,"data-disabled":iu(d),"data-invalid":iu(!Qt),"data-highlighted":iu(Rt),style:{...ie.style,...nr}}},[d,P,r,n,u,L]),Te=E.useCallback((ie={},pe=null)=>({...ie,ref:pe,type:"hidden",value:L,name:b}),[b,L]);return{state:{value:L,isFocused:O,isDragging:N},actions:oe,getRootProps:yn,getTrackProps:an,getInnerTrackProps:Ot,getThumbProps:ee,getMarkerProps:Se,getInputProps:Te}}function Zle(e){const{orientation:t,vertical:n,horizontal:r}=e;return t==="vertical"?n:r}function Jle(e,t){return t"}),[tue,qv]=Si({name:"SliderStylesContext",hookName:"useSliderStyles",providerName:""}),uD=Qe((e,t)=>{var n;const r={...e,orientation:(n=e==null?void 0:e.orientation)!=null?n:"horizontal"},i=Mv("Slider",r),o=Oo(r),{direction:s}=Av();o.direction=s;const{getInputProps:a,getRootProps:l,...u}=Qle(o),c=l(),d=a({},t);return j.jsx(eue,{value:u,children:j.jsx(tue,{value:i,children:j.jsxs(ke.div,{...c,className:vp("chakra-slider",r.className),__css:i.container,children:[r.children,j.jsx("input",{...d})]})})})});uD.displayName="Slider";var cD=Qe((e,t)=>{const{getThumbProps:n}=Hv(),r=qv(),i=n(e,t);return j.jsx(ke.div,{...i,className:vp("chakra-slider__thumb",e.className),__css:r.thumb})});cD.displayName="SliderThumb";var dD=Qe((e,t)=>{const{getTrackProps:n}=Hv(),r=qv(),i=n(e,t);return j.jsx(ke.div,{...i,className:vp("chakra-slider__track",e.className),__css:r.track})});dD.displayName="SliderTrack";var fD=Qe((e,t)=>{const{getInnerTrackProps:n}=Hv(),r=qv(),i=n(e,t);return j.jsx(ke.div,{...i,className:vp("chakra-slider__filled-track",e.className),__css:r.filledTrack})});fD.displayName="SliderFilledTrack";var vu=Qe((e,t)=>{const{getMarkerProps:n}=Hv(),r=qv(),i=n(e,t);return j.jsx(ke.div,{...i,className:vp("chakra-slider__marker",e.className),__css:r.mark})});vu.displayName="SliderMark";var nue={exit:{scale:.85,opacity:0,transition:{opacity:{duration:.15,easings:"easeInOut"},scale:{duration:.2,easings:"easeInOut"}}},enter:{scale:1,opacity:1,transition:{opacity:{easings:"easeOut",duration:.2},scale:{duration:.2,ease:[.175,.885,.4,1.1]}}}},Dw=e=>{var t;return((t=e.current)==null?void 0:t.ownerDocument)||document},Sm=e=>{var t,n;return((n=(t=e.current)==null?void 0:t.ownerDocument)==null?void 0:n.defaultView)||window};function rue(e={}){const{openDelay:t=0,closeDelay:n=0,closeOnClick:r=!0,closeOnMouseDown:i,closeOnScroll:o,closeOnPointerDown:s=i,closeOnEsc:a=!0,onOpen:l,onClose:u,placement:c,id:d,isOpen:f,defaultIsOpen:h,arrowSize:p=10,arrowShadowColor:m,arrowPadding:S,modifiers:v,isDisabled:y,gutter:g,offset:b,direction:_,...w}=e,{isOpen:x,onOpen:C,onClose:k}=gle({isOpen:f,defaultIsOpen:h,onOpen:l,onClose:u}),{referenceRef:P,getPopperProps:A,getArrowInnerProps:$,getArrowProps:N}=hle({enabled:x,placement:c,arrowPadding:S,modifiers:v,gutter:g,offset:b,direction:_}),T=E.useId(),I=`tooltip-${d??T}`,M=E.useRef(null),R=E.useRef(),D=E.useCallback(()=>{R.current&&(clearTimeout(R.current),R.current=void 0)},[]),L=E.useRef(),V=E.useCallback(()=>{L.current&&(clearTimeout(L.current),L.current=void 0)},[]),z=E.useCallback(()=>{V(),k()},[k,V]),U=iue(M,z),K=E.useCallback(()=>{if(!y&&!R.current){U();const Z=Sm(M);R.current=Z.setTimeout(C,t)}},[U,y,C,t]),W=E.useCallback(()=>{D();const Z=Sm(M);L.current=Z.setTimeout(z,n)},[n,z,D]),X=E.useCallback(()=>{x&&r&&W()},[r,W,x]),F=E.useCallback(()=>{x&&s&&W()},[s,W,x]),q=E.useCallback(Z=>{x&&Z.key==="Escape"&&W()},[x,W]);mm(()=>Dw(M),"keydown",a?q:void 0),mm(()=>{const Z=M.current;if(!Z)return null;const me=BN(Z);return me.localName==="body"?Sm(M):me},"scroll",()=>{x&&o&&z()},{passive:!0,capture:!0}),E.useEffect(()=>{y&&(D(),x&&k())},[y,x,k,D]),E.useEffect(()=>()=>{D(),V()},[D,V]),mm(()=>M.current,"pointerleave",W);const Q=E.useCallback((Z={},me=null)=>({...Z,ref:fi(M,me,P),onPointerEnter:Ln(Z.onPointerEnter,oe=>{oe.pointerType!=="touch"&&K()}),onClick:Ln(Z.onClick,X),onPointerDown:Ln(Z.onPointerDown,F),onFocus:Ln(Z.onFocus,K),onBlur:Ln(Z.onBlur,W),"aria-describedby":x?I:void 0}),[K,W,F,x,I,X,P]),J=E.useCallback((Z={},me=null)=>A({...Z,style:{...Z.style,[Fn.arrowSize.var]:p?`${p}px`:void 0,[Fn.arrowShadowColor.var]:m}},me),[A,p,m]),ne=E.useCallback((Z={},me=null)=>{const ae={...Z.style,position:"relative",transformOrigin:Fn.transformOrigin.varRef};return{ref:me,...w,...Z,id:I,role:"tooltip",style:ae}},[w,I]);return{isOpen:x,show:K,hide:W,getTriggerProps:Q,getTooltipProps:ne,getTooltipPositionerProps:J,getArrowProps:N,getArrowInnerProps:$}}var i_="chakra-ui:close-tooltip";function iue(e,t){return E.useEffect(()=>{const n=Dw(e);return n.addEventListener(i_,t),()=>n.removeEventListener(i_,t)},[t,e]),()=>{const n=Dw(e),r=Sm(e);n.dispatchEvent(new r.CustomEvent(i_))}}function oue(e,t=[]){const n=Object.assign({},e);for(const r of t)r in n&&delete n[r];return n}function sue(e,t){const n={};for(const r of t)r in e&&(n[r]=e[r]);return n}var aue=ke(G5.div),s3=Qe((e,t)=>{var n,r;const i=$l("Tooltip",e),o=Oo(e),s=Av(),{children:a,label:l,shouldWrapChildren:u,"aria-label":c,hasArrow:d,bg:f,portalProps:h,background:p,backgroundColor:m,bgColor:S,motionProps:v,...y}=o,g=(r=(n=p??m)!=null?n:f)!=null?r:S;if(g){i.bg=g;const A=ite(s,"colors",g);i[Fn.arrowBg.var]=A}const b=rue({...y,direction:s.direction}),_=typeof a=="string"||u;let w;if(_)w=j.jsx(ke.span,{display:"inline-block",tabIndex:0,...b.getTriggerProps(),children:a});else{const A=E.Children.only(a);w=E.cloneElement(A,b.getTriggerProps(A.props,A.ref))}const x=!!c,C=b.getTooltipProps({},t),k=x?oue(C,["role","id"]):C,P=sue(C,["role","id"]);return l?j.jsxs(j.Fragment,{children:[w,j.jsx(H5,{children:b.isOpen&&j.jsx(up,{...h,children:j.jsx(ke.div,{...b.getTooltipPositionerProps(),__css:{zIndex:i.zIndex,pointerEvents:"none"},children:j.jsxs(aue,{variants:nue,initial:"exit",animate:"enter",exit:"exit",...v,...k,__css:i,children:[l,x&&j.jsx(ke.span,{srOnly:!0,...P,children:c}),d&&j.jsx(ke.div,{"data-popper-arrow":!0,className:"chakra-tooltip__arrow-wrapper",children:j.jsx(ke.div,{"data-popper-arrow-inner":!0,className:"chakra-tooltip__arrow",__css:{bg:i.bg}})})]})})})})]}):j.jsx(j.Fragment,{children:a})});s3.displayName="Tooltip";const hD={shift:!1},pD=Vt({name:"hotkeys",initialState:hD,reducers:{shiftKeyPressed:(e,t)=>{e.shift=t.payload}}}),{shiftKeyPressed:D6}=pD.actions,lue=pD.reducer,dEe=e=>e.hotkeys;function uue(){if(console&&console.warn){for(var e=arguments.length,t=new Array(e),n=0;n()=>{if(e.isInitialized)t();else{const n=()=>{setTimeout(()=>{e.off("initialized",n)},0),t()};e.on("initialized",n)}};function $6(e,t,n){e.loadNamespaces(t,gD(e,n))}function F6(e,t,n,r){typeof n=="string"&&(n=[n]),n.forEach(i=>{e.options.ns.indexOf(i)<0&&e.options.ns.push(i)}),e.loadLanguages(t,gD(e,r))}function cue(e,t){let n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{};const r=t.languages[0],i=t.options?t.options.fallbackLng:!1,o=t.languages[t.languages.length-1];if(r.toLowerCase()==="cimode")return!0;const s=(a,l)=>{const u=t.services.backendConnector.state[`${a}|${l}`];return u===-1||u===2};return n.bindI18n&&n.bindI18n.indexOf("languageChanging")>-1&&t.services.backendConnector.backend&&t.isLanguageChangingTo&&!s(t.isLanguageChangingTo,e)?!1:!!(t.hasResourceBundle(r,e)||!t.services.backendConnector.backend||t.options.resources&&!t.options.partialBundledLanguages||s(r,e)&&(!i||s(o,e)))}function due(e,t){let n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{};return!t.languages||!t.languages.length?(Lw("i18n.languages were undefined or empty",t.languages),!0):t.options.ignoreJSONStructure!==void 0?t.hasLoadedNamespace(e,{lng:n.lng,precheck:(i,o)=>{if(n.bindI18n&&n.bindI18n.indexOf("languageChanging")>-1&&i.services.backendConnector.backend&&i.isLanguageChangingTo&&!o(i.isLanguageChangingTo,e))return!1}}):cue(e,t,n)}const fue=/&(?:amp|#38|lt|#60|gt|#62|apos|#39|quot|#34|nbsp|#160|copy|#169|reg|#174|hellip|#8230|#x2F|#47);/g,hue={"&":"&","&":"&","<":"<","<":"<",">":">",">":">","'":"'","'":"'",""":'"',""":'"'," ":" "," ":" ","©":"©","©":"©","®":"®","®":"®","…":"…","…":"…","/":"/","/":"/"},pue=e=>hue[e],gue=e=>e.replace(fue,pue);let $w={bindI18n:"languageChanged",bindI18nStore:"",transEmptyNodeValue:"",transSupportBasicHtmlNodes:!0,transWrapTextNodes:"",transKeepBasicHtmlNodesFor:["br","strong","i","p"],useSuspense:!0,unescape:gue};function mue(){let e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};$w={...$w,...e}}function yue(){return $w}let mD;function vue(e){mD=e}function bue(){return mD}const Sue={type:"3rdParty",init(e){mue(e.options.react),vue(e)}},_ue=E.createContext();class wue{constructor(){this.usedNamespaces={}}addUsedNamespaces(t){t.forEach(n=>{this.usedNamespaces[n]||(this.usedNamespaces[n]=!0)})}getUsedNamespaces(){return Object.keys(this.usedNamespaces)}}const xue=(e,t)=>{const n=E.useRef();return E.useEffect(()=>{n.current=t?n.current:e},[e,t]),n.current};function yD(e){let t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};const{i18n:n}=t,{i18n:r,defaultNS:i}=E.useContext(_ue)||{},o=n||r||bue();if(o&&!o.reportNamespaces&&(o.reportNamespaces=new wue),!o){Lw("You will need to pass in an i18next instance by using initReactI18next");const g=(_,w)=>typeof w=="string"?w:w&&typeof w=="object"&&typeof w.defaultValue=="string"?w.defaultValue:Array.isArray(_)?_[_.length-1]:_,b=[g,{},!1];return b.t=g,b.i18n={},b.ready=!1,b}o.options.react&&o.options.react.wait!==void 0&&Lw("It seems you are still using the old wait option, you may migrate to the new useSuspense behaviour.");const s={...yue(),...o.options.react,...t},{useSuspense:a,keyPrefix:l}=s;let u=e||i||o.options&&o.options.defaultNS;u=typeof u=="string"?[u]:u||["translation"],o.reportNamespaces.addUsedNamespaces&&o.reportNamespaces.addUsedNamespaces(u);const c=(o.isInitialized||o.initializedStoreOnce)&&u.every(g=>due(g,o,s));function d(){return o.getFixedT(t.lng||null,s.nsMode==="fallback"?u:u[0],l)}const[f,h]=E.useState(d);let p=u.join();t.lng&&(p=`${t.lng}${p}`);const m=xue(p),S=E.useRef(!0);E.useEffect(()=>{const{bindI18n:g,bindI18nStore:b}=s;S.current=!0,!c&&!a&&(t.lng?F6(o,t.lng,u,()=>{S.current&&h(d)}):$6(o,u,()=>{S.current&&h(d)})),c&&m&&m!==p&&S.current&&h(d);function _(){S.current&&h(d)}return g&&o&&o.on(g,_),b&&o&&o.store.on(b,_),()=>{S.current=!1,g&&o&&g.split(" ").forEach(w=>o.off(w,_)),b&&o&&b.split(" ").forEach(w=>o.store.off(w,_))}},[o,p]);const v=E.useRef(!0);E.useEffect(()=>{S.current&&!v.current&&h(d),v.current=!1},[o,l]);const y=[f,o,c];if(y.t=f,y.i18n=o,y.ready=c,c||!c&&!a)return y;throw new Promise(g=>{t.lng?F6(o,t.lng,u,()=>g()):$6(o,u,()=>g())})}var vD={color:void 0,size:void 0,className:void 0,style:void 0,attr:void 0},B6=Ve.createContext&&Ve.createContext(vD),la=globalThis&&globalThis.__assign||function(){return la=Object.assign||function(e){for(var t,n=1,r=arguments.length;n{const{role:n,tooltip:r="",tooltipProps:i,isChecked:o,...s}=e;return j.jsx(s3,{label:r,hasArrow:!0,...i,...i!=null&&i.placement?{placement:i.placement}:{placement:"top"},children:j.jsx(ON,{ref:t,role:n,colorScheme:o?"accent":"base",...s})})});SD.displayName="IAIIconButton";const kue=E.memo(SD),Aue=e=>{const[t,n]=E.useState(!1),{label:r,value:i,min:o=1,max:s=100,step:a=1,onChange:l,tooltipSuffix:u="",withSliderMarks:c=!1,withInput:d=!1,isInteger:f=!1,inputWidth:h=16,withReset:p=!1,hideTooltip:m=!1,isCompact:S=!1,isDisabled:v=!1,sliderMarks:y,handleReset:g,sliderFormControlProps:b,sliderFormLabelProps:_,sliderMarkProps:w,sliderTrackProps:x,sliderThumbProps:C,sliderNumberInputProps:k,sliderNumberInputFieldProps:P,sliderNumberInputStepperProps:A,sliderTooltipProps:$,sliderIAIIconButtonProps:N,...T}=e,O=Zc(),{t:I}=yD(),[M,R]=E.useState(String(i));E.useEffect(()=>{R(i)},[i]);const D=E.useMemo(()=>k!=null&&k.max?k.max:s,[s,k==null?void 0:k.max]),L=E.useCallback(F=>{l(F)},[l]),V=E.useCallback(F=>{F.target.value===""&&(F.target.value=String(o));const q=Jo(f?Math.floor(Number(F.target.value)):Number(M),o,D),Q=qd(q,a);l(Q),R(Q)},[f,M,o,D,l,a]),z=E.useCallback(F=>{console.log("input"),R(F)},[]),U=E.useCallback(()=>{g&&g()},[g]),K=E.useCallback(F=>{F.target instanceof HTMLDivElement&&F.target.focus()},[]),W=E.useCallback(F=>{F.shiftKey&&O(D6(!0))},[O]),X=E.useCallback(F=>{F.shiftKey||O(D6(!1))},[O]);return j.jsxs(IN,{onClick:K,sx:S?{display:"flex",flexDirection:"row",alignItems:"center",columnGap:4,margin:0,padding:0}:{},isDisabled:v,...b,children:[r&&j.jsx(MN,{sx:d?{mb:-1.5}:{},..._,children:r}),j.jsxs(UN,{w:"100%",gap:2,alignItems:"center",children:[j.jsxs(uD,{"aria-label":r,value:i,min:o,max:s,step:a,onChange:L,onMouseEnter:()=>n(!0),onMouseLeave:()=>n(!1),focusThumbOnChange:!1,isDisabled:v,...T,children:[c&&!y&&j.jsxs(j.Fragment,{children:[j.jsx(vu,{value:o,sx:{insetInlineStart:"0 !important",insetInlineEnd:"unset !important"},...w,children:o}),j.jsx(vu,{value:s,sx:{insetInlineStart:"unset !important",insetInlineEnd:"0 !important"},...w,children:s})]}),c&&y&&j.jsx(j.Fragment,{children:y.map((F,q)=>q===0?j.jsx(vu,{value:F,sx:{insetInlineStart:"0 !important",insetInlineEnd:"unset !important"},...w,children:F},F):q===y.length-1?j.jsx(vu,{value:F,sx:{insetInlineStart:"unset !important",insetInlineEnd:"0 !important"},...w,children:F},F):j.jsx(vu,{value:F,sx:{transform:"translateX(-50%)"},...w,children:F},F))}),j.jsx(dD,{...x,children:j.jsx(fD,{})}),j.jsx(s3,{hasArrow:!0,placement:"top",isOpen:t,label:`${i}${u}`,hidden:m,...$,children:j.jsx(cD,{...C,zIndex:0})})]}),d&&j.jsxs(eD,{min:o,max:D,step:a,value:M,onChange:z,onBlur:V,focusInputOnChange:!1,...k,children:[j.jsx(nD,{onKeyDown:W,onKeyUp:X,minWidth:h,...P}),j.jsxs(tD,{...A,children:[j.jsx(oD,{onClick:()=>l(Number(M))}),j.jsx(iD,{onClick:()=>l(Number(M))})]})]}),p&&j.jsx(kue,{size:"sm","aria-label":I("accessibility.reset"),tooltip:I("accessibility.reset"),icon:j.jsx(Pue,{}),isDisabled:v,onClick:U,...N})]})]})},Oue=E.memo(Aue),Yd={"sd-1":{maxClip:12,markers:[0,1,2,3,4,8,12]},"sd-2":{maxClip:24,markers:[0,1,2,3,5,10,15,20,24]},sdxl:{maxClip:24,markers:[0,1,2,3,5,10,15,20,24]},"sdxl-refiner":{maxClip:24,markers:[0,1,2,3,5,10,15,20,24]}};function fEe(){const e=Qf(l=>l.generation.clipSkip),{model:t}=Qf(l=>l.generation),n=Zc(),{t:r}=yD(),i=E.useCallback(l=>{n(z6(l))},[n]),o=E.useCallback(()=>{n(z6(0))},[n]),s=E.useMemo(()=>t?Yd[t.base_model].maxClip:Yd["sd-1"].maxClip,[t]),a=E.useMemo(()=>t?Yd[t.base_model].markers:Yd["sd-1"].markers,[t]);return j.jsx(Oue,{label:r("parameters.clipSkip"),"aria-label":r("parameters.clipSkip"),min:0,max:s,step:1,value:e,onChange:i,withSliderMarks:!0,sliderMarks:a,withInput:!0,withReset:!0,handleReset:o})}var Xe;(function(e){e.assertEqual=i=>i;function t(i){}e.assertIs=t;function n(i){throw new Error}e.assertNever=n,e.arrayToEnum=i=>{const o={};for(const s of i)o[s]=s;return o},e.getValidEnumValues=i=>{const o=e.objectKeys(i).filter(a=>typeof i[i[a]]!="number"),s={};for(const a of o)s[a]=i[a];return e.objectValues(s)},e.objectValues=i=>e.objectKeys(i).map(function(o){return i[o]}),e.objectKeys=typeof Object.keys=="function"?i=>Object.keys(i):i=>{const o=[];for(const s in i)Object.prototype.hasOwnProperty.call(i,s)&&o.push(s);return o},e.find=(i,o)=>{for(const s of i)if(o(s))return s},e.isInteger=typeof Number.isInteger=="function"?i=>Number.isInteger(i):i=>typeof i=="number"&&isFinite(i)&&Math.floor(i)===i;function r(i,o=" | "){return i.map(s=>typeof s=="string"?`'${s}'`:s).join(o)}e.joinValues=r,e.jsonStringifyReplacer=(i,o)=>typeof o=="bigint"?o.toString():o})(Xe||(Xe={}));var Fw;(function(e){e.mergeShapes=(t,n)=>({...t,...n})})(Fw||(Fw={}));const le=Xe.arrayToEnum(["string","nan","number","integer","float","boolean","date","bigint","symbol","function","undefined","null","array","object","unknown","promise","void","never","map","set"]),qs=e=>{switch(typeof e){case"undefined":return le.undefined;case"string":return le.string;case"number":return isNaN(e)?le.nan:le.number;case"boolean":return le.boolean;case"function":return le.function;case"bigint":return le.bigint;case"symbol":return le.symbol;case"object":return Array.isArray(e)?le.array:e===null?le.null:e.then&&typeof e.then=="function"&&e.catch&&typeof e.catch=="function"?le.promise:typeof Map<"u"&&e instanceof Map?le.map:typeof Set<"u"&&e instanceof Set?le.set:typeof Date<"u"&&e instanceof Date?le.date:le.object;default:return le.unknown}},re=Xe.arrayToEnum(["invalid_type","invalid_literal","custom","invalid_union","invalid_union_discriminator","invalid_enum_value","unrecognized_keys","invalid_arguments","invalid_return_type","invalid_date","invalid_string","too_small","too_big","invalid_intersection_types","not_multiple_of","not_finite"]),Rue=e=>JSON.stringify(e,null,2).replace(/"([^"]+)":/g,"$1:");class Di extends Error{constructor(t){super(),this.issues=[],this.addIssue=r=>{this.issues=[...this.issues,r]},this.addIssues=(r=[])=>{this.issues=[...this.issues,...r]};const n=new.target.prototype;Object.setPrototypeOf?Object.setPrototypeOf(this,n):this.__proto__=n,this.name="ZodError",this.issues=t}get errors(){return this.issues}format(t){const n=t||function(o){return o.message},r={_errors:[]},i=o=>{for(const s of o.issues)if(s.code==="invalid_union")s.unionErrors.map(i);else if(s.code==="invalid_return_type")i(s.returnTypeError);else if(s.code==="invalid_arguments")i(s.argumentsError);else if(s.path.length===0)r._errors.push(n(s));else{let a=r,l=0;for(;ln.message){const n={},r=[];for(const i of this.issues)i.path.length>0?(n[i.path[0]]=n[i.path[0]]||[],n[i.path[0]].push(t(i))):r.push(t(i));return{formErrors:r,fieldErrors:n}}get formErrors(){return this.flatten()}}Di.create=e=>new Di(e);const uh=(e,t)=>{let n;switch(e.code){case re.invalid_type:e.received===le.undefined?n="Required":n=`Expected ${e.expected}, received ${e.received}`;break;case re.invalid_literal:n=`Invalid literal value, expected ${JSON.stringify(e.expected,Xe.jsonStringifyReplacer)}`;break;case re.unrecognized_keys:n=`Unrecognized key(s) in object: ${Xe.joinValues(e.keys,", ")}`;break;case re.invalid_union:n="Invalid input";break;case re.invalid_union_discriminator:n=`Invalid discriminator value. Expected ${Xe.joinValues(e.options)}`;break;case re.invalid_enum_value:n=`Invalid enum value. Expected ${Xe.joinValues(e.options)}, received '${e.received}'`;break;case re.invalid_arguments:n="Invalid function arguments";break;case re.invalid_return_type:n="Invalid function return type";break;case re.invalid_date:n="Invalid date";break;case re.invalid_string:typeof e.validation=="object"?"includes"in e.validation?(n=`Invalid input: must include "${e.validation.includes}"`,typeof e.validation.position=="number"&&(n=`${n} at one or more positions greater than or equal to ${e.validation.position}`)):"startsWith"in e.validation?n=`Invalid input: must start with "${e.validation.startsWith}"`:"endsWith"in e.validation?n=`Invalid input: must end with "${e.validation.endsWith}"`:Xe.assertNever(e.validation):e.validation!=="regex"?n=`Invalid ${e.validation}`:n="Invalid";break;case re.too_small:e.type==="array"?n=`Array must contain ${e.exact?"exactly":e.inclusive?"at least":"more than"} ${e.minimum} element(s)`:e.type==="string"?n=`String must contain ${e.exact?"exactly":e.inclusive?"at least":"over"} ${e.minimum} character(s)`:e.type==="number"?n=`Number must be ${e.exact?"exactly equal to ":e.inclusive?"greater than or equal to ":"greater than "}${e.minimum}`:e.type==="date"?n=`Date must be ${e.exact?"exactly equal to ":e.inclusive?"greater than or equal to ":"greater than "}${new Date(Number(e.minimum))}`:n="Invalid input";break;case re.too_big:e.type==="array"?n=`Array must contain ${e.exact?"exactly":e.inclusive?"at most":"less than"} ${e.maximum} element(s)`:e.type==="string"?n=`String must contain ${e.exact?"exactly":e.inclusive?"at most":"under"} ${e.maximum} character(s)`:e.type==="number"?n=`Number must be ${e.exact?"exactly":e.inclusive?"less than or equal to":"less than"} ${e.maximum}`:e.type==="bigint"?n=`BigInt must be ${e.exact?"exactly":e.inclusive?"less than or equal to":"less than"} ${e.maximum}`:e.type==="date"?n=`Date must be ${e.exact?"exactly":e.inclusive?"smaller than or equal to":"smaller than"} ${new Date(Number(e.maximum))}`:n="Invalid input";break;case re.custom:n="Invalid input";break;case re.invalid_intersection_types:n="Intersection results could not be merged";break;case re.not_multiple_of:n=`Number must be a multiple of ${e.multipleOf}`;break;case re.not_finite:n="Number must be finite";break;default:n=t.defaultError,Xe.assertNever(e)}return{message:n}};let _D=uh;function Iue(e){_D=e}function Ny(){return _D}const Dy=e=>{const{data:t,path:n,errorMaps:r,issueData:i}=e,o=[...n,...i.path||[]],s={...i,path:o};let a="";const l=r.filter(u=>!!u).slice().reverse();for(const u of l)a=u(s,{data:t,defaultError:a}).message;return{...i,path:o,message:i.message||a}},Mue=[];function ce(e,t){const n=Dy({issueData:t,data:e.data,path:e.path,errorMaps:[e.common.contextualErrorMap,e.schemaErrorMap,Ny(),uh].filter(r=>!!r)});e.common.issues.push(n)}class Jn{constructor(){this.value="valid"}dirty(){this.value==="valid"&&(this.value="dirty")}abort(){this.value!=="aborted"&&(this.value="aborted")}static mergeArray(t,n){const r=[];for(const i of n){if(i.status==="aborted")return xe;i.status==="dirty"&&t.dirty(),r.push(i.value)}return{status:t.value,value:r}}static async mergeObjectAsync(t,n){const r=[];for(const i of n)r.push({key:await i.key,value:await i.value});return Jn.mergeObjectSync(t,r)}static mergeObjectSync(t,n){const r={};for(const i of n){const{key:o,value:s}=i;if(o.status==="aborted"||s.status==="aborted")return xe;o.status==="dirty"&&t.dirty(),s.status==="dirty"&&t.dirty(),(typeof s.value<"u"||i.alwaysSet)&&(r[o.value]=s.value)}return{status:t.value,value:r}}}const xe=Object.freeze({status:"aborted"}),wD=e=>({status:"dirty",value:e}),fr=e=>({status:"valid",value:e}),Bw=e=>e.status==="aborted",jw=e=>e.status==="dirty",Ly=e=>e.status==="valid",$y=e=>typeof Promise<"u"&&e instanceof Promise;var be;(function(e){e.errToObj=t=>typeof t=="string"?{message:t}:t||{},e.toString=t=>typeof t=="string"?t:t==null?void 0:t.message})(be||(be={}));class xo{constructor(t,n,r,i){this._cachedPath=[],this.parent=t,this.data=n,this._path=r,this._key=i}get path(){return this._cachedPath.length||(this._key instanceof Array?this._cachedPath.push(...this._path,...this._key):this._cachedPath.push(...this._path,this._key)),this._cachedPath}}const j6=(e,t)=>{if(Ly(t))return{success:!0,data:t.value};if(!e.common.issues.length)throw new Error("Validation failed but no issues detected.");return{success:!1,get error(){if(this._error)return this._error;const n=new Di(e.common.issues);return this._error=n,this._error}}};function Ae(e){if(!e)return{};const{errorMap:t,invalid_type_error:n,required_error:r,description:i}=e;if(t&&(n||r))throw new Error(`Can't use "invalid_type_error" or "required_error" in conjunction with custom error map.`);return t?{errorMap:t,description:i}:{errorMap:(s,a)=>s.code!=="invalid_type"?{message:a.defaultError}:typeof a.data>"u"?{message:r??a.defaultError}:{message:n??a.defaultError},description:i}}class Oe{constructor(t){this.spa=this.safeParseAsync,this._def=t,this.parse=this.parse.bind(this),this.safeParse=this.safeParse.bind(this),this.parseAsync=this.parseAsync.bind(this),this.safeParseAsync=this.safeParseAsync.bind(this),this.spa=this.spa.bind(this),this.refine=this.refine.bind(this),this.refinement=this.refinement.bind(this),this.superRefine=this.superRefine.bind(this),this.optional=this.optional.bind(this),this.nullable=this.nullable.bind(this),this.nullish=this.nullish.bind(this),this.array=this.array.bind(this),this.promise=this.promise.bind(this),this.or=this.or.bind(this),this.and=this.and.bind(this),this.transform=this.transform.bind(this),this.brand=this.brand.bind(this),this.default=this.default.bind(this),this.catch=this.catch.bind(this),this.describe=this.describe.bind(this),this.pipe=this.pipe.bind(this),this.isNullable=this.isNullable.bind(this),this.isOptional=this.isOptional.bind(this)}get description(){return this._def.description}_getType(t){return qs(t.data)}_getOrReturnCtx(t,n){return n||{common:t.parent.common,data:t.data,parsedType:qs(t.data),schemaErrorMap:this._def.errorMap,path:t.path,parent:t.parent}}_processInputParams(t){return{status:new Jn,ctx:{common:t.parent.common,data:t.data,parsedType:qs(t.data),schemaErrorMap:this._def.errorMap,path:t.path,parent:t.parent}}}_parseSync(t){const n=this._parse(t);if($y(n))throw new Error("Synchronous parse encountered promise.");return n}_parseAsync(t){const n=this._parse(t);return Promise.resolve(n)}parse(t,n){const r=this.safeParse(t,n);if(r.success)return r.data;throw r.error}safeParse(t,n){var r;const i={common:{issues:[],async:(r=n==null?void 0:n.async)!==null&&r!==void 0?r:!1,contextualErrorMap:n==null?void 0:n.errorMap},path:(n==null?void 0:n.path)||[],schemaErrorMap:this._def.errorMap,parent:null,data:t,parsedType:qs(t)},o=this._parseSync({data:t,path:i.path,parent:i});return j6(i,o)}async parseAsync(t,n){const r=await this.safeParseAsync(t,n);if(r.success)return r.data;throw r.error}async safeParseAsync(t,n){const r={common:{issues:[],contextualErrorMap:n==null?void 0:n.errorMap,async:!0},path:(n==null?void 0:n.path)||[],schemaErrorMap:this._def.errorMap,parent:null,data:t,parsedType:qs(t)},i=this._parse({data:t,path:r.path,parent:r}),o=await($y(i)?i:Promise.resolve(i));return j6(r,o)}refine(t,n){const r=i=>typeof n=="string"||typeof n>"u"?{message:n}:typeof n=="function"?n(i):n;return this._refinement((i,o)=>{const s=t(i),a=()=>o.addIssue({code:re.custom,...r(i)});return typeof Promise<"u"&&s instanceof Promise?s.then(l=>l?!0:(a(),!1)):s?!0:(a(),!1)})}refinement(t,n){return this._refinement((r,i)=>t(r)?!0:(i.addIssue(typeof n=="function"?n(r,i):n),!1))}_refinement(t){return new Vi({schema:this,typeName:we.ZodEffects,effect:{type:"refinement",refinement:t}})}superRefine(t){return this._refinement(t)}optional(){return os.create(this,this._def)}nullable(){return Tl.create(this,this._def)}nullish(){return this.nullable().optional()}array(){return Li.create(this,this._def)}promise(){return Mc.create(this,this._def)}or(t){return hh.create([this,t],this._def)}and(t){return ph.create(this,t,this._def)}transform(t){return new Vi({...Ae(this._def),schema:this,typeName:we.ZodEffects,effect:{type:"transform",transform:t}})}default(t){const n=typeof t=="function"?t:()=>t;return new bh({...Ae(this._def),innerType:this,defaultValue:n,typeName:we.ZodDefault})}brand(){return new CD({typeName:we.ZodBranded,type:this,...Ae(this._def)})}catch(t){const n=typeof t=="function"?t:()=>t;return new Vy({...Ae(this._def),innerType:this,catchValue:n,typeName:we.ZodCatch})}describe(t){const n=this.constructor;return new n({...this._def,description:t})}pipe(t){return bp.create(this,t)}isOptional(){return this.safeParse(void 0).success}isNullable(){return this.safeParse(null).success}}const Nue=/^c[^\s-]{8,}$/i,Due=/^[a-z][a-z0-9]*$/,Lue=/[0-9A-HJKMNP-TV-Z]{26}/,$ue=/^([a-f0-9]{8}-[a-f0-9]{4}-[1-5][a-f0-9]{3}-[a-f0-9]{4}-[a-f0-9]{12}|00000000-0000-0000-0000-000000000000)$/i,Fue=/^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\])|(\[IPv6:(([a-f0-9]{1,4}:){7}|::([a-f0-9]{1,4}:){0,6}|([a-f0-9]{1,4}:){1}:([a-f0-9]{1,4}:){0,5}|([a-f0-9]{1,4}:){2}:([a-f0-9]{1,4}:){0,4}|([a-f0-9]{1,4}:){3}:([a-f0-9]{1,4}:){0,3}|([a-f0-9]{1,4}:){4}:([a-f0-9]{1,4}:){0,2}|([a-f0-9]{1,4}:){5}:([a-f0-9]{1,4}:){0,1})([a-f0-9]{1,4}|(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2})))\])|([A-Za-z0-9]([A-Za-z0-9-]*[A-Za-z0-9])*(\.[A-Za-z]{2,})+))$/,Bue=/^(\p{Extended_Pictographic}|\p{Emoji_Component})+$/u,jue=/^(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))$/,Vue=/^(([a-f0-9]{1,4}:){7}|::([a-f0-9]{1,4}:){0,6}|([a-f0-9]{1,4}:){1}:([a-f0-9]{1,4}:){0,5}|([a-f0-9]{1,4}:){2}:([a-f0-9]{1,4}:){0,4}|([a-f0-9]{1,4}:){3}:([a-f0-9]{1,4}:){0,3}|([a-f0-9]{1,4}:){4}:([a-f0-9]{1,4}:){0,2}|([a-f0-9]{1,4}:){5}:([a-f0-9]{1,4}:){0,1})([a-f0-9]{1,4}|(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2})))$/,zue=e=>e.precision?e.offset?new RegExp(`^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{${e.precision}}(([+-]\\d{2}(:?\\d{2})?)|Z)$`):new RegExp(`^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{${e.precision}}Z$`):e.precision===0?e.offset?new RegExp("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(([+-]\\d{2}(:?\\d{2})?)|Z)$"):new RegExp("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}Z$"):e.offset?new RegExp("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?(([+-]\\d{2}(:?\\d{2})?)|Z)$"):new RegExp("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?Z$");function Uue(e,t){return!!((t==="v4"||!t)&&jue.test(e)||(t==="v6"||!t)&&Vue.test(e))}class Ri extends Oe{constructor(){super(...arguments),this._regex=(t,n,r)=>this.refinement(i=>t.test(i),{validation:n,code:re.invalid_string,...be.errToObj(r)}),this.nonempty=t=>this.min(1,be.errToObj(t)),this.trim=()=>new Ri({...this._def,checks:[...this._def.checks,{kind:"trim"}]}),this.toLowerCase=()=>new Ri({...this._def,checks:[...this._def.checks,{kind:"toLowerCase"}]}),this.toUpperCase=()=>new Ri({...this._def,checks:[...this._def.checks,{kind:"toUpperCase"}]})}_parse(t){if(this._def.coerce&&(t.data=String(t.data)),this._getType(t)!==le.string){const o=this._getOrReturnCtx(t);return ce(o,{code:re.invalid_type,expected:le.string,received:o.parsedType}),xe}const r=new Jn;let i;for(const o of this._def.checks)if(o.kind==="min")t.data.lengtho.value&&(i=this._getOrReturnCtx(t,i),ce(i,{code:re.too_big,maximum:o.value,type:"string",inclusive:!0,exact:!1,message:o.message}),r.dirty());else if(o.kind==="length"){const s=t.data.length>o.value,a=t.data.length"u"?null:t==null?void 0:t.precision,offset:(n=t==null?void 0:t.offset)!==null&&n!==void 0?n:!1,...be.errToObj(t==null?void 0:t.message)})}regex(t,n){return this._addCheck({kind:"regex",regex:t,...be.errToObj(n)})}includes(t,n){return this._addCheck({kind:"includes",value:t,position:n==null?void 0:n.position,...be.errToObj(n==null?void 0:n.message)})}startsWith(t,n){return this._addCheck({kind:"startsWith",value:t,...be.errToObj(n)})}endsWith(t,n){return this._addCheck({kind:"endsWith",value:t,...be.errToObj(n)})}min(t,n){return this._addCheck({kind:"min",value:t,...be.errToObj(n)})}max(t,n){return this._addCheck({kind:"max",value:t,...be.errToObj(n)})}length(t,n){return this._addCheck({kind:"length",value:t,...be.errToObj(n)})}get isDatetime(){return!!this._def.checks.find(t=>t.kind==="datetime")}get isEmail(){return!!this._def.checks.find(t=>t.kind==="email")}get isURL(){return!!this._def.checks.find(t=>t.kind==="url")}get isEmoji(){return!!this._def.checks.find(t=>t.kind==="emoji")}get isUUID(){return!!this._def.checks.find(t=>t.kind==="uuid")}get isCUID(){return!!this._def.checks.find(t=>t.kind==="cuid")}get isCUID2(){return!!this._def.checks.find(t=>t.kind==="cuid2")}get isULID(){return!!this._def.checks.find(t=>t.kind==="ulid")}get isIP(){return!!this._def.checks.find(t=>t.kind==="ip")}get minLength(){let t=null;for(const n of this._def.checks)n.kind==="min"&&(t===null||n.value>t)&&(t=n.value);return t}get maxLength(){let t=null;for(const n of this._def.checks)n.kind==="max"&&(t===null||n.value{var t;return new Ri({checks:[],typeName:we.ZodString,coerce:(t=e==null?void 0:e.coerce)!==null&&t!==void 0?t:!1,...Ae(e)})};function Gue(e,t){const n=(e.toString().split(".")[1]||"").length,r=(t.toString().split(".")[1]||"").length,i=n>r?n:r,o=parseInt(e.toFixed(i).replace(".","")),s=parseInt(t.toFixed(i).replace(".",""));return o%s/Math.pow(10,i)}class ba extends Oe{constructor(){super(...arguments),this.min=this.gte,this.max=this.lte,this.step=this.multipleOf}_parse(t){if(this._def.coerce&&(t.data=Number(t.data)),this._getType(t)!==le.number){const o=this._getOrReturnCtx(t);return ce(o,{code:re.invalid_type,expected:le.number,received:o.parsedType}),xe}let r;const i=new Jn;for(const o of this._def.checks)o.kind==="int"?Xe.isInteger(t.data)||(r=this._getOrReturnCtx(t,r),ce(r,{code:re.invalid_type,expected:"integer",received:"float",message:o.message}),i.dirty()):o.kind==="min"?(o.inclusive?t.datao.value:t.data>=o.value)&&(r=this._getOrReturnCtx(t,r),ce(r,{code:re.too_big,maximum:o.value,type:"number",inclusive:o.inclusive,exact:!1,message:o.message}),i.dirty()):o.kind==="multipleOf"?Gue(t.data,o.value)!==0&&(r=this._getOrReturnCtx(t,r),ce(r,{code:re.not_multiple_of,multipleOf:o.value,message:o.message}),i.dirty()):o.kind==="finite"?Number.isFinite(t.data)||(r=this._getOrReturnCtx(t,r),ce(r,{code:re.not_finite,message:o.message}),i.dirty()):Xe.assertNever(o);return{status:i.value,value:t.data}}gte(t,n){return this.setLimit("min",t,!0,be.toString(n))}gt(t,n){return this.setLimit("min",t,!1,be.toString(n))}lte(t,n){return this.setLimit("max",t,!0,be.toString(n))}lt(t,n){return this.setLimit("max",t,!1,be.toString(n))}setLimit(t,n,r,i){return new ba({...this._def,checks:[...this._def.checks,{kind:t,value:n,inclusive:r,message:be.toString(i)}]})}_addCheck(t){return new ba({...this._def,checks:[...this._def.checks,t]})}int(t){return this._addCheck({kind:"int",message:be.toString(t)})}positive(t){return this._addCheck({kind:"min",value:0,inclusive:!1,message:be.toString(t)})}negative(t){return this._addCheck({kind:"max",value:0,inclusive:!1,message:be.toString(t)})}nonpositive(t){return this._addCheck({kind:"max",value:0,inclusive:!0,message:be.toString(t)})}nonnegative(t){return this._addCheck({kind:"min",value:0,inclusive:!0,message:be.toString(t)})}multipleOf(t,n){return this._addCheck({kind:"multipleOf",value:t,message:be.toString(n)})}finite(t){return this._addCheck({kind:"finite",message:be.toString(t)})}safe(t){return this._addCheck({kind:"min",inclusive:!0,value:Number.MIN_SAFE_INTEGER,message:be.toString(t)})._addCheck({kind:"max",inclusive:!0,value:Number.MAX_SAFE_INTEGER,message:be.toString(t)})}get minValue(){let t=null;for(const n of this._def.checks)n.kind==="min"&&(t===null||n.value>t)&&(t=n.value);return t}get maxValue(){let t=null;for(const n of this._def.checks)n.kind==="max"&&(t===null||n.valuet.kind==="int"||t.kind==="multipleOf"&&Xe.isInteger(t.value))}get isFinite(){let t=null,n=null;for(const r of this._def.checks){if(r.kind==="finite"||r.kind==="int"||r.kind==="multipleOf")return!0;r.kind==="min"?(n===null||r.value>n)&&(n=r.value):r.kind==="max"&&(t===null||r.valuenew ba({checks:[],typeName:we.ZodNumber,coerce:(e==null?void 0:e.coerce)||!1,...Ae(e)});class Sa extends Oe{constructor(){super(...arguments),this.min=this.gte,this.max=this.lte}_parse(t){if(this._def.coerce&&(t.data=BigInt(t.data)),this._getType(t)!==le.bigint){const o=this._getOrReturnCtx(t);return ce(o,{code:re.invalid_type,expected:le.bigint,received:o.parsedType}),xe}let r;const i=new Jn;for(const o of this._def.checks)o.kind==="min"?(o.inclusive?t.datao.value:t.data>=o.value)&&(r=this._getOrReturnCtx(t,r),ce(r,{code:re.too_big,type:"bigint",maximum:o.value,inclusive:o.inclusive,message:o.message}),i.dirty()):o.kind==="multipleOf"?t.data%o.value!==BigInt(0)&&(r=this._getOrReturnCtx(t,r),ce(r,{code:re.not_multiple_of,multipleOf:o.value,message:o.message}),i.dirty()):Xe.assertNever(o);return{status:i.value,value:t.data}}gte(t,n){return this.setLimit("min",t,!0,be.toString(n))}gt(t,n){return this.setLimit("min",t,!1,be.toString(n))}lte(t,n){return this.setLimit("max",t,!0,be.toString(n))}lt(t,n){return this.setLimit("max",t,!1,be.toString(n))}setLimit(t,n,r,i){return new Sa({...this._def,checks:[...this._def.checks,{kind:t,value:n,inclusive:r,message:be.toString(i)}]})}_addCheck(t){return new Sa({...this._def,checks:[...this._def.checks,t]})}positive(t){return this._addCheck({kind:"min",value:BigInt(0),inclusive:!1,message:be.toString(t)})}negative(t){return this._addCheck({kind:"max",value:BigInt(0),inclusive:!1,message:be.toString(t)})}nonpositive(t){return this._addCheck({kind:"max",value:BigInt(0),inclusive:!0,message:be.toString(t)})}nonnegative(t){return this._addCheck({kind:"min",value:BigInt(0),inclusive:!0,message:be.toString(t)})}multipleOf(t,n){return this._addCheck({kind:"multipleOf",value:t,message:be.toString(n)})}get minValue(){let t=null;for(const n of this._def.checks)n.kind==="min"&&(t===null||n.value>t)&&(t=n.value);return t}get maxValue(){let t=null;for(const n of this._def.checks)n.kind==="max"&&(t===null||n.value{var t;return new Sa({checks:[],typeName:we.ZodBigInt,coerce:(t=e==null?void 0:e.coerce)!==null&&t!==void 0?t:!1,...Ae(e)})};class ch extends Oe{_parse(t){if(this._def.coerce&&(t.data=!!t.data),this._getType(t)!==le.boolean){const r=this._getOrReturnCtx(t);return ce(r,{code:re.invalid_type,expected:le.boolean,received:r.parsedType}),xe}return fr(t.data)}}ch.create=e=>new ch({typeName:we.ZodBoolean,coerce:(e==null?void 0:e.coerce)||!1,...Ae(e)});class xl extends Oe{_parse(t){if(this._def.coerce&&(t.data=new Date(t.data)),this._getType(t)!==le.date){const o=this._getOrReturnCtx(t);return ce(o,{code:re.invalid_type,expected:le.date,received:o.parsedType}),xe}if(isNaN(t.data.getTime())){const o=this._getOrReturnCtx(t);return ce(o,{code:re.invalid_date}),xe}const r=new Jn;let i;for(const o of this._def.checks)o.kind==="min"?t.data.getTime()o.value&&(i=this._getOrReturnCtx(t,i),ce(i,{code:re.too_big,message:o.message,inclusive:!0,exact:!1,maximum:o.value,type:"date"}),r.dirty()):Xe.assertNever(o);return{status:r.value,value:new Date(t.data.getTime())}}_addCheck(t){return new xl({...this._def,checks:[...this._def.checks,t]})}min(t,n){return this._addCheck({kind:"min",value:t.getTime(),message:be.toString(n)})}max(t,n){return this._addCheck({kind:"max",value:t.getTime(),message:be.toString(n)})}get minDate(){let t=null;for(const n of this._def.checks)n.kind==="min"&&(t===null||n.value>t)&&(t=n.value);return t!=null?new Date(t):null}get maxDate(){let t=null;for(const n of this._def.checks)n.kind==="max"&&(t===null||n.valuenew xl({checks:[],coerce:(e==null?void 0:e.coerce)||!1,typeName:we.ZodDate,...Ae(e)});class Fy extends Oe{_parse(t){if(this._getType(t)!==le.symbol){const r=this._getOrReturnCtx(t);return ce(r,{code:re.invalid_type,expected:le.symbol,received:r.parsedType}),xe}return fr(t.data)}}Fy.create=e=>new Fy({typeName:we.ZodSymbol,...Ae(e)});class dh extends Oe{_parse(t){if(this._getType(t)!==le.undefined){const r=this._getOrReturnCtx(t);return ce(r,{code:re.invalid_type,expected:le.undefined,received:r.parsedType}),xe}return fr(t.data)}}dh.create=e=>new dh({typeName:we.ZodUndefined,...Ae(e)});class fh extends Oe{_parse(t){if(this._getType(t)!==le.null){const r=this._getOrReturnCtx(t);return ce(r,{code:re.invalid_type,expected:le.null,received:r.parsedType}),xe}return fr(t.data)}}fh.create=e=>new fh({typeName:we.ZodNull,...Ae(e)});class Ic extends Oe{constructor(){super(...arguments),this._any=!0}_parse(t){return fr(t.data)}}Ic.create=e=>new Ic({typeName:we.ZodAny,...Ae(e)});class cl extends Oe{constructor(){super(...arguments),this._unknown=!0}_parse(t){return fr(t.data)}}cl.create=e=>new cl({typeName:we.ZodUnknown,...Ae(e)});class gs extends Oe{_parse(t){const n=this._getOrReturnCtx(t);return ce(n,{code:re.invalid_type,expected:le.never,received:n.parsedType}),xe}}gs.create=e=>new gs({typeName:we.ZodNever,...Ae(e)});class By extends Oe{_parse(t){if(this._getType(t)!==le.undefined){const r=this._getOrReturnCtx(t);return ce(r,{code:re.invalid_type,expected:le.void,received:r.parsedType}),xe}return fr(t.data)}}By.create=e=>new By({typeName:we.ZodVoid,...Ae(e)});class Li extends Oe{_parse(t){const{ctx:n,status:r}=this._processInputParams(t),i=this._def;if(n.parsedType!==le.array)return ce(n,{code:re.invalid_type,expected:le.array,received:n.parsedType}),xe;if(i.exactLength!==null){const s=n.data.length>i.exactLength.value,a=n.data.lengthi.maxLength.value&&(ce(n,{code:re.too_big,maximum:i.maxLength.value,type:"array",inclusive:!0,exact:!1,message:i.maxLength.message}),r.dirty()),n.common.async)return Promise.all([...n.data].map((s,a)=>i.type._parseAsync(new xo(n,s,n.path,a)))).then(s=>Jn.mergeArray(r,s));const o=[...n.data].map((s,a)=>i.type._parseSync(new xo(n,s,n.path,a)));return Jn.mergeArray(r,o)}get element(){return this._def.type}min(t,n){return new Li({...this._def,minLength:{value:t,message:be.toString(n)}})}max(t,n){return new Li({...this._def,maxLength:{value:t,message:be.toString(n)}})}length(t,n){return new Li({...this._def,exactLength:{value:t,message:be.toString(n)}})}nonempty(t){return this.min(1,t)}}Li.create=(e,t)=>new Li({type:e,minLength:null,maxLength:null,exactLength:null,typeName:we.ZodArray,...Ae(t)});function bu(e){if(e instanceof It){const t={};for(const n in e.shape){const r=e.shape[n];t[n]=os.create(bu(r))}return new It({...e._def,shape:()=>t})}else return e instanceof Li?new Li({...e._def,type:bu(e.element)}):e instanceof os?os.create(bu(e.unwrap())):e instanceof Tl?Tl.create(bu(e.unwrap())):e instanceof Co?Co.create(e.items.map(t=>bu(t))):e}class It extends Oe{constructor(){super(...arguments),this._cached=null,this.nonstrict=this.passthrough,this.augment=this.extend}_getCached(){if(this._cached!==null)return this._cached;const t=this._def.shape(),n=Xe.objectKeys(t);return this._cached={shape:t,keys:n}}_parse(t){if(this._getType(t)!==le.object){const u=this._getOrReturnCtx(t);return ce(u,{code:re.invalid_type,expected:le.object,received:u.parsedType}),xe}const{status:r,ctx:i}=this._processInputParams(t),{shape:o,keys:s}=this._getCached(),a=[];if(!(this._def.catchall instanceof gs&&this._def.unknownKeys==="strip"))for(const u in i.data)s.includes(u)||a.push(u);const l=[];for(const u of s){const c=o[u],d=i.data[u];l.push({key:{status:"valid",value:u},value:c._parse(new xo(i,d,i.path,u)),alwaysSet:u in i.data})}if(this._def.catchall instanceof gs){const u=this._def.unknownKeys;if(u==="passthrough")for(const c of a)l.push({key:{status:"valid",value:c},value:{status:"valid",value:i.data[c]}});else if(u==="strict")a.length>0&&(ce(i,{code:re.unrecognized_keys,keys:a}),r.dirty());else if(u!=="strip")throw new Error("Internal ZodObject error: invalid unknownKeys value.")}else{const u=this._def.catchall;for(const c of a){const d=i.data[c];l.push({key:{status:"valid",value:c},value:u._parse(new xo(i,d,i.path,c)),alwaysSet:c in i.data})}}return i.common.async?Promise.resolve().then(async()=>{const u=[];for(const c of l){const d=await c.key;u.push({key:d,value:await c.value,alwaysSet:c.alwaysSet})}return u}).then(u=>Jn.mergeObjectSync(r,u)):Jn.mergeObjectSync(r,l)}get shape(){return this._def.shape()}strict(t){return be.errToObj,new It({...this._def,unknownKeys:"strict",...t!==void 0?{errorMap:(n,r)=>{var i,o,s,a;const l=(s=(o=(i=this._def).errorMap)===null||o===void 0?void 0:o.call(i,n,r).message)!==null&&s!==void 0?s:r.defaultError;return n.code==="unrecognized_keys"?{message:(a=be.errToObj(t).message)!==null&&a!==void 0?a:l}:{message:l}}}:{}})}strip(){return new It({...this._def,unknownKeys:"strip"})}passthrough(){return new It({...this._def,unknownKeys:"passthrough"})}extend(t){return new It({...this._def,shape:()=>({...this._def.shape(),...t})})}merge(t){return new It({unknownKeys:t._def.unknownKeys,catchall:t._def.catchall,shape:()=>({...this._def.shape(),...t._def.shape()}),typeName:we.ZodObject})}setKey(t,n){return this.augment({[t]:n})}catchall(t){return new It({...this._def,catchall:t})}pick(t){const n={};return Xe.objectKeys(t).forEach(r=>{t[r]&&this.shape[r]&&(n[r]=this.shape[r])}),new It({...this._def,shape:()=>n})}omit(t){const n={};return Xe.objectKeys(this.shape).forEach(r=>{t[r]||(n[r]=this.shape[r])}),new It({...this._def,shape:()=>n})}deepPartial(){return bu(this)}partial(t){const n={};return Xe.objectKeys(this.shape).forEach(r=>{const i=this.shape[r];t&&!t[r]?n[r]=i:n[r]=i.optional()}),new It({...this._def,shape:()=>n})}required(t){const n={};return Xe.objectKeys(this.shape).forEach(r=>{if(t&&!t[r])n[r]=this.shape[r];else{let o=this.shape[r];for(;o instanceof os;)o=o._def.innerType;n[r]=o}}),new It({...this._def,shape:()=>n})}keyof(){return xD(Xe.objectKeys(this.shape))}}It.create=(e,t)=>new It({shape:()=>e,unknownKeys:"strip",catchall:gs.create(),typeName:we.ZodObject,...Ae(t)});It.strictCreate=(e,t)=>new It({shape:()=>e,unknownKeys:"strict",catchall:gs.create(),typeName:we.ZodObject,...Ae(t)});It.lazycreate=(e,t)=>new It({shape:e,unknownKeys:"strip",catchall:gs.create(),typeName:we.ZodObject,...Ae(t)});class hh extends Oe{_parse(t){const{ctx:n}=this._processInputParams(t),r=this._def.options;function i(o){for(const a of o)if(a.result.status==="valid")return a.result;for(const a of o)if(a.result.status==="dirty")return n.common.issues.push(...a.ctx.common.issues),a.result;const s=o.map(a=>new Di(a.ctx.common.issues));return ce(n,{code:re.invalid_union,unionErrors:s}),xe}if(n.common.async)return Promise.all(r.map(async o=>{const s={...n,common:{...n.common,issues:[]},parent:null};return{result:await o._parseAsync({data:n.data,path:n.path,parent:s}),ctx:s}})).then(i);{let o;const s=[];for(const l of r){const u={...n,common:{...n.common,issues:[]},parent:null},c=l._parseSync({data:n.data,path:n.path,parent:u});if(c.status==="valid")return c;c.status==="dirty"&&!o&&(o={result:c,ctx:u}),u.common.issues.length&&s.push(u.common.issues)}if(o)return n.common.issues.push(...o.ctx.common.issues),o.result;const a=s.map(l=>new Di(l));return ce(n,{code:re.invalid_union,unionErrors:a}),xe}}get options(){return this._def.options}}hh.create=(e,t)=>new hh({options:e,typeName:we.ZodUnion,...Ae(t)});const _m=e=>e instanceof mh?_m(e.schema):e instanceof Vi?_m(e.innerType()):e instanceof yh?[e.value]:e instanceof _a?e.options:e instanceof vh?Object.keys(e.enum):e instanceof bh?_m(e._def.innerType):e instanceof dh?[void 0]:e instanceof fh?[null]:null;class Wv extends Oe{_parse(t){const{ctx:n}=this._processInputParams(t);if(n.parsedType!==le.object)return ce(n,{code:re.invalid_type,expected:le.object,received:n.parsedType}),xe;const r=this.discriminator,i=n.data[r],o=this.optionsMap.get(i);return o?n.common.async?o._parseAsync({data:n.data,path:n.path,parent:n}):o._parseSync({data:n.data,path:n.path,parent:n}):(ce(n,{code:re.invalid_union_discriminator,options:Array.from(this.optionsMap.keys()),path:[r]}),xe)}get discriminator(){return this._def.discriminator}get options(){return this._def.options}get optionsMap(){return this._def.optionsMap}static create(t,n,r){const i=new Map;for(const o of n){const s=_m(o.shape[t]);if(!s)throw new Error(`A discriminator value for key \`${t}\` could not be extracted from all schema options`);for(const a of s){if(i.has(a))throw new Error(`Discriminator property ${String(t)} has duplicate value ${String(a)}`);i.set(a,o)}}return new Wv({typeName:we.ZodDiscriminatedUnion,discriminator:t,options:n,optionsMap:i,...Ae(r)})}}function Vw(e,t){const n=qs(e),r=qs(t);if(e===t)return{valid:!0,data:e};if(n===le.object&&r===le.object){const i=Xe.objectKeys(t),o=Xe.objectKeys(e).filter(a=>i.indexOf(a)!==-1),s={...e,...t};for(const a of o){const l=Vw(e[a],t[a]);if(!l.valid)return{valid:!1};s[a]=l.data}return{valid:!0,data:s}}else if(n===le.array&&r===le.array){if(e.length!==t.length)return{valid:!1};const i=[];for(let o=0;o{if(Bw(o)||Bw(s))return xe;const a=Vw(o.value,s.value);return a.valid?((jw(o)||jw(s))&&n.dirty(),{status:n.value,value:a.data}):(ce(r,{code:re.invalid_intersection_types}),xe)};return r.common.async?Promise.all([this._def.left._parseAsync({data:r.data,path:r.path,parent:r}),this._def.right._parseAsync({data:r.data,path:r.path,parent:r})]).then(([o,s])=>i(o,s)):i(this._def.left._parseSync({data:r.data,path:r.path,parent:r}),this._def.right._parseSync({data:r.data,path:r.path,parent:r}))}}ph.create=(e,t,n)=>new ph({left:e,right:t,typeName:we.ZodIntersection,...Ae(n)});class Co extends Oe{_parse(t){const{status:n,ctx:r}=this._processInputParams(t);if(r.parsedType!==le.array)return ce(r,{code:re.invalid_type,expected:le.array,received:r.parsedType}),xe;if(r.data.lengththis._def.items.length&&(ce(r,{code:re.too_big,maximum:this._def.items.length,inclusive:!0,exact:!1,type:"array"}),n.dirty());const o=[...r.data].map((s,a)=>{const l=this._def.items[a]||this._def.rest;return l?l._parse(new xo(r,s,r.path,a)):null}).filter(s=>!!s);return r.common.async?Promise.all(o).then(s=>Jn.mergeArray(n,s)):Jn.mergeArray(n,o)}get items(){return this._def.items}rest(t){return new Co({...this._def,rest:t})}}Co.create=(e,t)=>{if(!Array.isArray(e))throw new Error("You must pass an array of schemas to z.tuple([ ... ])");return new Co({items:e,typeName:we.ZodTuple,rest:null,...Ae(t)})};class gh extends Oe{get keySchema(){return this._def.keyType}get valueSchema(){return this._def.valueType}_parse(t){const{status:n,ctx:r}=this._processInputParams(t);if(r.parsedType!==le.object)return ce(r,{code:re.invalid_type,expected:le.object,received:r.parsedType}),xe;const i=[],o=this._def.keyType,s=this._def.valueType;for(const a in r.data)i.push({key:o._parse(new xo(r,a,r.path,a)),value:s._parse(new xo(r,r.data[a],r.path,a))});return r.common.async?Jn.mergeObjectAsync(n,i):Jn.mergeObjectSync(n,i)}get element(){return this._def.valueType}static create(t,n,r){return n instanceof Oe?new gh({keyType:t,valueType:n,typeName:we.ZodRecord,...Ae(r)}):new gh({keyType:Ri.create(),valueType:t,typeName:we.ZodRecord,...Ae(n)})}}class jy extends Oe{_parse(t){const{status:n,ctx:r}=this._processInputParams(t);if(r.parsedType!==le.map)return ce(r,{code:re.invalid_type,expected:le.map,received:r.parsedType}),xe;const i=this._def.keyType,o=this._def.valueType,s=[...r.data.entries()].map(([a,l],u)=>({key:i._parse(new xo(r,a,r.path,[u,"key"])),value:o._parse(new xo(r,l,r.path,[u,"value"]))}));if(r.common.async){const a=new Map;return Promise.resolve().then(async()=>{for(const l of s){const u=await l.key,c=await l.value;if(u.status==="aborted"||c.status==="aborted")return xe;(u.status==="dirty"||c.status==="dirty")&&n.dirty(),a.set(u.value,c.value)}return{status:n.value,value:a}})}else{const a=new Map;for(const l of s){const u=l.key,c=l.value;if(u.status==="aborted"||c.status==="aborted")return xe;(u.status==="dirty"||c.status==="dirty")&&n.dirty(),a.set(u.value,c.value)}return{status:n.value,value:a}}}}jy.create=(e,t,n)=>new jy({valueType:t,keyType:e,typeName:we.ZodMap,...Ae(n)});class Cl extends Oe{_parse(t){const{status:n,ctx:r}=this._processInputParams(t);if(r.parsedType!==le.set)return ce(r,{code:re.invalid_type,expected:le.set,received:r.parsedType}),xe;const i=this._def;i.minSize!==null&&r.data.sizei.maxSize.value&&(ce(r,{code:re.too_big,maximum:i.maxSize.value,type:"set",inclusive:!0,exact:!1,message:i.maxSize.message}),n.dirty());const o=this._def.valueType;function s(l){const u=new Set;for(const c of l){if(c.status==="aborted")return xe;c.status==="dirty"&&n.dirty(),u.add(c.value)}return{status:n.value,value:u}}const a=[...r.data.values()].map((l,u)=>o._parse(new xo(r,l,r.path,u)));return r.common.async?Promise.all(a).then(l=>s(l)):s(a)}min(t,n){return new Cl({...this._def,minSize:{value:t,message:be.toString(n)}})}max(t,n){return new Cl({...this._def,maxSize:{value:t,message:be.toString(n)}})}size(t,n){return this.min(t,n).max(t,n)}nonempty(t){return this.min(1,t)}}Cl.create=(e,t)=>new Cl({valueType:e,minSize:null,maxSize:null,typeName:we.ZodSet,...Ae(t)});class rc extends Oe{constructor(){super(...arguments),this.validate=this.implement}_parse(t){const{ctx:n}=this._processInputParams(t);if(n.parsedType!==le.function)return ce(n,{code:re.invalid_type,expected:le.function,received:n.parsedType}),xe;function r(a,l){return Dy({data:a,path:n.path,errorMaps:[n.common.contextualErrorMap,n.schemaErrorMap,Ny(),uh].filter(u=>!!u),issueData:{code:re.invalid_arguments,argumentsError:l}})}function i(a,l){return Dy({data:a,path:n.path,errorMaps:[n.common.contextualErrorMap,n.schemaErrorMap,Ny(),uh].filter(u=>!!u),issueData:{code:re.invalid_return_type,returnTypeError:l}})}const o={errorMap:n.common.contextualErrorMap},s=n.data;return this._def.returns instanceof Mc?fr(async(...a)=>{const l=new Di([]),u=await this._def.args.parseAsync(a,o).catch(f=>{throw l.addIssue(r(a,f)),l}),c=await s(...u);return await this._def.returns._def.type.parseAsync(c,o).catch(f=>{throw l.addIssue(i(c,f)),l})}):fr((...a)=>{const l=this._def.args.safeParse(a,o);if(!l.success)throw new Di([r(a,l.error)]);const u=s(...l.data),c=this._def.returns.safeParse(u,o);if(!c.success)throw new Di([i(u,c.error)]);return c.data})}parameters(){return this._def.args}returnType(){return this._def.returns}args(...t){return new rc({...this._def,args:Co.create(t).rest(cl.create())})}returns(t){return new rc({...this._def,returns:t})}implement(t){return this.parse(t)}strictImplement(t){return this.parse(t)}static create(t,n,r){return new rc({args:t||Co.create([]).rest(cl.create()),returns:n||cl.create(),typeName:we.ZodFunction,...Ae(r)})}}class mh extends Oe{get schema(){return this._def.getter()}_parse(t){const{ctx:n}=this._processInputParams(t);return this._def.getter()._parse({data:n.data,path:n.path,parent:n})}}mh.create=(e,t)=>new mh({getter:e,typeName:we.ZodLazy,...Ae(t)});class yh extends Oe{_parse(t){if(t.data!==this._def.value){const n=this._getOrReturnCtx(t);return ce(n,{received:n.data,code:re.invalid_literal,expected:this._def.value}),xe}return{status:"valid",value:t.data}}get value(){return this._def.value}}yh.create=(e,t)=>new yh({value:e,typeName:we.ZodLiteral,...Ae(t)});function xD(e,t){return new _a({values:e,typeName:we.ZodEnum,...Ae(t)})}class _a extends Oe{_parse(t){if(typeof t.data!="string"){const n=this._getOrReturnCtx(t),r=this._def.values;return ce(n,{expected:Xe.joinValues(r),received:n.parsedType,code:re.invalid_type}),xe}if(this._def.values.indexOf(t.data)===-1){const n=this._getOrReturnCtx(t),r=this._def.values;return ce(n,{received:n.data,code:re.invalid_enum_value,options:r}),xe}return fr(t.data)}get options(){return this._def.values}get enum(){const t={};for(const n of this._def.values)t[n]=n;return t}get Values(){const t={};for(const n of this._def.values)t[n]=n;return t}get Enum(){const t={};for(const n of this._def.values)t[n]=n;return t}extract(t){return _a.create(t)}exclude(t){return _a.create(this.options.filter(n=>!t.includes(n)))}}_a.create=xD;class vh extends Oe{_parse(t){const n=Xe.getValidEnumValues(this._def.values),r=this._getOrReturnCtx(t);if(r.parsedType!==le.string&&r.parsedType!==le.number){const i=Xe.objectValues(n);return ce(r,{expected:Xe.joinValues(i),received:r.parsedType,code:re.invalid_type}),xe}if(n.indexOf(t.data)===-1){const i=Xe.objectValues(n);return ce(r,{received:r.data,code:re.invalid_enum_value,options:i}),xe}return fr(t.data)}get enum(){return this._def.values}}vh.create=(e,t)=>new vh({values:e,typeName:we.ZodNativeEnum,...Ae(t)});class Mc extends Oe{unwrap(){return this._def.type}_parse(t){const{ctx:n}=this._processInputParams(t);if(n.parsedType!==le.promise&&n.common.async===!1)return ce(n,{code:re.invalid_type,expected:le.promise,received:n.parsedType}),xe;const r=n.parsedType===le.promise?n.data:Promise.resolve(n.data);return fr(r.then(i=>this._def.type.parseAsync(i,{path:n.path,errorMap:n.common.contextualErrorMap})))}}Mc.create=(e,t)=>new Mc({type:e,typeName:we.ZodPromise,...Ae(t)});class Vi extends Oe{innerType(){return this._def.schema}sourceType(){return this._def.schema._def.typeName===we.ZodEffects?this._def.schema.sourceType():this._def.schema}_parse(t){const{status:n,ctx:r}=this._processInputParams(t),i=this._def.effect||null;if(i.type==="preprocess"){const s=i.transform(r.data);return r.common.async?Promise.resolve(s).then(a=>this._def.schema._parseAsync({data:a,path:r.path,parent:r})):this._def.schema._parseSync({data:s,path:r.path,parent:r})}const o={addIssue:s=>{ce(r,s),s.fatal?n.abort():n.dirty()},get path(){return r.path}};if(o.addIssue=o.addIssue.bind(o),i.type==="refinement"){const s=a=>{const l=i.refinement(a,o);if(r.common.async)return Promise.resolve(l);if(l instanceof Promise)throw new Error("Async refinement encountered during synchronous parse operation. Use .parseAsync instead.");return a};if(r.common.async===!1){const a=this._def.schema._parseSync({data:r.data,path:r.path,parent:r});return a.status==="aborted"?xe:(a.status==="dirty"&&n.dirty(),s(a.value),{status:n.value,value:a.value})}else return this._def.schema._parseAsync({data:r.data,path:r.path,parent:r}).then(a=>a.status==="aborted"?xe:(a.status==="dirty"&&n.dirty(),s(a.value).then(()=>({status:n.value,value:a.value}))))}if(i.type==="transform")if(r.common.async===!1){const s=this._def.schema._parseSync({data:r.data,path:r.path,parent:r});if(!Ly(s))return s;const a=i.transform(s.value,o);if(a instanceof Promise)throw new Error("Asynchronous transform encountered during synchronous parse operation. Use .parseAsync instead.");return{status:n.value,value:a}}else return this._def.schema._parseAsync({data:r.data,path:r.path,parent:r}).then(s=>Ly(s)?Promise.resolve(i.transform(s.value,o)).then(a=>({status:n.value,value:a})):s);Xe.assertNever(i)}}Vi.create=(e,t,n)=>new Vi({schema:e,typeName:we.ZodEffects,effect:t,...Ae(n)});Vi.createWithPreprocess=(e,t,n)=>new Vi({schema:t,effect:{type:"preprocess",transform:e},typeName:we.ZodEffects,...Ae(n)});class os extends Oe{_parse(t){return this._getType(t)===le.undefined?fr(void 0):this._def.innerType._parse(t)}unwrap(){return this._def.innerType}}os.create=(e,t)=>new os({innerType:e,typeName:we.ZodOptional,...Ae(t)});class Tl extends Oe{_parse(t){return this._getType(t)===le.null?fr(null):this._def.innerType._parse(t)}unwrap(){return this._def.innerType}}Tl.create=(e,t)=>new Tl({innerType:e,typeName:we.ZodNullable,...Ae(t)});class bh extends Oe{_parse(t){const{ctx:n}=this._processInputParams(t);let r=n.data;return n.parsedType===le.undefined&&(r=this._def.defaultValue()),this._def.innerType._parse({data:r,path:n.path,parent:n})}removeDefault(){return this._def.innerType}}bh.create=(e,t)=>new bh({innerType:e,typeName:we.ZodDefault,defaultValue:typeof t.default=="function"?t.default:()=>t.default,...Ae(t)});class Vy extends Oe{_parse(t){const{ctx:n}=this._processInputParams(t),r={...n,common:{...n.common,issues:[]}},i=this._def.innerType._parse({data:r.data,path:r.path,parent:{...r}});return $y(i)?i.then(o=>({status:"valid",value:o.status==="valid"?o.value:this._def.catchValue({get error(){return new Di(r.common.issues)},input:r.data})})):{status:"valid",value:i.status==="valid"?i.value:this._def.catchValue({get error(){return new Di(r.common.issues)},input:r.data})}}removeCatch(){return this._def.innerType}}Vy.create=(e,t)=>new Vy({innerType:e,typeName:we.ZodCatch,catchValue:typeof t.catch=="function"?t.catch:()=>t.catch,...Ae(t)});class zy extends Oe{_parse(t){if(this._getType(t)!==le.nan){const r=this._getOrReturnCtx(t);return ce(r,{code:re.invalid_type,expected:le.nan,received:r.parsedType}),xe}return{status:"valid",value:t.data}}}zy.create=e=>new zy({typeName:we.ZodNaN,...Ae(e)});const Hue=Symbol("zod_brand");class CD extends Oe{_parse(t){const{ctx:n}=this._processInputParams(t),r=n.data;return this._def.type._parse({data:r,path:n.path,parent:n})}unwrap(){return this._def.type}}class bp extends Oe{_parse(t){const{status:n,ctx:r}=this._processInputParams(t);if(r.common.async)return(async()=>{const o=await this._def.in._parseAsync({data:r.data,path:r.path,parent:r});return o.status==="aborted"?xe:o.status==="dirty"?(n.dirty(),wD(o.value)):this._def.out._parseAsync({data:o.value,path:r.path,parent:r})})();{const i=this._def.in._parseSync({data:r.data,path:r.path,parent:r});return i.status==="aborted"?xe:i.status==="dirty"?(n.dirty(),{status:"dirty",value:i.value}):this._def.out._parseSync({data:i.value,path:r.path,parent:r})}}static create(t,n){return new bp({in:t,out:n,typeName:we.ZodPipeline})}}const TD=(e,t={},n)=>e?Ic.create().superRefine((r,i)=>{var o,s;if(!e(r)){const a=typeof t=="function"?t(r):typeof t=="string"?{message:t}:t,l=(s=(o=a.fatal)!==null&&o!==void 0?o:n)!==null&&s!==void 0?s:!0,u=typeof a=="string"?{message:a}:a;i.addIssue({code:"custom",...u,fatal:l})}}):Ic.create(),que={object:It.lazycreate};var we;(function(e){e.ZodString="ZodString",e.ZodNumber="ZodNumber",e.ZodNaN="ZodNaN",e.ZodBigInt="ZodBigInt",e.ZodBoolean="ZodBoolean",e.ZodDate="ZodDate",e.ZodSymbol="ZodSymbol",e.ZodUndefined="ZodUndefined",e.ZodNull="ZodNull",e.ZodAny="ZodAny",e.ZodUnknown="ZodUnknown",e.ZodNever="ZodNever",e.ZodVoid="ZodVoid",e.ZodArray="ZodArray",e.ZodObject="ZodObject",e.ZodUnion="ZodUnion",e.ZodDiscriminatedUnion="ZodDiscriminatedUnion",e.ZodIntersection="ZodIntersection",e.ZodTuple="ZodTuple",e.ZodRecord="ZodRecord",e.ZodMap="ZodMap",e.ZodSet="ZodSet",e.ZodFunction="ZodFunction",e.ZodLazy="ZodLazy",e.ZodLiteral="ZodLiteral",e.ZodEnum="ZodEnum",e.ZodEffects="ZodEffects",e.ZodNativeEnum="ZodNativeEnum",e.ZodOptional="ZodOptional",e.ZodNullable="ZodNullable",e.ZodDefault="ZodDefault",e.ZodCatch="ZodCatch",e.ZodPromise="ZodPromise",e.ZodBranded="ZodBranded",e.ZodPipeline="ZodPipeline"})(we||(we={}));const Wue=(e,t={message:`Input not instance of ${e.name}`})=>TD(n=>n instanceof e,t),ED=Ri.create,PD=ba.create,Kue=zy.create,Yue=Sa.create,kD=ch.create,Xue=xl.create,Que=Fy.create,Zue=dh.create,Jue=fh.create,ece=Ic.create,tce=cl.create,nce=gs.create,rce=By.create,ice=Li.create,oce=It.create,sce=It.strictCreate,ace=hh.create,lce=Wv.create,uce=ph.create,cce=Co.create,dce=gh.create,fce=jy.create,hce=Cl.create,pce=rc.create,gce=mh.create,mce=yh.create,yce=_a.create,vce=vh.create,bce=Mc.create,V6=Vi.create,Sce=os.create,_ce=Tl.create,wce=Vi.createWithPreprocess,xce=bp.create,Cce=()=>ED().optional(),Tce=()=>PD().optional(),Ece=()=>kD().optional(),Pce={string:e=>Ri.create({...e,coerce:!0}),number:e=>ba.create({...e,coerce:!0}),boolean:e=>ch.create({...e,coerce:!0}),bigint:e=>Sa.create({...e,coerce:!0}),date:e=>xl.create({...e,coerce:!0})},kce=xe;var kn=Object.freeze({__proto__:null,defaultErrorMap:uh,setErrorMap:Iue,getErrorMap:Ny,makeIssue:Dy,EMPTY_PATH:Mue,addIssueToContext:ce,ParseStatus:Jn,INVALID:xe,DIRTY:wD,OK:fr,isAborted:Bw,isDirty:jw,isValid:Ly,isAsync:$y,get util(){return Xe},get objectUtil(){return Fw},ZodParsedType:le,getParsedType:qs,ZodType:Oe,ZodString:Ri,ZodNumber:ba,ZodBigInt:Sa,ZodBoolean:ch,ZodDate:xl,ZodSymbol:Fy,ZodUndefined:dh,ZodNull:fh,ZodAny:Ic,ZodUnknown:cl,ZodNever:gs,ZodVoid:By,ZodArray:Li,ZodObject:It,ZodUnion:hh,ZodDiscriminatedUnion:Wv,ZodIntersection:ph,ZodTuple:Co,ZodRecord:gh,ZodMap:jy,ZodSet:Cl,ZodFunction:rc,ZodLazy:mh,ZodLiteral:yh,ZodEnum:_a,ZodNativeEnum:vh,ZodPromise:Mc,ZodEffects:Vi,ZodTransformer:Vi,ZodOptional:os,ZodNullable:Tl,ZodDefault:bh,ZodCatch:Vy,ZodNaN:zy,BRAND:Hue,ZodBranded:CD,ZodPipeline:bp,custom:TD,Schema:Oe,ZodSchema:Oe,late:que,get ZodFirstPartyTypeKind(){return we},coerce:Pce,any:ece,array:ice,bigint:Yue,boolean:kD,date:Xue,discriminatedUnion:lce,effect:V6,enum:yce,function:pce,instanceof:Wue,intersection:uce,lazy:gce,literal:mce,map:fce,nan:Kue,nativeEnum:vce,never:nce,null:Jue,nullable:_ce,number:PD,object:oce,oboolean:Ece,onumber:Tce,optional:Sce,ostring:Cce,pipeline:xce,preprocess:wce,promise:bce,record:dce,set:hce,strictObject:sce,string:ED,symbol:Que,transformer:V6,tuple:cce,undefined:Zue,union:ace,unknown:tce,void:rce,NEVER:kce,ZodIssueCode:re,quotelessJson:Rue,ZodError:Di});const Ace=kn.string(),hEe=e=>Ace.safeParse(e).success,Oce=kn.string(),pEe=e=>Oce.safeParse(e).success,Rce=kn.number().int().min(1),gEe=e=>Rce.safeParse(e).success,Ice=kn.number().min(1),mEe=e=>Ice.safeParse(e).success,Mce=kn.enum(w7),yEe=e=>Mce.safeParse(e).success,Nce=kn.number().int().min(0).max(FZ),vEe=e=>Nce.safeParse(e).success,Dce=kn.number().multipleOf(8).min(64),bEe=e=>Dce.safeParse(e).success,Lce=kn.number().multipleOf(8).min(64),SEe=e=>Lce.safeParse(e).success,Kv=kn.enum(["sd-1","sd-2","sdxl","sdxl-refiner"]),Yv=kn.object({model_name:kn.string().min(1),base_model:Kv}),_Ee=e=>Yv.safeParse(e).success,$ce=kn.object({model_name:kn.string().min(1),base_model:Kv}),wEe=kn.object({model_name:kn.string().min(1),base_model:Kv}),xEe=kn.object({model_name:kn.string().min(1),base_model:Kv}),Fce=kn.number().min(0).max(1),CEe=e=>Fce.safeParse(e).success,Vl={cfgScale:7.5,height:512,img2imgStrength:.75,infillMethod:"patchmatch",iterations:1,perlin:0,positivePrompt:"",negativePrompt:"",scheduler:$Z,seamBlur:16,seamSize:96,seamSteps:30,seamStrength:.7,seed:0,seedWeights:"",shouldFitToWidthHeight:!0,shouldGenerateVariations:!1,shouldRandomizeSeed:!0,shouldUseNoiseSettings:!1,steps:50,threshold:0,tileSize:32,variationAmount:.1,width:512,shouldUseSymmetry:!1,horizontalSymmetrySteps:0,verticalSymmetrySteps:0,model:null,vae:null,seamlessXAxis:!1,seamlessYAxis:!1,clipSkip:0,shouldUseCpuNoise:!0},Bce=Vl,AD=Vt({name:"generation",initialState:Bce,reducers:{setPositivePrompt:(e,t)=>{e.positivePrompt=t.payload},setNegativePrompt:(e,t)=>{e.negativePrompt=t.payload},setIterations:(e,t)=>{e.iterations=t.payload},setSteps:(e,t)=>{e.steps=t.payload},clampSymmetrySteps:e=>{e.horizontalSymmetrySteps=Jo(e.horizontalSymmetrySteps,0,e.steps),e.verticalSymmetrySteps=Jo(e.verticalSymmetrySteps,0,e.steps)},setCfgScale:(e,t)=>{e.cfgScale=t.payload},setThreshold:(e,t)=>{e.threshold=t.payload},setPerlin:(e,t)=>{e.perlin=t.payload},setHeight:(e,t)=>{e.height=t.payload},setWidth:(e,t)=>{e.width=t.payload},toggleSize:e=>{const[t,n]=[e.width,e.height];e.width=n,e.height=t},setScheduler:(e,t)=>{e.scheduler=t.payload},setSeed:(e,t)=>{e.seed=t.payload,e.shouldRandomizeSeed=!1},setImg2imgStrength:(e,t)=>{e.img2imgStrength=t.payload},setSeamlessXAxis:(e,t)=>{e.seamlessXAxis=t.payload},setSeamlessYAxis:(e,t)=>{e.seamlessYAxis=t.payload},setShouldFitToWidthHeight:(e,t)=>{e.shouldFitToWidthHeight=t.payload},resetSeed:e=>{e.seed=-1},setShouldGenerateVariations:(e,t)=>{e.shouldGenerateVariations=t.payload},setVariationAmount:(e,t)=>{e.variationAmount=t.payload},setSeedWeights:(e,t)=>{e.seedWeights=t.payload,e.shouldGenerateVariations=!0,e.variationAmount=0},resetParametersState:e=>({...e,...Vl}),setShouldRandomizeSeed:(e,t)=>{e.shouldRandomizeSeed=t.payload},clearInitialImage:e=>{e.initialImage=void 0},setSeamSize:(e,t)=>{e.seamSize=t.payload},setSeamBlur:(e,t)=>{e.seamBlur=t.payload},setSeamStrength:(e,t)=>{e.seamStrength=t.payload},setSeamSteps:(e,t)=>{e.seamSteps=t.payload},setTileSize:(e,t)=>{e.tileSize=t.payload},setInfillMethod:(e,t)=>{e.infillMethod=t.payload},setShouldUseSymmetry:(e,t)=>{e.shouldUseSymmetry=t.payload},setHorizontalSymmetrySteps:(e,t)=>{e.horizontalSymmetrySteps=t.payload},setVerticalSymmetrySteps:(e,t)=>{e.verticalSymmetrySteps=t.payload},setShouldUseNoiseSettings:(e,t)=>{e.shouldUseNoiseSettings=t.payload},initialImageChanged:(e,t)=>{const{image_name:n,width:r,height:i}=t.payload;e.initialImage={imageName:n,width:r,height:i}},modelChanged:(e,t)=>{if(e.model=t.payload,e.model===null)return;const{maxClip:n}=Yd[e.model.base_model];e.clipSkip=Jo(e.clipSkip,0,n)},vaeSelected:(e,t)=>{e.vae=t.payload},setClipSkip:(e,t)=>{e.clipSkip=t.payload},shouldUseCpuNoiseChanged:(e,t)=>{e.shouldUseCpuNoise=t.payload}},extraReducers:e=>{e.addCase(BZ,(t,n)=>{var i;const r=(i=n.payload.sd)==null?void 0:i.defaultModel;if(r&&!t.model){const[o,s,a]=r.split("/"),l=Yv.safeParse({model_name:a,base_model:o});l.success&&(t.model=l.data)}}),e.addCase(Gce,(t,n)=>{n.payload||(t.clipSkip=0)}),e.addCase(DD,(t,n)=>{const r=n.payload;r&&(t.height=no(t.width/r,8))})}}),{clampSymmetrySteps:TEe,clearInitialImage:OD,resetParametersState:EEe,resetSeed:PEe,setCfgScale:kEe,setWidth:AEe,setHeight:OEe,toggleSize:REe,setImg2imgStrength:IEe,setInfillMethod:jce,setIterations:MEe,setPerlin:NEe,setPositivePrompt:DEe,setNegativePrompt:LEe,setScheduler:$Ee,setSeamBlur:FEe,setSeamSize:BEe,setSeamSteps:jEe,setSeamStrength:VEe,setSeed:zEe,setSeedWeights:UEe,setShouldFitToWidthHeight:GEe,setShouldGenerateVariations:HEe,setShouldRandomizeSeed:qEe,setSteps:WEe,setThreshold:KEe,setTileSize:YEe,setVariationAmount:XEe,setShouldUseSymmetry:QEe,setHorizontalSymmetrySteps:ZEe,setVerticalSymmetrySteps:JEe,initialImageChanged:Sh,modelChanged:wm,vaeSelected:RD,setShouldUseNoiseSettings:ePe,setSeamlessXAxis:tPe,setSeamlessYAxis:nPe,setClipSkip:z6,shouldUseCpuNoiseChanged:rPe}=AD.actions,Vce=AD.reducer,ID=["txt2img","img2img","unifiedCanvas","nodes","modelManager","batch"],U6=(e,t)=>{typeof t=="number"?e.activeTab=t:e.activeTab=ID.indexOf(t)},MD={activeTab:0,shouldPinParametersPanel:!0,shouldShowParametersPanel:!0,shouldShowImageDetails:!1,shouldUseCanvasBetaLayout:!1,shouldShowExistingModelsInSearch:!1,shouldUseSliders:!1,addNewModelUIOption:null,shouldPinGallery:!0,shouldShowGallery:!0,shouldHidePreview:!1,shouldShowProgressInViewer:!0,shouldShowEmbeddingPicker:!1,shouldShowAdvancedOptions:!1,aspectRatio:null,favoriteSchedulers:[]},ND=Vt({name:"ui",initialState:MD,reducers:{setActiveTab:(e,t)=>{U6(e,t.payload)},setShouldPinParametersPanel:(e,t)=>{e.shouldPinParametersPanel=t.payload,e.shouldShowParametersPanel=!0},setShouldShowParametersPanel:(e,t)=>{e.shouldShowParametersPanel=t.payload},setShouldShowImageDetails:(e,t)=>{e.shouldShowImageDetails=t.payload},setShouldUseCanvasBetaLayout:(e,t)=>{e.shouldUseCanvasBetaLayout=t.payload},setShouldHidePreview:(e,t)=>{e.shouldHidePreview=t.payload},setShouldShowExistingModelsInSearch:(e,t)=>{e.shouldShowExistingModelsInSearch=t.payload},setShouldUseSliders:(e,t)=>{e.shouldUseSliders=t.payload},setAddNewModelUIOption:(e,t)=>{e.addNewModelUIOption=t.payload},setShouldShowGallery:(e,t)=>{e.shouldShowGallery=t.payload},togglePinGalleryPanel:e=>{e.shouldPinGallery=!e.shouldPinGallery,e.shouldPinGallery||(e.shouldShowGallery=!0)},togglePinParametersPanel:e=>{e.shouldPinParametersPanel=!e.shouldPinParametersPanel,e.shouldPinParametersPanel||(e.shouldShowParametersPanel=!0)},toggleParametersPanel:e=>{e.shouldShowParametersPanel=!e.shouldShowParametersPanel},toggleGalleryPanel:e=>{e.shouldShowGallery=!e.shouldShowGallery},togglePanels:e=>{e.shouldShowGallery||e.shouldShowParametersPanel?(e.shouldShowGallery=!1,e.shouldShowParametersPanel=!1):(e.shouldShowGallery=!0,e.shouldShowParametersPanel=!0)},setShouldShowProgressInViewer:(e,t)=>{e.shouldShowProgressInViewer=t.payload},favoriteSchedulersChanged:(e,t)=>{e.favoriteSchedulers=t.payload},toggleEmbeddingPicker:e=>{e.shouldShowEmbeddingPicker=!e.shouldShowEmbeddingPicker},setShouldShowAdvancedOptions:(e,t)=>{e.shouldShowAdvancedOptions=t.payload},setAspectRatio:(e,t)=>{e.aspectRatio=t.payload}},extraReducers(e){e.addCase(Sh,t=>{U6(t,"img2img")})}}),{setActiveTab:zce,setShouldPinParametersPanel:iPe,setShouldShowParametersPanel:oPe,setShouldShowImageDetails:sPe,setShouldUseCanvasBetaLayout:Uce,setShouldShowExistingModelsInSearch:aPe,setShouldUseSliders:lPe,setAddNewModelUIOption:uPe,setShouldHidePreview:cPe,setShouldShowGallery:dPe,togglePanels:fPe,togglePinGalleryPanel:hPe,togglePinParametersPanel:pPe,toggleParametersPanel:gPe,toggleGalleryPanel:mPe,setShouldShowProgressInViewer:yPe,favoriteSchedulersChanged:vPe,toggleEmbeddingPicker:bPe,setShouldShowAdvancedOptions:Gce,setAspectRatio:DD}=ND.actions,Hce=ND.reducer,Ro=Gf.withTypes(),_s={memoizeOptions:{resultEqualityCheck:ap}},Sp=e=>e.system,qce=e=>e.system.toastQueue;at(Sp,e=>{const{model_list:t}=e,n=Tv(t,(r,i,o)=>(i.status==="active"&&(r=o),r),"");return{...t[n],name:n}},_s);at(Sp,e=>{const{model_list:t}=e;return dZ(t,(r,i)=>{if(r.format==="diffusers")return{name:i,...r}})},_s);const SPe=at(Sp,e=>e.language,_s),_Pe=at(e=>e,e=>e.system.isProcessing||!e.system.isConnected);var Nc={},LD={},El={};Object.defineProperty(El,"__esModule",{value:!0});El.ROARR_LOG_FORMAT_VERSION=El.ROARR_VERSION=void 0;El.ROARR_VERSION="5.0.0";El.ROARR_LOG_FORMAT_VERSION="2.0.0";var _p={};Object.defineProperty(_p,"__esModule",{value:!0});_p.logLevels=void 0;_p.logLevels={debug:20,error:50,fatal:60,info:30,trace:10,warn:40};var $D={},Xv={};Object.defineProperty(Xv,"__esModule",{value:!0});Xv.hasOwnProperty=void 0;const Wce=(e,t)=>Object.prototype.hasOwnProperty.call(e,t);Xv.hasOwnProperty=Wce;(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.hasOwnProperty=void 0;var t=Xv;Object.defineProperty(e,"hasOwnProperty",{enumerable:!0,get:function(){return t.hasOwnProperty}})})($D);var FD={},Qv={},a3={},Zv={};Object.defineProperty(Zv,"__esModule",{value:!0});Zv.boolean=void 0;const Kce=function(e){switch(Object.prototype.toString.call(e)){case"[object String]":return["true","t","yes","y","on","1"].includes(e.trim().toLowerCase());case"[object Number]":return e.valueOf()===1;case"[object Boolean]":return e.valueOf();default:return!1}};Zv.boolean=Kce;var Jv={};Object.defineProperty(Jv,"__esModule",{value:!0});Jv.isBooleanable=void 0;const Yce=function(e){switch(Object.prototype.toString.call(e)){case"[object String]":return["true","t","yes","y","on","1","false","f","no","n","off","0"].includes(e.trim().toLowerCase());case"[object Number]":return[0,1].includes(e.valueOf());case"[object Boolean]":return!0;default:return!1}};Jv.isBooleanable=Yce;(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.isBooleanable=e.boolean=void 0;const t=Zv;Object.defineProperty(e,"boolean",{enumerable:!0,get:function(){return t.boolean}});const n=Jv;Object.defineProperty(e,"isBooleanable",{enumerable:!0,get:function(){return n.isBooleanable}})})(a3);var e1={};Object.defineProperty(e1,"__esModule",{value:!0});e1.tokenize=void 0;const Xce=/(?:%(?([+0-]|-\+))?(?\d+)?(?\d+\$)?(?\.\d+)?(?[%BCESb-iosux]))|(\\%)/g,Qce=e=>{let t;const n=[];let r=0,i=0,o=null;for(;(t=Xce.exec(e))!==null;){t.index>i&&(o={literal:e.slice(i,t.index),type:"literal"},n.push(o));const s=t[0];i=t.index+s.length,s==="\\%"||s==="%%"?o&&o.type==="literal"?o.literal+="%":(o={literal:"%",type:"literal"},n.push(o)):t.groups&&(o={conversion:t.groups.conversion,flag:t.groups.flag||null,placeholder:s,position:t.groups.position?Number.parseInt(t.groups.position,10)-1:r++,precision:t.groups.precision?Number.parseInt(t.groups.precision.slice(1),10):null,type:"placeholder",width:t.groups.width?Number.parseInt(t.groups.width,10):null},n.push(o))}return i<=e.length-1&&(o&&o.type==="literal"?o.literal+=e.slice(i):n.push({literal:e.slice(i),type:"literal"})),n};e1.tokenize=Qce;Object.defineProperty(Qv,"__esModule",{value:!0});Qv.createPrintf=void 0;const G6=a3,Zce=e1,Jce=(e,t)=>t.placeholder,ede=e=>{var t;const n=(o,s,a)=>a==="-"?o.padEnd(s," "):a==="-+"?((Number(o)>=0?"+":"")+o).padEnd(s," "):a==="+"?((Number(o)>=0?"+":"")+o).padStart(s," "):a==="0"?o.padStart(s,"0"):o.padStart(s," "),r=(t=e==null?void 0:e.formatUnboundExpression)!==null&&t!==void 0?t:Jce,i={};return(o,...s)=>{let a=i[o];a||(a=i[o]=Zce.tokenize(o));let l="";for(const u of a)if(u.type==="literal")l+=u.literal;else{let c=s[u.position];if(c===void 0)l+=r(o,u,s);else if(u.conversion==="b")l+=G6.boolean(c)?"true":"false";else if(u.conversion==="B")l+=G6.boolean(c)?"TRUE":"FALSE";else if(u.conversion==="c")l+=c;else if(u.conversion==="C")l+=String(c).toUpperCase();else if(u.conversion==="i"||u.conversion==="d")c=String(Math.trunc(c)),u.width!==null&&(c=n(c,u.width,u.flag)),l+=c;else if(u.conversion==="e")l+=Number(c).toExponential();else if(u.conversion==="E")l+=Number(c).toExponential().toUpperCase();else if(u.conversion==="f")u.precision!==null&&(c=Number(c).toFixed(u.precision)),u.width!==null&&(c=n(String(c),u.width,u.flag)),l+=c;else if(u.conversion==="o")l+=(Number.parseInt(String(c),10)>>>0).toString(8);else if(u.conversion==="s")u.width!==null&&(c=n(String(c),u.width,u.flag)),l+=c;else if(u.conversion==="S")u.width!==null&&(c=n(String(c),u.width,u.flag)),l+=String(c).toUpperCase();else if(u.conversion==="u")l+=Number.parseInt(String(c),10)>>>0;else if(u.conversion==="x")c=(Number.parseInt(String(c),10)>>>0).toString(16),u.width!==null&&(c=n(String(c),u.width,u.flag)),l+=c;else throw new Error("Unknown format specifier.")}return l}};Qv.createPrintf=ede;(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.printf=e.createPrintf=void 0;const t=Qv;Object.defineProperty(e,"createPrintf",{enumerable:!0,get:function(){return t.createPrintf}}),e.printf=t.createPrintf()})(FD);var H6=Object.prototype.toString,BD=function(t){var n=H6.call(t),r=n==="[object Arguments]";return r||(r=n!=="[object Array]"&&t!==null&&typeof t=="object"&&typeof t.length=="number"&&t.length>=0&&H6.call(t.callee)==="[object Function]"),r},o_,q6;function tde(){if(q6)return o_;q6=1;var e;if(!Object.keys){var t=Object.prototype.hasOwnProperty,n=Object.prototype.toString,r=BD,i=Object.prototype.propertyIsEnumerable,o=!i.call({toString:null},"toString"),s=i.call(function(){},"prototype"),a=["toString","toLocaleString","valueOf","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","constructor"],l=function(f){var h=f.constructor;return h&&h.prototype===f},u={$applicationCache:!0,$console:!0,$external:!0,$frame:!0,$frameElement:!0,$frames:!0,$innerHeight:!0,$innerWidth:!0,$onmozfullscreenchange:!0,$onmozfullscreenerror:!0,$outerHeight:!0,$outerWidth:!0,$pageXOffset:!0,$pageYOffset:!0,$parent:!0,$scrollLeft:!0,$scrollTop:!0,$scrollX:!0,$scrollY:!0,$self:!0,$webkitIndexedDB:!0,$webkitStorageInfo:!0,$window:!0},c=function(){if(typeof window>"u")return!1;for(var f in window)try{if(!u["$"+f]&&t.call(window,f)&&window[f]!==null&&typeof window[f]=="object")try{l(window[f])}catch{return!0}}catch{return!0}return!1}(),d=function(f){if(typeof window>"u"||!c)return l(f);try{return l(f)}catch{return!1}};e=function(h){var p=h!==null&&typeof h=="object",m=n.call(h)==="[object Function]",S=r(h),v=p&&n.call(h)==="[object String]",y=[];if(!p&&!m&&!S)throw new TypeError("Object.keys called on a non-object");var g=s&&m;if(v&&h.length>0&&!t.call(h,0))for(var b=0;b0)for(var _=0;_"u"||!_n?je:_n(Uint8Array),fl={"%AggregateError%":typeof AggregateError>"u"?je:AggregateError,"%Array%":Array,"%ArrayBuffer%":typeof ArrayBuffer>"u"?je:ArrayBuffer,"%ArrayIteratorPrototype%":ou&&_n?_n([][Symbol.iterator]()):je,"%AsyncFromSyncIteratorPrototype%":je,"%AsyncFunction%":Su,"%AsyncGenerator%":Su,"%AsyncGeneratorFunction%":Su,"%AsyncIteratorPrototype%":Su,"%Atomics%":typeof Atomics>"u"?je:Atomics,"%BigInt%":typeof BigInt>"u"?je:BigInt,"%BigInt64Array%":typeof BigInt64Array>"u"?je:BigInt64Array,"%BigUint64Array%":typeof BigUint64Array>"u"?je:BigUint64Array,"%Boolean%":Boolean,"%DataView%":typeof DataView>"u"?je:DataView,"%Date%":Date,"%decodeURI%":decodeURI,"%decodeURIComponent%":decodeURIComponent,"%encodeURI%":encodeURI,"%encodeURIComponent%":encodeURIComponent,"%Error%":Error,"%eval%":eval,"%EvalError%":EvalError,"%Float32Array%":typeof Float32Array>"u"?je:Float32Array,"%Float64Array%":typeof Float64Array>"u"?je:Float64Array,"%FinalizationRegistry%":typeof FinalizationRegistry>"u"?je:FinalizationRegistry,"%Function%":VD,"%GeneratorFunction%":Su,"%Int8Array%":typeof Int8Array>"u"?je:Int8Array,"%Int16Array%":typeof Int16Array>"u"?je:Int16Array,"%Int32Array%":typeof Int32Array>"u"?je:Int32Array,"%isFinite%":isFinite,"%isNaN%":isNaN,"%IteratorPrototype%":ou&&_n?_n(_n([][Symbol.iterator]())):je,"%JSON%":typeof JSON=="object"?JSON:je,"%Map%":typeof Map>"u"?je:Map,"%MapIteratorPrototype%":typeof Map>"u"||!ou||!_n?je:_n(new Map()[Symbol.iterator]()),"%Math%":Math,"%Number%":Number,"%Object%":Object,"%parseFloat%":parseFloat,"%parseInt%":parseInt,"%Promise%":typeof Promise>"u"?je:Promise,"%Proxy%":typeof Proxy>"u"?je:Proxy,"%RangeError%":RangeError,"%ReferenceError%":ReferenceError,"%Reflect%":typeof Reflect>"u"?je:Reflect,"%RegExp%":RegExp,"%Set%":typeof Set>"u"?je:Set,"%SetIteratorPrototype%":typeof Set>"u"||!ou||!_n?je:_n(new Set()[Symbol.iterator]()),"%SharedArrayBuffer%":typeof SharedArrayBuffer>"u"?je:SharedArrayBuffer,"%String%":String,"%StringIteratorPrototype%":ou&&_n?_n(""[Symbol.iterator]()):je,"%Symbol%":ou?Symbol:je,"%SyntaxError%":Dc,"%ThrowTypeError%":yde,"%TypedArray%":bde,"%TypeError%":ic,"%Uint8Array%":typeof Uint8Array>"u"?je:Uint8Array,"%Uint8ClampedArray%":typeof Uint8ClampedArray>"u"?je:Uint8ClampedArray,"%Uint16Array%":typeof Uint16Array>"u"?je:Uint16Array,"%Uint32Array%":typeof Uint32Array>"u"?je:Uint32Array,"%URIError%":URIError,"%WeakMap%":typeof WeakMap>"u"?je:WeakMap,"%WeakRef%":typeof WeakRef>"u"?je:WeakRef,"%WeakSet%":typeof WeakSet>"u"?je:WeakSet};if(_n)try{null.error}catch(e){var Sde=_n(_n(e));fl["%Error.prototype%"]=Sde}var _de=function e(t){var n;if(t==="%AsyncFunction%")n=a_("async function () {}");else if(t==="%GeneratorFunction%")n=a_("function* () {}");else if(t==="%AsyncGeneratorFunction%")n=a_("async function* () {}");else if(t==="%AsyncGenerator%"){var r=e("%AsyncGeneratorFunction%");r&&(n=r.prototype)}else if(t==="%AsyncIteratorPrototype%"){var i=e("%AsyncGenerator%");i&&_n&&(n=_n(i.prototype))}return fl[t]=n,n},Q6={"%ArrayBufferPrototype%":["ArrayBuffer","prototype"],"%ArrayPrototype%":["Array","prototype"],"%ArrayProto_entries%":["Array","prototype","entries"],"%ArrayProto_forEach%":["Array","prototype","forEach"],"%ArrayProto_keys%":["Array","prototype","keys"],"%ArrayProto_values%":["Array","prototype","values"],"%AsyncFunctionPrototype%":["AsyncFunction","prototype"],"%AsyncGenerator%":["AsyncGeneratorFunction","prototype"],"%AsyncGeneratorPrototype%":["AsyncGeneratorFunction","prototype","prototype"],"%BooleanPrototype%":["Boolean","prototype"],"%DataViewPrototype%":["DataView","prototype"],"%DatePrototype%":["Date","prototype"],"%ErrorPrototype%":["Error","prototype"],"%EvalErrorPrototype%":["EvalError","prototype"],"%Float32ArrayPrototype%":["Float32Array","prototype"],"%Float64ArrayPrototype%":["Float64Array","prototype"],"%FunctionPrototype%":["Function","prototype"],"%Generator%":["GeneratorFunction","prototype"],"%GeneratorPrototype%":["GeneratorFunction","prototype","prototype"],"%Int8ArrayPrototype%":["Int8Array","prototype"],"%Int16ArrayPrototype%":["Int16Array","prototype"],"%Int32ArrayPrototype%":["Int32Array","prototype"],"%JSONParse%":["JSON","parse"],"%JSONStringify%":["JSON","stringify"],"%MapPrototype%":["Map","prototype"],"%NumberPrototype%":["Number","prototype"],"%ObjectPrototype%":["Object","prototype"],"%ObjProto_toString%":["Object","prototype","toString"],"%ObjProto_valueOf%":["Object","prototype","valueOf"],"%PromisePrototype%":["Promise","prototype"],"%PromiseProto_then%":["Promise","prototype","then"],"%Promise_all%":["Promise","all"],"%Promise_reject%":["Promise","reject"],"%Promise_resolve%":["Promise","resolve"],"%RangeErrorPrototype%":["RangeError","prototype"],"%ReferenceErrorPrototype%":["ReferenceError","prototype"],"%RegExpPrototype%":["RegExp","prototype"],"%SetPrototype%":["Set","prototype"],"%SharedArrayBufferPrototype%":["SharedArrayBuffer","prototype"],"%StringPrototype%":["String","prototype"],"%SymbolPrototype%":["Symbol","prototype"],"%SyntaxErrorPrototype%":["SyntaxError","prototype"],"%TypedArrayPrototype%":["TypedArray","prototype"],"%TypeErrorPrototype%":["TypeError","prototype"],"%Uint8ArrayPrototype%":["Uint8Array","prototype"],"%Uint8ClampedArrayPrototype%":["Uint8ClampedArray","prototype"],"%Uint16ArrayPrototype%":["Uint16Array","prototype"],"%Uint32ArrayPrototype%":["Uint32Array","prototype"],"%URIErrorPrototype%":["URIError","prototype"],"%WeakMapPrototype%":["WeakMap","prototype"],"%WeakSetPrototype%":["WeakSet","prototype"]},wp=jD,Uy=mde,wde=wp.call(Function.call,Array.prototype.concat),xde=wp.call(Function.apply,Array.prototype.splice),Z6=wp.call(Function.call,String.prototype.replace),Gy=wp.call(Function.call,String.prototype.slice),Cde=wp.call(Function.call,RegExp.prototype.exec),Tde=/[^%.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|%$))/g,Ede=/\\(\\)?/g,Pde=function(t){var n=Gy(t,0,1),r=Gy(t,-1);if(n==="%"&&r!=="%")throw new Dc("invalid intrinsic syntax, expected closing `%`");if(r==="%"&&n!=="%")throw new Dc("invalid intrinsic syntax, expected opening `%`");var i=[];return Z6(t,Tde,function(o,s,a,l){i[i.length]=a?Z6(l,Ede,"$1"):s||o}),i},kde=function(t,n){var r=t,i;if(Uy(Q6,r)&&(i=Q6[r],r="%"+i[0]+"%"),Uy(fl,r)){var o=fl[r];if(o===Su&&(o=_de(r)),typeof o>"u"&&!n)throw new ic("intrinsic "+t+" exists, but is not available. Please file an issue!");return{alias:i,name:r,value:o}}throw new Dc("intrinsic "+t+" does not exist!")},Ade=function(t,n){if(typeof t!="string"||t.length===0)throw new ic("intrinsic name must be a non-empty string");if(arguments.length>1&&typeof n!="boolean")throw new ic('"allowMissing" argument must be a boolean');if(Cde(/^%?[^%]*%?$/,t)===null)throw new Dc("`%` may not be present anywhere but at the beginning and end of the intrinsic name");var r=Pde(t),i=r.length>0?r[0]:"",o=kde("%"+i+"%",n),s=o.name,a=o.value,l=!1,u=o.alias;u&&(i=u[0],xde(r,wde([0,1],u)));for(var c=1,d=!0;c=r.length){var m=dl(a,f);d=!!m,d&&"get"in m&&!("originalValue"in m.get)?a=m.get:a=a[f]}else d=Uy(a,f),a=a[f];d&&!l&&(fl[s]=a)}}return a},Ode=Ade,zw=Ode("%Object.defineProperty%",!0),Uw=function(){if(zw)try{return zw({},"a",{value:1}),!0}catch{return!1}return!1};Uw.hasArrayLengthDefineBug=function(){if(!Uw())return null;try{return zw([],"length",{value:1}).length!==1}catch{return!0}};var Rde=Uw,Ide=ide,Mde=typeof Symbol=="function"&&typeof Symbol("foo")=="symbol",Nde=Object.prototype.toString,Dde=Array.prototype.concat,zD=Object.defineProperty,Lde=function(e){return typeof e=="function"&&Nde.call(e)==="[object Function]"},$de=Rde(),UD=zD&&$de,Fde=function(e,t,n,r){if(t in e){if(r===!0){if(e[t]===n)return}else if(!Lde(r)||!r())return}UD?zD(e,t,{configurable:!0,enumerable:!1,value:n,writable:!0}):e[t]=n},GD=function(e,t){var n=arguments.length>2?arguments[2]:{},r=Ide(t);Mde&&(r=Dde.call(r,Object.getOwnPropertySymbols(t)));for(var i=0;i200)return v.sort();for(let y=1;yg;)v[b]=v[b-1],b--;v[b]=g}return v}const a=Object.getOwnPropertyDescriptor(Object.getPrototypeOf(Object.getPrototypeOf(new Int8Array)),Symbol.toStringTag).get;function l(v){return a.call(v)!==void 0&&v.length!==0}function u(v,y,g){v.length= 1`)}return g===void 0?1/0:g}function h(v){return v===1?"1 item":`${v} items`}function p(v){const y=new Set;for(const g of v)(typeof g=="string"||typeof g=="number")&&y.add(String(g));return y}function m(v){if(n.call(v,"strict")){const y=v.strict;if(typeof y!="boolean")throw new TypeError('The "strict" argument must be of type boolean');if(y)return g=>{let b=`Object can not safely be stringified. Received type ${typeof g}`;throw typeof g!="function"&&(b+=` (${g.toString()})`),new Error(b)}}}function S(v){v={...v};const y=m(v);y&&(v.bigint===void 0&&(v.bigint=!1),"circularValue"in v||(v.circularValue=Error));const g=c(v),b=d(v,"bigint"),_=d(v,"deterministic"),w=f(v,"maximumDepth"),x=f(v,"maximumBreadth");function C(N,T,O,I,M,R){let D=T[N];switch(typeof D=="object"&&D!==null&&typeof D.toJSON=="function"&&(D=D.toJSON(N)),D=I.call(T,N,D),typeof D){case"string":return o(D);case"object":{if(D===null)return"null";if(O.indexOf(D)!==-1)return g;let L="",V=",";const z=R;if(Array.isArray(D)){if(D.length===0)return"[]";if(wx){const ne=D.length-x-1;L+=`${V}"... ${h(ne)} not stringified"`}return M!==""&&(L+=` +${z}`),O.pop(),`[${L}]`}let U=Object.keys(D);const K=U.length;if(K===0)return"{}";if(wx){const q=K-x;L+=`${X}"...":${W}"${h(q)} not stringified"`,X=V}return M!==""&&X.length>1&&(L=` +${R}${L} +${z}`),O.pop(),`{${L}}`}case"number":return isFinite(D)?String(D):y?y(D):"null";case"boolean":return D===!0?"true":"false";case"undefined":return;case"bigint":if(b)return String(D);default:return y?y(D):void 0}}function k(N,T,O,I,M,R){switch(typeof T=="object"&&T!==null&&typeof T.toJSON=="function"&&(T=T.toJSON(N)),typeof T){case"string":return o(T);case"object":{if(T===null)return"null";if(O.indexOf(T)!==-1)return g;const D=R;let L="",V=",";if(Array.isArray(T)){if(T.length===0)return"[]";if(wx){const F=T.length-x-1;L+=`${V}"... ${h(F)} not stringified"`}return M!==""&&(L+=` +${D}`),O.pop(),`[${L}]`}O.push(T);let z="";M!==""&&(R+=M,V=`, +${R}`,z=" ");let U="";for(const K of I){const W=k(K,T[K],O,I,M,R);W!==void 0&&(L+=`${U}${o(K)}:${z}${W}`,U=V)}return M!==""&&U.length>1&&(L=` +${R}${L} +${D}`),O.pop(),`{${L}}`}case"number":return isFinite(T)?String(T):y?y(T):"null";case"boolean":return T===!0?"true":"false";case"undefined":return;case"bigint":if(b)return String(T);default:return y?y(T):void 0}}function P(N,T,O,I,M){switch(typeof T){case"string":return o(T);case"object":{if(T===null)return"null";if(typeof T.toJSON=="function"){if(T=T.toJSON(N),typeof T!="object")return P(N,T,O,I,M);if(T===null)return"null"}if(O.indexOf(T)!==-1)return g;const R=M;if(Array.isArray(T)){if(T.length===0)return"[]";if(wx){const J=T.length-x-1;W+=`${X}"... ${h(J)} not stringified"`}return W+=` +${R}`,O.pop(),`[${W}]`}let D=Object.keys(T);const L=D.length;if(L===0)return"{}";if(wx){const W=L-x;z+=`${U}"...": "${h(W)} not stringified"`,U=V}return U!==""&&(z=` +${M}${z} +${R}`),O.pop(),`{${z}}`}case"number":return isFinite(T)?String(T):y?y(T):"null";case"boolean":return T===!0?"true":"false";case"undefined":return;case"bigint":if(b)return String(T);default:return y?y(T):void 0}}function A(N,T,O){switch(typeof T){case"string":return o(T);case"object":{if(T===null)return"null";if(typeof T.toJSON=="function"){if(T=T.toJSON(N),typeof T!="object")return A(N,T,O);if(T===null)return"null"}if(O.indexOf(T)!==-1)return g;let I="";if(Array.isArray(T)){if(T.length===0)return"[]";if(wx){const K=T.length-x-1;I+=`,"... ${h(K)} not stringified"`}return O.pop(),`[${I}]`}let M=Object.keys(T);const R=M.length;if(R===0)return"{}";if(wx){const V=R-x;I+=`${D}"...":"${h(V)} not stringified"`}return O.pop(),`{${I}}`}case"number":return isFinite(T)?String(T):y?y(T):"null";case"boolean":return T===!0?"true":"false";case"undefined":return;case"bigint":if(b)return String(T);default:return y?y(T):void 0}}function $(N,T,O){if(arguments.length>1){let I="";if(typeof O=="number"?I=" ".repeat(Math.min(O,10)):typeof O=="string"&&(I=O.slice(0,10)),T!=null){if(typeof T=="function")return C("",{"":N},[],T,I,"");if(Array.isArray(T))return k("",N,[],p(T),I,"")}if(I.length!==0)return P("",N,[],I,"")}return A("",N,[])}return $}})(Gw,Gw.exports);var Wde=Gw.exports;(function(e){var t=Ne&&Ne.__importDefault||function(g){return g&&g.__esModule?g:{default:g}};Object.defineProperty(e,"__esModule",{value:!0}),e.createLogger=void 0;const n=El,r=_p,i=$D,o=FD,s=t(l3),a=t(Wde);let l=!1;const u=(0,s.default)(),c=()=>u.ROARR,d=()=>({messageContext:{},transforms:[]}),f=()=>{const g=c().asyncLocalStorage;if(!g)throw new Error("AsyncLocalContext is unavailable.");const b=g.getStore();return b||d()},h=()=>!!c().asyncLocalStorage,p=()=>{if(h()){const g=f();return(0,i.hasOwnProperty)(g,"sequenceRoot")&&(0,i.hasOwnProperty)(g,"sequence")&&typeof g.sequence=="number"?String(g.sequenceRoot)+"."+String(g.sequence++):String(c().sequence++)}return String(c().sequence++)},m=(g,b)=>(_,w,x,C,k,P,A,$,N,T)=>{g.child({logLevel:b})(_,w,x,C,k,P,A,$,N,T)},S=1e3,v=(g,b)=>(_,w,x,C,k,P,A,$,N,T)=>{const O=(0,a.default)({a:_,b:w,c:x,d:C,e:k,f:P,g:A,h:$,i:N,j:T,logLevel:b});if(!O)throw new Error("Expected key to be a string");const I=c().onceLog;I.has(O)||(I.add(O),I.size>S&&I.clear(),g.child({logLevel:b})(_,w,x,C,k,P,A,$,N,T))},y=(g,b={},_=[])=>{const w=(x,C,k,P,A,$,N,T,O,I)=>{const M=Date.now(),R=p();let D;h()?D=f():D=d();let L,V;if(typeof x=="string"?L={...D.messageContext,...b}:L={...D.messageContext,...b,...x},typeof x=="string"&&C===void 0)V=x;else if(typeof x=="string"){if(!x.includes("%"))throw new Error("When a string parameter is followed by other arguments, then it is assumed that you are attempting to format a message using printf syntax. You either forgot to add printf bindings or if you meant to add context to the log message, pass them in an object as the first parameter.");V=(0,o.printf)(x,C,k,P,A,$,N,T,O,I)}else{let U=C;if(typeof C!="string")if(C===void 0)U="";else throw new TypeError("Message must be a string. Received "+typeof C+".");V=(0,o.printf)(U,k,P,A,$,N,T,O,I)}let z={context:L,message:V,sequence:R,time:M,version:n.ROARR_LOG_FORMAT_VERSION};for(const U of[...D.transforms,..._])if(z=U(z),typeof z!="object"||z===null)throw new Error("Message transform function must return a message object.");g(z)};return w.child=x=>{let C;return h()?C=f():C=d(),typeof x=="function"?(0,e.createLogger)(g,{...C.messageContext,...b,...x},[x,..._]):(0,e.createLogger)(g,{...C.messageContext,...b,...x},_)},w.getContext=()=>{let x;return h()?x=f():x=d(),{...x.messageContext,...b}},w.adopt=async(x,C)=>{if(!h())return l===!1&&(l=!0,g({context:{logLevel:r.logLevels.warn,package:"roarr"},message:"async_hooks are unavailable; Roarr.adopt will not function as expected",sequence:p(),time:Date.now(),version:n.ROARR_LOG_FORMAT_VERSION})),x();const k=f();let P;(0,i.hasOwnProperty)(k,"sequenceRoot")&&(0,i.hasOwnProperty)(k,"sequence")&&typeof k.sequence=="number"?P=k.sequenceRoot+"."+String(k.sequence++):P=String(c().sequence++);let A={...k.messageContext};const $=[...k.transforms];typeof C=="function"?$.push(C):A={...A,...C};const N=c().asyncLocalStorage;if(!N)throw new Error("Async local context unavailable.");return N.run({messageContext:A,sequence:0,sequenceRoot:P,transforms:$},()=>x())},w.debug=m(w,r.logLevels.debug),w.debugOnce=v(w,r.logLevels.debug),w.error=m(w,r.logLevels.error),w.errorOnce=v(w,r.logLevels.error),w.fatal=m(w,r.logLevels.fatal),w.fatalOnce=v(w,r.logLevels.fatal),w.info=m(w,r.logLevels.info),w.infoOnce=v(w,r.logLevels.info),w.trace=m(w,r.logLevels.trace),w.traceOnce=v(w,r.logLevels.trace),w.warn=m(w,r.logLevels.warn),w.warnOnce=v(w,r.logLevels.warn),w};e.createLogger=y})(LD);var t1={},Kde=function(t,n){for(var r=t.split("."),i=n.split("."),o=0;o<3;o++){var s=Number(r[o]),a=Number(i[o]);if(s>a)return 1;if(a>s)return-1;if(!isNaN(s)&&isNaN(a))return 1;if(isNaN(s)&&!isNaN(a))return-1}return 0},Yde=Ne&&Ne.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t1,"__esModule",{value:!0});t1.createRoarrInitialGlobalStateBrowser=void 0;const J6=El,ek=Yde(Kde),Xde=e=>{const t=(e.versions||[]).concat();return t.length>1&&t.sort(ek.default),t.includes(J6.ROARR_VERSION)||t.push(J6.ROARR_VERSION),t.sort(ek.default),{sequence:0,...e,versions:t}};t1.createRoarrInitialGlobalStateBrowser=Xde;var n1={};Object.defineProperty(n1,"__esModule",{value:!0});n1.getLogLevelName=void 0;const Qde=e=>e<=10?"trace":e<=20?"debug":e<=30?"info":e<=40?"warn":e<=50?"error":"fatal";n1.getLogLevelName=Qde;(function(e){var t=Ne&&Ne.__importDefault||function(d){return d&&d.__esModule?d:{default:d}};Object.defineProperty(e,"__esModule",{value:!0}),e.getLogLevelName=e.logLevels=e.Roarr=e.ROARR=void 0;const n=LD,r=t1,o=(0,t(l3).default)(),s=(0,r.createRoarrInitialGlobalStateBrowser)(o.ROARR||{});e.ROARR=s,o.ROARR=s;const a=d=>JSON.stringify(d),l=(0,n.createLogger)(d=>{var f;s.write&&s.write(((f=s.serializeMessage)!==null&&f!==void 0?f:a)(d))});e.Roarr=l;var u=_p;Object.defineProperty(e,"logLevels",{enumerable:!0,get:function(){return u.logLevels}});var c=n1;Object.defineProperty(e,"getLogLevelName",{enumerable:!0,get:function(){return c.getLogLevelName}})})(Nc);var u3={},r1={},i1={};Object.defineProperty(i1,"__esModule",{value:!0});i1.createLogMethods=void 0;var Zde=function(){return{debug:console.debug.bind(console),error:console.error.bind(console),fatal:console.error.bind(console),info:console.info.bind(console),trace:console.debug.bind(console),warn:console.warn.bind(console)}};i1.createLogMethods=Zde;var XD={},xp={},c3={},o1={},s1={};Object.defineProperty(s1,"__esModule",{value:!0});s1.convertWildcardToRegex=void 0;var Jde=/\*+/g,efe=function(e){return new RegExp(e.replace(Jde,"(.+?)"))};s1.convertWildcardToRegex=efe;var Cp={};Object.defineProperty(Cp,"__esModule",{value:!0});Cp.escapeRegexString=void 0;var tfe=/[$()*+.?[\\\]^{|}]/g,nfe=/-/g,rfe=function(e){return e.replace(tfe,"\\$&").replace(nfe,"\\x2d")};Cp.escapeRegexString=rfe;var a1={};Object.defineProperty(a1,"__esModule",{value:!0});a1.parseRegex=void 0;var ife=/(\/?)(.+)\1([a-z]*)/,ofe=/^(?!.*?(.).*?\1)[AJUXgimsux]+$/,sfe=function(e){var t=ife.exec(e);if(!t)throw new Error("Invalid RegExp.");return t[3]&&!ofe.test(t[3])?new RegExp(e):new RegExp(t[2],t[3])};a1.parseRegex=sfe;Object.defineProperty(o1,"__esModule",{value:!0});o1.createStringTest=void 0;var afe=s1,lfe=Cp,ufe=a1,u_=function(e,t){var n;return e[t]?n=e[t]:n=e[t]=(0,ufe.parseRegex)(t),function(r){var i,o;return(o=(i=r.match(n))===null||i===void 0?void 0:i[0])!==null&&o!==void 0?o:!1}},cfe=function(e,t){if(t.type!=="Tag")throw new Error("Expected a tag expression.");var n=t.expression;if(n.type==="RangeExpression")throw new Error("Unexpected range expression.");if(n.type==="RegexExpression")return u_(e,n.value);if(n.type!=="LiteralExpression")throw new Error("Expected a literal expression.");var r=String(n.value);return r.includes("*")&&n.quoted===!1?u_(e,String((0,afe.convertWildcardToRegex)(r))+(n.quoted?"u":"ui")):u_(e,"/("+(0,lfe.escapeRegexString)(r)+")/"+(n.quoted?"u":"ui"))};o1.createStringTest=cfe;var l1={};Object.defineProperty(l1,"__esModule",{value:!0});l1.testComparisonRange=void 0;var dfe=function(e,t,n){switch(n){case":=":return t===e;case":>":return t>e;case":<":return t=":return t>=e;case":<=":return t<=e;default:throw new Error("Unimplemented comparison operator: ".concat(n))}};l1.testComparisonRange=dfe;var u1={};Object.defineProperty(u1,"__esModule",{value:!0});u1.testRange=void 0;var ffe=function(e,t){return typeof e=="number"?!(et.max||e===t.max&&!t.maxInclusive):!1};u1.testRange=ffe;(function(e){var t=Ne&&Ne.__assign||function(){return t=Object.assign||function(c){for(var d,f=1,h=arguments.length;f0?{path:l.path,query:new RegExp("("+l.keywords.map(function(u){return(0,gfe.escapeRegexString)(u.trim())}).join("|")+")")}:{path:l.path}})};c1.highlight=yfe;var d1={},QD={exports:{}};(function(e){(function(t,n){e.exports?e.exports=n():t.nearley=n()})(Ne,function(){function t(u,c,d){return this.id=++t.highestId,this.name=u,this.symbols=c,this.postprocess=d,this}t.highestId=0,t.prototype.toString=function(u){var c=typeof u>"u"?this.symbols.map(l).join(" "):this.symbols.slice(0,u).map(l).join(" ")+" ● "+this.symbols.slice(u).map(l).join(" ");return this.name+" → "+c};function n(u,c,d,f){this.rule=u,this.dot=c,this.reference=d,this.data=[],this.wantedBy=f,this.isComplete=this.dot===u.symbols.length}n.prototype.toString=function(){return"{"+this.rule.toString(this.dot)+"}, from: "+(this.reference||0)},n.prototype.nextState=function(u){var c=new n(this.rule,this.dot+1,this.reference,this.wantedBy);return c.left=this,c.right=u,c.isComplete&&(c.data=c.build(),c.right=void 0),c},n.prototype.build=function(){var u=[],c=this;do u.push(c.right.data),c=c.left;while(c.left);return u.reverse(),u},n.prototype.finish=function(){this.rule.postprocess&&(this.data=this.rule.postprocess(this.data,this.reference,s.fail))};function r(u,c){this.grammar=u,this.index=c,this.states=[],this.wants={},this.scannable=[],this.completed={}}r.prototype.process=function(u){for(var c=this.states,d=this.wants,f=this.completed,h=0;h0&&c.push(" ^ "+f+" more lines identical to this"),f=0,c.push(" "+m)),d=m}},s.prototype.getSymbolDisplay=function(u){return a(u)},s.prototype.buildFirstStateStack=function(u,c){if(c.indexOf(u)!==-1)return null;if(u.wantedBy.length===0)return[u];var d=u.wantedBy[0],f=[u].concat(c),h=this.buildFirstStateStack(d,f);return h===null?null:[u].concat(h)},s.prototype.save=function(){var u=this.table[this.current];return u.lexerState=this.lexerState,u},s.prototype.restore=function(u){var c=u.index;this.current=c,this.table[c]=u,this.table.splice(c+1),this.lexerState=u.lexerState,this.results=this.finish()},s.prototype.rewind=function(u){if(!this.options.keepHistory)throw new Error("set option `keepHistory` to enable rewinding");this.restore(this.table[u])},s.prototype.finish=function(){var u=[],c=this.grammar.start,d=this.table[this.table.length-1];return d.states.forEach(function(f){f.rule.name===c&&f.dot===f.rule.symbols.length&&f.reference===0&&f.data!==s.fail&&u.push(f)}),u.map(function(f){return f.data})};function a(u){var c=typeof u;if(c==="string")return u;if(c==="object"){if(u.literal)return JSON.stringify(u.literal);if(u instanceof RegExp)return"character matching "+u;if(u.type)return u.type+" token";if(u.test)return"token matching "+String(u.test);throw new Error("Unknown symbol type: "+u)}}function l(u){var c=typeof u;if(c==="string")return u;if(c==="object"){if(u.literal)return JSON.stringify(u.literal);if(u instanceof RegExp)return u.toString();if(u.type)return"%"+u.type;if(u.test)return"<"+String(u.test)+">";throw new Error("Unknown symbol type: "+u)}}return{Parser:s,Grammar:i,Rule:t}})})(QD);var vfe=QD.exports,Pl={},ZD={},Ia={};Ia.__esModule=void 0;Ia.__esModule=!0;var bfe=typeof Object.setPrototypeOf=="function",Sfe=typeof Object.getPrototypeOf=="function",_fe=typeof Object.defineProperty=="function",wfe=typeof Object.create=="function",xfe=typeof Object.prototype.hasOwnProperty=="function",Cfe=function(t,n){bfe?Object.setPrototypeOf(t,n):t.__proto__=n};Ia.setPrototypeOf=Cfe;var Tfe=function(t){return Sfe?Object.getPrototypeOf(t):t.__proto__||t.prototype};Ia.getPrototypeOf=Tfe;var tk=!1,Efe=function e(t,n,r){if(_fe&&!tk)try{Object.defineProperty(t,n,r)}catch{tk=!0,e(t,n,r)}else t[n]=r.value};Ia.defineProperty=Efe;var JD=function(t,n){return xfe?t.hasOwnProperty(t,n):t[n]===void 0};Ia.hasOwnProperty=JD;var Pfe=function(t,n){if(wfe)return Object.create(t,n);var r=function(){};r.prototype=t;var i=new r;if(typeof n>"u")return i;if(typeof n=="null")throw new Error("PropertyDescriptors must not be null.");if(typeof n=="object")for(var o in n)JD(n,o)&&(i[o]=n[o].value);return i};Ia.objectCreate=Pfe;(function(e){e.__esModule=void 0,e.__esModule=!0;var t=Ia,n=t.setPrototypeOf,r=t.getPrototypeOf,i=t.defineProperty,o=t.objectCreate,s=new Error().toString()==="[object Error]",a="";function l(u){var c=this.constructor,d=c.name||function(){var S=c.toString().match(/^function\s*([^\s(]+)/);return S===null?a||"Error":S[1]}(),f=d==="Error",h=f?a:d,p=Error.apply(this,arguments);if(n(p,r(this)),!(p instanceof c)||!(p instanceof l)){var p=this;Error.apply(this,arguments),i(p,"message",{configurable:!0,enumerable:!1,value:u,writable:!0})}if(i(p,"name",{configurable:!0,enumerable:!1,value:h,writable:!0}),Error.captureStackTrace&&Error.captureStackTrace(p,f?l:c),p.stack===void 0){var m=new Error(u);m.name=p.name,p.stack=m.stack}return s&&i(p,"toString",{configurable:!0,enumerable:!1,value:function(){return(this.name||"Error")+(typeof this.message>"u"?"":": "+this.message)},writable:!0}),p}a=l.name||"ExtendableError",l.prototype=o(Error.prototype,{constructor:{value:Error,enumerable:!1,writable:!0,configurable:!0}}),e.ExtendableError=l,e.default=e.ExtendableError})(ZD);var eL=Ne&&Ne.__extends||function(){var e=function(t,n){return e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(r,i){r.__proto__=i}||function(r,i){for(var o in i)Object.prototype.hasOwnProperty.call(i,o)&&(r[o]=i[o])},e(t,n)};return function(t,n){if(typeof n!="function"&&n!==null)throw new TypeError("Class extends value "+String(n)+" is not a constructor or null");e(t,n);function r(){this.constructor=t}t.prototype=n===null?Object.create(n):(r.prototype=n.prototype,new r)}}();Object.defineProperty(Pl,"__esModule",{value:!0});Pl.SyntaxError=Pl.LiqeError=void 0;var kfe=ZD,tL=function(e){eL(t,e);function t(){return e!==null&&e.apply(this,arguments)||this}return t}(kfe.ExtendableError);Pl.LiqeError=tL;var Afe=function(e){eL(t,e);function t(n,r,i,o){var s=e.call(this,n)||this;return s.message=n,s.offset=r,s.line=i,s.column=o,s}return t}(tL);Pl.SyntaxError=Afe;var d3={},Hy=Ne&&Ne.__assign||function(){return Hy=Object.assign||function(e){for(var t,n=1,r=arguments.length;n"}],postprocess:function(e){return e.join("")}},{name:"comparison_operator$subexpression$1",symbols:["comparison_operator$subexpression$1$string$2"]},{name:"comparison_operator$subexpression$1$string$3",symbols:[{literal:":"},{literal:"<"}],postprocess:function(e){return e.join("")}},{name:"comparison_operator$subexpression$1",symbols:["comparison_operator$subexpression$1$string$3"]},{name:"comparison_operator$subexpression$1$string$4",symbols:[{literal:":"},{literal:">"},{literal:"="}],postprocess:function(e){return e.join("")}},{name:"comparison_operator$subexpression$1",symbols:["comparison_operator$subexpression$1$string$4"]},{name:"comparison_operator$subexpression$1$string$5",symbols:[{literal:":"},{literal:"<"},{literal:"="}],postprocess:function(e){return e.join("")}},{name:"comparison_operator$subexpression$1",symbols:["comparison_operator$subexpression$1$string$5"]},{name:"comparison_operator",symbols:["comparison_operator$subexpression$1"],postprocess:function(e,t){return{location:{start:t,end:t+e[0][0].length},type:"ComparisonOperator",operator:e[0][0]}}},{name:"regex",symbols:["regex_body","regex_flags"],postprocess:function(e){return e.join("")}},{name:"regex_body$ebnf$1",symbols:[]},{name:"regex_body$ebnf$1",symbols:["regex_body$ebnf$1","regex_body_char"],postprocess:function(e){return e[0].concat([e[1]])}},{name:"regex_body",symbols:[{literal:"/"},"regex_body$ebnf$1",{literal:"/"}],postprocess:function(e){return"/"+e[1].join("")+"/"}},{name:"regex_body_char",symbols:[/[^\\]/],postprocess:Vo},{name:"regex_body_char",symbols:[{literal:"\\"},/[^\\]/],postprocess:function(e){return"\\"+e[1]}},{name:"regex_flags",symbols:[]},{name:"regex_flags$ebnf$1",symbols:[/[gmiyusd]/]},{name:"regex_flags$ebnf$1",symbols:["regex_flags$ebnf$1",/[gmiyusd]/],postprocess:function(e){return e[0].concat([e[1]])}},{name:"regex_flags",symbols:["regex_flags$ebnf$1"],postprocess:function(e){return e[0].join("")}},{name:"unquoted_value$ebnf$1",symbols:[]},{name:"unquoted_value$ebnf$1",symbols:["unquoted_value$ebnf$1",/[a-zA-Z\.\-_*@#$]/],postprocess:function(e){return e[0].concat([e[1]])}},{name:"unquoted_value",symbols:[/[a-zA-Z_*@#$]/,"unquoted_value$ebnf$1"],postprocess:function(e){return e[0]+e[1].join("")}}],ParserStart:"main"};d3.default=Ofe;var nL={},f1={},Tp={};Object.defineProperty(Tp,"__esModule",{value:!0});Tp.isSafePath=void 0;var Rfe=/^(\.(?:[_a-zA-Z][a-zA-Z\d_]*|\0|[1-9]\d*))+$/u,Ife=function(e){return Rfe.test(e)};Tp.isSafePath=Ife;Object.defineProperty(f1,"__esModule",{value:!0});f1.createGetValueFunctionBody=void 0;var Mfe=Tp,Nfe=function(e){if(!(0,Mfe.isSafePath)(e))throw new Error("Unsafe path.");var t="return subject"+e;return t.replace(/(\.(\d+))/g,".[$2]").replace(/\./g,"?.")};f1.createGetValueFunctionBody=Nfe;(function(e){var t=Ne&&Ne.__assign||function(){return t=Object.assign||function(o){for(var s,a=1,l=arguments.length;a\d+) col (?\d+)/,jfe=function(e){if(e.trim()==="")return{location:{end:0,start:0},type:"EmptyExpression"};var t=new iL.default.Parser(Ffe),n;try{n=t.feed(e).results}catch(o){if(typeof(o==null?void 0:o.message)=="string"&&typeof(o==null?void 0:o.offset)=="number"){var r=o.message.match(Bfe);throw r?new Dfe.SyntaxError("Syntax error at line ".concat(r.groups.line," column ").concat(r.groups.column),o.offset,Number(r.groups.line),Number(r.groups.column)):o}throw o}if(n.length===0)throw new Error("Found no parsings.");if(n.length>1)throw new Error("Ambiguous results.");var i=(0,$fe.hydrateAst)(n[0]);return i};d1.parse=jfe;var h1={};Object.defineProperty(h1,"__esModule",{value:!0});h1.test=void 0;var Vfe=xp,zfe=function(e,t){return(0,Vfe.filter)(e,[t]).length===1};h1.test=zfe;var oL={};(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.serialize=void 0;var t=function(o,s){return s==="double"?'"'.concat(o,'"'):s==="single"?"'".concat(o,"'"):o},n=function(o){if(o.type==="LiteralExpression")return o.quoted&&typeof o.value=="string"?t(o.value,o.quotes):String(o.value);if(o.type==="RegexExpression")return String(o.value);if(o.type==="RangeExpression"){var s=o.range,a=s.min,l=s.max,u=s.minInclusive,c=s.maxInclusive;return"".concat(u?"[":"{").concat(a," TO ").concat(l).concat(c?"]":"}")}if(o.type==="EmptyExpression")return"";throw new Error("Unexpected AST type.")},r=function(o){if(o.type!=="Tag")throw new Error("Expected a tag expression.");var s=o.field,a=o.expression,l=o.operator;if(s.type==="ImplicitField")return n(a);var u=s.quoted?t(s.name,s.quotes):s.name,c=" ".repeat(a.location.start-l.location.end);return u+l.operator+c+n(a)},i=function(o){if(o.type==="ParenthesizedExpression"){if(!("location"in o.expression))throw new Error("Expected location in expression.");if(!o.location.end)throw new Error("Expected location end.");var s=" ".repeat(o.expression.location.start-(o.location.start+1)),a=" ".repeat(o.location.end-o.expression.location.end-1);return"(".concat(s).concat((0,e.serialize)(o.expression)).concat(a,")")}if(o.type==="Tag")return r(o);if(o.type==="LogicalExpression"){var l="";return o.operator.type==="BooleanOperator"?(l+=" ".repeat(o.operator.location.start-o.left.location.end),l+=o.operator.operator,l+=" ".repeat(o.right.location.start-o.operator.location.end)):l=" ".repeat(o.right.location.start-o.left.location.end),"".concat((0,e.serialize)(o.left)).concat(l).concat((0,e.serialize)(o.right))}if(o.type==="UnaryOperator")return(o.operator==="NOT"?"NOT ":o.operator)+(0,e.serialize)(o.operand);if(o.type==="EmptyExpression")return"";throw new Error("Unexpected AST type.")};e.serialize=i})(oL);var p1={};Object.defineProperty(p1,"__esModule",{value:!0});p1.isSafeUnquotedExpression=void 0;var Ufe=function(e){return/^[#$*@A-Z_a-z][#$*.@A-Z_a-z-]*$/.test(e)};p1.isSafeUnquotedExpression=Ufe;(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.isSafeUnquotedExpression=e.serialize=e.SyntaxError=e.LiqeError=e.test=e.parse=e.highlight=e.filter=void 0;var t=xp;Object.defineProperty(e,"filter",{enumerable:!0,get:function(){return t.filter}});var n=c1;Object.defineProperty(e,"highlight",{enumerable:!0,get:function(){return n.highlight}});var r=d1;Object.defineProperty(e,"parse",{enumerable:!0,get:function(){return r.parse}});var i=h1;Object.defineProperty(e,"test",{enumerable:!0,get:function(){return i.test}});var o=Pl;Object.defineProperty(e,"LiqeError",{enumerable:!0,get:function(){return o.LiqeError}}),Object.defineProperty(e,"SyntaxError",{enumerable:!0,get:function(){return o.SyntaxError}});var s=oL;Object.defineProperty(e,"serialize",{enumerable:!0,get:function(){return s.serialize}});var a=p1;Object.defineProperty(e,"isSafeUnquotedExpression",{enumerable:!0,get:function(){return a.isSafeUnquotedExpression}})})(XD);var Gfe=Ne&&Ne.__rest||function(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(e!=null&&typeof Object.getOwnPropertySymbols=="function")for(var i=0,r=Object.getOwnPropertySymbols(e);i0?h("%c ".concat(f," %c").concat(c?" [".concat(String(c),"]:"):"","%c ").concat(a.message," %O"),m,S,v,d):h("%c ".concat(f," %c").concat(c?" [".concat(String(c),"]:"):"","%c ").concat(a.message),m,S,v)}}};r1.createLogWriter=Jfe;(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.createLogWriter=void 0;var t=r1;Object.defineProperty(e,"createLogWriter",{enumerable:!0,get:function(){return t.createLogWriter}})})(u3);const aL={package:"@invoke-ai/invoke-ai-ui"};Nc.ROARR.write=u3.createLogWriter();let ve=Nc.Roarr.child(aL);const ehe={trace:10,debug:20,info:30,warn:40,error:50,fatal:60},wPe=["trace","debug","info","warn","error","fatal"],the=at(Sp,e=>{const{app_version:t,consoleLogLevel:n,shouldLogToConsole:r}=e;return{version:t,consoleLogLevel:n,shouldLogToConsole:r}},{memoizeOptions:{resultEqualityCheck:ap}}),xPe=()=>{const{version:e,consoleLogLevel:t,shouldLogToConsole:n}=Qf(the);return E.useEffect(()=>{n?(localStorage.setItem("ROARR_LOG","true"),localStorage.setItem("ROARR_FILTER",`context.logLevel:>=${ehe[t]}`)):localStorage.setItem("ROARR_LOG","false"),Nc.ROARR.write=u3.createLogWriter()},[t,n]),E.useEffect(()=>{const r={...aL};e&&(r.version=e),ve=Nc.Roarr.child(r)},[e]),ve};let sr=[],f3=(e,t)=>{let n=[],r={get(){return r.lc||r.listen(()=>{})(),r.value},l:t||0,lc:0,listen(i,o){return r.lc=n.push(i,o||r.l)/2,()=>{let s=n.indexOf(i);~s&&(n.splice(s,2),r.lc--,r.lc||r.off())}},notify(i){let o=!sr.length;for(let s=0;s(e.events=e.events||{},e.events[n+_g]||(e.events[n+_g]=r(i=>{e.events[n].reduceRight((o,s)=>(s(o),o),{shared:{},...i})})),e.events[n]=e.events[n]||[],e.events[n].push(t),()=>{let i=e.events[n],o=i.indexOf(t);i.splice(o,1),i.length||(delete e.events[n],e.events[n+_g](),delete e.events[n+_g])}),ihe=1e3,ohe=(e,t)=>rhe(e,r=>{let i=t(r);i&&e.events[Sg].push(i)},nhe,r=>{let i=e.listen;e.listen=(...s)=>(!e.lc&&!e.active&&(e.active=!0,r()),i(...s));let o=e.off;return e.events[Sg]=[],e.off=()=>{o(),setTimeout(()=>{if(e.active&&!e.lc){e.active=!1;for(let s of e.events[Sg])s();e.events[Sg]=[]}},ihe)},()=>{e.listen=i,e.off=o}}),she=(e,t)=>{Array.isArray(e)||(e=[e]);let n,r=()=>{let o=e.map(s=>s.get());(n===void 0||o.some((s,a)=>s!==n[a]))&&(n=o,i.set(t(...o)))},i=f3(void 0,Math.max(...e.map(o=>o.l))+1);return ohe(i,()=>{let o=e.map(s=>s.listen(r,i.l));return r(),()=>{for(let s of o)s()}}),i};const ahe={"Content-Type":"application/json"},lhe=/\/*$/;function uhe(e){const t=new URLSearchParams;if(e&&typeof e=="object")for(const[n,r]of Object.entries(e))r!=null&&t.set(n,r);return t.toString()}function che(e){return JSON.stringify(e)}function dhe(e,t){let n=`${t.baseUrl?t.baseUrl.replace(lhe,""):""}${e}`;if(t.params.path)for(const[r,i]of Object.entries(t.params.path))n=n.replace(`{${r}}`,encodeURIComponent(String(i)));if(t.params.query){const r=t.querySerializer(t.params.query);r&&(n+=`?${r}`)}return n}function fhe(e={}){const{fetch:t=globalThis.fetch,querySerializer:n,bodySerializer:r,...i}=e,o=new Headers({...ahe,...i.headers??{}});async function s(a,l){const{headers:u,body:c,params:d={},parseAs:f="json",querySerializer:h=n??uhe,bodySerializer:p=r??che,...m}=l||{},S=dhe(a,{baseUrl:i.baseUrl,params:d,querySerializer:h}),v=new Headers(o),y=new Headers(u);for(const[w,x]of y.entries())x==null?v.delete(w):v.set(w,x);const g={redirect:"follow",...i,...m,headers:v};c&&(g.body=p(c)),g.body instanceof FormData&&v.delete("Content-Type");const b=await t(S,g);if(b.status===204||b.headers.get("Content-Length")==="0")return b.ok?{data:{},response:b}:{error:{},response:b};if(b.ok){let w=b.body;if(f!=="stream"){const x=b.clone();w=typeof x[f]=="function"?await x[f]():await x.text()}return{data:w,response:b}}let _={};try{_=await b.clone().json()}catch{_=await b.clone().text()}return{error:_,response:b}}return{async get(a,l){return s(a,{...l,method:"GET"})},async put(a,l){return s(a,{...l,method:"PUT"})},async post(a,l){return s(a,{...l,method:"POST"})},async del(a,l){return s(a,{...l,method:"DELETE"})},async options(a,l){return s(a,{...l,method:"OPTIONS"})},async head(a,l){return s(a,{...l,method:"HEAD"})},async patch(a,l){return s(a,{...l,method:"PATCH"})},async trace(a,l){return s(a,{...l,method:"TRACE"})}}}const _h=f3(),wh=f3(),Io=she([_h,wh],(e,t)=>fhe({headers:e?{Authorization:`Bearer ${e}`}:{},baseUrl:`${t??""}`}));ve.child({namespace:"session"});const Un=Ro("api/sessionCreated",async(e,{rejectWithValue:t})=>{const{graph:n}=e,{post:r}=Io.get(),{data:i,error:o,response:s}=await r("/api/v1/sessions/",{body:n});return o?t({arg:e,error:o}):i}),hhe=e=>Pn(e)&&"status"in e,Ep=Ro("api/sessionInvoked",async(e,{rejectWithValue:t})=>{const{session_id:n}=e,{put:r}=Io.get(),{data:i,error:o,response:s}=await r("/api/v1/sessions/{session_id}/invoke",{params:{query:{all:!0},path:{session_id:n}}});if(o)return hhe(o)&&o.status===403?t({arg:e,error:o.body.detail}):t({arg:e,error:o})}),zl=Ro("api/sessionCanceled",async(e,{rejectWithValue:t})=>{const{session_id:n}=e,{del:r}=Io.get(),{data:i,error:o,response:s}=await r("/api/v1/sessions/{session_id}/invoke",{params:{path:{session_id:n}}});return o?t({arg:e,error:o}):i});Ro("api/listSessions",async(e,{rejectWithValue:t})=>{const{params:n}=e,{get:r}=Io.get(),{data:i,error:o,response:s}=await r("/api/v1/sessions/",{params:n});return o?t({arg:e,error:o}):i});const lL=vs(Un.rejected,Ep.rejected),su=(e,t,n,r,i,o,s)=>{const a=Math.floor(e/2-(n+i/2)*s),l=Math.floor(t/2-(r+o/2)*s);return{x:a,y:l}},au=(e,t,n,r,i=.95)=>{const o=e*i/n,s=t*i/r;return Math.min(1,Math.min(o,s))},CPe=.999,TPe=.1,EPe=20,Ed=.95,PPe=30,kPe=10,rk=e=>({x:Math.floor(e.x),y:Math.floor(e.y)}),Va=e=>{const{width:t,height:n}=e,r={width:t,height:n},i=512*512,o=t/n;let s=t*n,a=448;for(;s1?(r.width=a,r.height=no(a/o,64)):o<1&&(r.height=a,r.width=no(a*o,64)),s=r.width*r.height;return r},phe=e=>({width:no(e.width,64),height:no(e.height,64)}),APe=[{label:"Base",value:"base"},{label:"Mask",value:"mask"}],OPe=[{label:"Auto",value:"auto"},{label:"Manual",value:"manual"},{label:"None",value:"none"}],uL=e=>e.kind==="line"&&e.layer==="mask",RPe=e=>e.kind==="line"&&e.layer==="base",Hw=e=>e.kind==="image"&&e.layer==="base",IPe=e=>e.kind==="fillRect"&&e.layer==="base",MPe=e=>e.kind==="eraseRect"&&e.layer==="base",ghe=e=>e.kind==="line",_u={objects:[],stagingArea:{images:[],selectedImageIndex:-1}},cL={boundingBoxCoordinates:{x:0,y:0},boundingBoxDimensions:{width:512,height:512},boundingBoxPreviewFill:{r:0,g:0,b:0,a:.5},boundingBoxScaleMethod:"auto",brushColor:{r:90,g:90,b:255,a:1},brushSize:50,canvasContainerDimensions:{width:0,height:0},colorPickerColor:{r:90,g:90,b:255,a:1},cursorPosition:null,doesCanvasNeedScaling:!1,futureLayerStates:[],isCanvasInitialized:!1,isDrawing:!1,isMaskEnabled:!0,isMouseOverBoundingBox:!1,isMoveBoundingBoxKeyHeld:!1,isMoveStageKeyHeld:!1,isMovingBoundingBox:!1,isMovingStage:!1,isTransformingBoundingBox:!1,layer:"base",layerState:_u,maskColor:{r:255,g:90,b:90,a:1},maxHistory:128,minimumStageScale:1,pastLayerStates:[],scaledBoundingBoxDimensions:{width:512,height:512},shouldAntialias:!0,shouldAutoSave:!1,shouldCropToBoundingBoxOnSave:!1,shouldDarkenOutsideBoundingBox:!1,shouldLockBoundingBox:!1,shouldPreserveMaskedArea:!1,shouldRestrictStrokesToBox:!0,shouldShowBoundingBox:!0,shouldShowBrush:!0,shouldShowBrushPreview:!1,shouldShowCanvasDebugInfo:!1,shouldShowCheckboardTransparency:!1,shouldShowGrid:!0,shouldShowIntermediates:!0,shouldShowStagingImage:!0,shouldShowStagingOutline:!0,shouldSnapToGrid:!0,stageCoordinates:{x:0,y:0},stageDimensions:{width:0,height:0},stageScale:1,tool:"brush"},dL=Vt({name:"canvas",initialState:cL,reducers:{setTool:(e,t)=>{const n=t.payload;e.tool=t.payload,n!=="move"&&(e.isTransformingBoundingBox=!1,e.isMouseOverBoundingBox=!1,e.isMovingBoundingBox=!1,e.isMovingStage=!1)},setLayer:(e,t)=>{e.layer=t.payload},toggleTool:e=>{const t=e.tool;t!=="move"&&(e.tool=t==="brush"?"eraser":"brush")},setMaskColor:(e,t)=>{e.maskColor=t.payload},setBrushColor:(e,t)=>{e.brushColor=t.payload},setBrushSize:(e,t)=>{e.brushSize=t.payload},clearMask:e=>{e.pastLayerStates.push(Yn(e.layerState)),e.layerState.objects=e.layerState.objects.filter(t=>!uL(t)),e.futureLayerStates=[],e.shouldPreserveMaskedArea=!1},toggleShouldInvertMask:e=>{e.shouldPreserveMaskedArea=!e.shouldPreserveMaskedArea},toggleShouldShowMask:e=>{e.isMaskEnabled=!e.isMaskEnabled},setShouldPreserveMaskedArea:(e,t)=>{e.shouldPreserveMaskedArea=t.payload},setIsMaskEnabled:(e,t)=>{e.isMaskEnabled=t.payload,e.layer=t.payload?"mask":"base"},setShouldShowCheckboardTransparency:(e,t)=>{e.shouldShowCheckboardTransparency=t.payload},setShouldShowBrushPreview:(e,t)=>{e.shouldShowBrushPreview=t.payload},setShouldShowBrush:(e,t)=>{e.shouldShowBrush=t.payload},setCursorPosition:(e,t)=>{e.cursorPosition=t.payload},setInitialCanvasImage:(e,t)=>{const n=t.payload,{width:r,height:i}=n,{stageDimensions:o}=e,s={width:qd(Jo(r,64,512),64),height:qd(Jo(i,64,512),64)},a={x:no(r/2-s.width/2,64),y:no(i/2-s.height/2,64)};if(e.boundingBoxScaleMethod==="auto"){const c=Va(s);e.scaledBoundingBoxDimensions=c}e.boundingBoxDimensions=s,e.boundingBoxCoordinates=a,e.pastLayerStates.push(Yn(e.layerState)),e.layerState={..._u,objects:[{kind:"image",layer:"base",x:0,y:0,width:r,height:i,imageName:n.image_name}]},e.futureLayerStates=[],e.isCanvasInitialized=!1;const l=au(o.width,o.height,r,i,Ed),u=su(o.width,o.height,0,0,r,i,l);e.stageScale=l,e.stageCoordinates=u,e.doesCanvasNeedScaling=!0},setBoundingBoxDimensions:(e,t)=>{const n=phe(t.payload);if(e.boundingBoxDimensions=n,e.boundingBoxScaleMethod==="auto"){const r=Va(n);e.scaledBoundingBoxDimensions=r}},flipBoundingBoxAxes:e=>{const[t,n]=[e.boundingBoxDimensions.width,e.boundingBoxDimensions.height];e.boundingBoxDimensions={width:n,height:t}},setBoundingBoxCoordinates:(e,t)=>{e.boundingBoxCoordinates=rk(t.payload)},setStageCoordinates:(e,t)=>{e.stageCoordinates=t.payload},setBoundingBoxPreviewFill:(e,t)=>{e.boundingBoxPreviewFill=t.payload},setDoesCanvasNeedScaling:(e,t)=>{e.doesCanvasNeedScaling=t.payload},setStageScale:(e,t)=>{e.stageScale=t.payload},setShouldDarkenOutsideBoundingBox:(e,t)=>{e.shouldDarkenOutsideBoundingBox=t.payload},setIsDrawing:(e,t)=>{e.isDrawing=t.payload},clearCanvasHistory:e=>{e.pastLayerStates=[],e.futureLayerStates=[]},setShouldLockBoundingBox:(e,t)=>{e.shouldLockBoundingBox=t.payload},toggleShouldLockBoundingBox:e=>{e.shouldLockBoundingBox=!e.shouldLockBoundingBox},setShouldShowBoundingBox:(e,t)=>{e.shouldShowBoundingBox=t.payload},setIsTransformingBoundingBox:(e,t)=>{e.isTransformingBoundingBox=t.payload},setIsMovingBoundingBox:(e,t)=>{e.isMovingBoundingBox=t.payload},setIsMouseOverBoundingBox:(e,t)=>{e.isMouseOverBoundingBox=t.payload},setIsMoveBoundingBoxKeyHeld:(e,t)=>{e.isMoveBoundingBoxKeyHeld=t.payload},setIsMoveStageKeyHeld:(e,t)=>{e.isMoveStageKeyHeld=t.payload},canvasSessionIdChanged:(e,t)=>{e.layerState.stagingArea.sessionId=t.payload},stagingAreaInitialized:(e,t)=>{const{sessionId:n,boundingBox:r}=t.payload;e.layerState.stagingArea={boundingBox:r,sessionId:n,images:[],selectedImageIndex:-1}},addImageToStagingArea:(e,t)=>{const n=t.payload;!n||!e.layerState.stagingArea.boundingBox||(e.pastLayerStates.push(Yn(e.layerState)),e.pastLayerStates.length>e.maxHistory&&e.pastLayerStates.shift(),e.layerState.stagingArea.images.push({kind:"image",layer:"base",...e.layerState.stagingArea.boundingBox,imageName:n.image_name}),e.layerState.stagingArea.selectedImageIndex=e.layerState.stagingArea.images.length-1,e.futureLayerStates=[])},discardStagedImages:e=>{e.pastLayerStates.push(Yn(e.layerState)),e.pastLayerStates.length>e.maxHistory&&e.pastLayerStates.shift(),e.layerState.stagingArea={..._u.stagingArea},e.futureLayerStates=[],e.shouldShowStagingOutline=!0,e.shouldShowStagingOutline=!0},addFillRect:e=>{const{boundingBoxCoordinates:t,boundingBoxDimensions:n,brushColor:r}=e;e.pastLayerStates.push(Yn(e.layerState)),e.pastLayerStates.length>e.maxHistory&&e.pastLayerStates.shift(),e.layerState.objects.push({kind:"fillRect",layer:"base",...t,...n,color:r}),e.futureLayerStates=[]},addEraseRect:e=>{const{boundingBoxCoordinates:t,boundingBoxDimensions:n}=e;e.pastLayerStates.push(Yn(e.layerState)),e.pastLayerStates.length>e.maxHistory&&e.pastLayerStates.shift(),e.layerState.objects.push({kind:"eraseRect",layer:"base",...t,...n}),e.futureLayerStates=[]},addLine:(e,t)=>{const{tool:n,layer:r,brushColor:i,brushSize:o,shouldRestrictStrokesToBox:s}=e;if(n==="move"||n==="colorPicker")return;const a=o/2,l=r==="base"&&n==="brush"?{color:i}:{};e.pastLayerStates.push(Yn(e.layerState)),e.pastLayerStates.length>e.maxHistory&&e.pastLayerStates.shift();const u={kind:"line",layer:r,tool:n,strokeWidth:a,points:t.payload,...l};s&&(u.clip={...e.boundingBoxCoordinates,...e.boundingBoxDimensions}),e.layerState.objects.push(u),e.futureLayerStates=[]},addPointToCurrentLine:(e,t)=>{const n=e.layerState.objects.findLast(ghe);n&&n.points.push(...t.payload)},undo:e=>{const t=e.pastLayerStates.pop();t&&(e.futureLayerStates.unshift(Yn(e.layerState)),e.futureLayerStates.length>e.maxHistory&&e.futureLayerStates.pop(),e.layerState=t)},redo:e=>{const t=e.futureLayerStates.shift();t&&(e.pastLayerStates.push(Yn(e.layerState)),e.pastLayerStates.length>e.maxHistory&&e.pastLayerStates.shift(),e.layerState=t)},setShouldShowGrid:(e,t)=>{e.shouldShowGrid=t.payload},setIsMovingStage:(e,t)=>{e.isMovingStage=t.payload},setShouldSnapToGrid:(e,t)=>{e.shouldSnapToGrid=t.payload},setShouldAutoSave:(e,t)=>{e.shouldAutoSave=t.payload},setShouldShowIntermediates:(e,t)=>{e.shouldShowIntermediates=t.payload},resetCanvas:e=>{e.pastLayerStates.push(Yn(e.layerState)),e.layerState=_u,e.futureLayerStates=[]},setCanvasContainerDimensions:(e,t)=>{e.canvasContainerDimensions=t.payload},resizeAndScaleCanvas:e=>{const{width:t,height:n}=e.canvasContainerDimensions,r=e.layerState.objects.find(Hw),i={width:Math.floor(t),height:Math.floor(n)};if(!r){const c=au(i.width,i.height,512,512,Ed),d=su(i.width,i.height,0,0,512,512,c),f={width:512,height:512};if(e.stageScale=c,e.stageCoordinates=d,e.stageDimensions=i,e.boundingBoxCoordinates={x:0,y:0},e.boundingBoxDimensions=f,e.boundingBoxScaleMethod==="auto"){const h=Va(f);e.scaledBoundingBoxDimensions=h}return}const{width:o,height:s}=r,l=au(t,n,o,s,.95),u=su(i.width,i.height,0,0,o,s,l);e.minimumStageScale=l,e.stageScale=l,e.stageCoordinates=rk(u),e.stageDimensions=i,e.isCanvasInitialized=!0},resizeCanvas:e=>{const{width:t,height:n}=e.canvasContainerDimensions,r={width:Math.floor(t),height:Math.floor(n)};if(e.stageDimensions=r,!e.layerState.objects.find(Hw)){const i=au(r.width,r.height,512,512,Ed),o=su(r.width,r.height,0,0,512,512,i),s={width:512,height:512};if(e.stageScale=i,e.stageCoordinates=o,e.boundingBoxCoordinates={x:0,y:0},e.boundingBoxDimensions=s,e.boundingBoxScaleMethod==="auto"){const a=Va(s);e.scaledBoundingBoxDimensions=a}}},resetCanvasView:(e,t)=>{const{contentRect:n,shouldScaleTo1:r}=t.payload,{stageDimensions:{width:i,height:o}}=e,{x:s,y:a,width:l,height:u}=n;if(l!==0&&u!==0){const c=r?1:au(i,o,l,u,Ed),d=su(i,o,s,a,l,u,c);e.stageScale=c,e.stageCoordinates=d}else{const c=au(i,o,512,512,Ed),d=su(i,o,0,0,512,512,c),f={width:512,height:512};if(e.stageScale=c,e.stageCoordinates=d,e.boundingBoxCoordinates={x:0,y:0},e.boundingBoxDimensions=f,e.boundingBoxScaleMethod==="auto"){const h=Va(f);e.scaledBoundingBoxDimensions=h}}},nextStagingAreaImage:e=>{if(!e.layerState.stagingArea.images.length)return;const t=e.layerState.stagingArea.selectedImageIndex,n=e.layerState.stagingArea.images.length;e.layerState.stagingArea.selectedImageIndex=Math.min(t+1,n-1)},prevStagingAreaImage:e=>{if(!e.layerState.stagingArea.images.length)return;const t=e.layerState.stagingArea.selectedImageIndex;e.layerState.stagingArea.selectedImageIndex=Math.max(t-1,0)},commitStagingAreaImage:(e,t)=>{if(!e.layerState.stagingArea.images.length)return;const{images:n,selectedImageIndex:r}=e.layerState.stagingArea;e.pastLayerStates.push(Yn(e.layerState)),e.pastLayerStates.length>e.maxHistory&&e.pastLayerStates.shift(),e.layerState.objects.push({...n[r]}),e.layerState.stagingArea={..._u.stagingArea},e.futureLayerStates=[],e.shouldShowStagingOutline=!0,e.shouldShowStagingImage=!0},fitBoundingBoxToStage:e=>{const{boundingBoxDimensions:t,boundingBoxCoordinates:n,stageDimensions:r,stageScale:i}=e,o=r.width/i,s=r.height/i;if(n.x<0||n.x+t.width>o||n.y<0||n.y+t.height>s){const a={width:qd(Jo(o,64,512),64),height:qd(Jo(s,64,512),64)},l={x:no(o/2-a.width/2,64),y:no(s/2-a.height/2,64)};if(e.boundingBoxDimensions=a,e.boundingBoxCoordinates=l,e.boundingBoxScaleMethod==="auto"){const u=Va(a);e.scaledBoundingBoxDimensions=u}}},setBoundingBoxScaleMethod:(e,t)=>{if(e.boundingBoxScaleMethod=t.payload,t.payload==="auto"){const n=Va(e.boundingBoxDimensions);e.scaledBoundingBoxDimensions=n}},setScaledBoundingBoxDimensions:(e,t)=>{e.scaledBoundingBoxDimensions=t.payload},setShouldShowStagingImage:(e,t)=>{e.shouldShowStagingImage=t.payload},setShouldShowStagingOutline:(e,t)=>{e.shouldShowStagingOutline=t.payload},setShouldShowCanvasDebugInfo:(e,t)=>{e.shouldShowCanvasDebugInfo=t.payload},setShouldRestrictStrokesToBox:(e,t)=>{e.shouldRestrictStrokesToBox=t.payload},setShouldAntialias:(e,t)=>{e.shouldAntialias=t.payload},setShouldCropToBoundingBoxOnSave:(e,t)=>{e.shouldCropToBoundingBoxOnSave=t.payload},setColorPickerColor:(e,t)=>{e.colorPickerColor=t.payload},commitColorPickerColor:e=>{e.brushColor={...e.colorPickerColor,a:e.brushColor.a},e.tool="brush"},setMergedCanvas:(e,t)=>{e.pastLayerStates.push(Yn(e.layerState)),e.futureLayerStates=[],e.layerState.objects=[t.payload]},resetCanvasInteractionState:e=>{e.cursorPosition=null,e.isDrawing=!1,e.isMouseOverBoundingBox=!1,e.isMoveBoundingBoxKeyHeld=!1,e.isMoveStageKeyHeld=!1,e.isMovingBoundingBox=!1,e.isMovingStage=!1,e.isTransformingBoundingBox=!1},mouseLeftCanvas:e=>{e.cursorPosition=null,e.isDrawing=!1,e.isMouseOverBoundingBox=!1,e.isMovingBoundingBox=!1,e.isTransformingBoundingBox=!1}},extraReducers:e=>{e.addCase(zl.pending,t=>{t.layerState.stagingArea.images.length||(t.layerState.stagingArea=_u.stagingArea)}),e.addCase(Uce,(t,n)=>{t.doesCanvasNeedScaling=!0}),e.addCase(zce,(t,n)=>{t.doesCanvasNeedScaling=!0}),e.addCase(DD,(t,n)=>{const r=n.payload;r&&(t.boundingBoxDimensions.height=no(t.boundingBoxDimensions.width/r,64))})}}),{addEraseRect:NPe,addFillRect:DPe,addImageToStagingArea:mhe,addLine:LPe,addPointToCurrentLine:$Pe,clearCanvasHistory:FPe,clearMask:BPe,commitColorPickerColor:jPe,commitStagingAreaImage:yhe,discardStagedImages:VPe,fitBoundingBoxToStage:zPe,mouseLeftCanvas:UPe,nextStagingAreaImage:GPe,prevStagingAreaImage:HPe,redo:qPe,resetCanvas:fL,resetCanvasInteractionState:WPe,resetCanvasView:KPe,resizeAndScaleCanvas:YPe,resizeCanvas:XPe,setBoundingBoxCoordinates:QPe,setBoundingBoxDimensions:ZPe,setBoundingBoxPreviewFill:JPe,setBoundingBoxScaleMethod:e6e,flipBoundingBoxAxes:t6e,setBrushColor:n6e,setBrushSize:r6e,setCanvasContainerDimensions:i6e,setColorPickerColor:o6e,setCursorPosition:s6e,setDoesCanvasNeedScaling:a6e,setInitialCanvasImage:hL,setIsDrawing:l6e,setIsMaskEnabled:u6e,setIsMouseOverBoundingBox:c6e,setIsMoveBoundingBoxKeyHeld:d6e,setIsMoveStageKeyHeld:f6e,setIsMovingBoundingBox:h6e,setIsMovingStage:p6e,setIsTransformingBoundingBox:g6e,setLayer:m6e,setMaskColor:y6e,setMergedCanvas:vhe,setShouldAutoSave:v6e,setShouldCropToBoundingBoxOnSave:b6e,setShouldDarkenOutsideBoundingBox:S6e,setShouldLockBoundingBox:_6e,setShouldPreserveMaskedArea:w6e,setShouldShowBoundingBox:x6e,setShouldShowBrush:C6e,setShouldShowBrushPreview:T6e,setShouldShowCanvasDebugInfo:E6e,setShouldShowCheckboardTransparency:P6e,setShouldShowGrid:k6e,setShouldShowIntermediates:A6e,setShouldShowStagingImage:O6e,setShouldShowStagingOutline:R6e,setShouldSnapToGrid:I6e,setStageCoordinates:M6e,setStageScale:N6e,setTool:D6e,toggleShouldLockBoundingBox:L6e,toggleTool:$6e,undo:F6e,setScaledBoundingBoxDimensions:B6e,setShouldRestrictStrokesToBox:j6e,stagingAreaInitialized:bhe,canvasSessionIdChanged:She,setShouldAntialias:V6e}=dL.actions,_he=dL.reducer,whe=(e,t)=>{const n=new Date(e),r=new Date(t);return n>r?1:n0&&o[o.length-1])&&(u[0]===6||u[0]===2)){n=0;continue}if(u[0]===3&&(!o||u[1]>o[0]&&u[1]"u"||navigator.onLine===void 0?!0:navigator.onLine}function Ihe(){return typeof document>"u"?!0:document.visibilityState!=="hidden"}var ak=Bi;function mL(e,t){if(e===t||!(ak(e)&&ak(t)||Array.isArray(e)&&Array.isArray(t)))return t;for(var n=Object.keys(t),r=Object.keys(e),i=n.length===r.length,o=Array.isArray(t)?[]:{},s=0,a=n;s=200&&e.status<=299},Nhe=function(e){return/ion\/(vnd\.api\+)?json/.test(e.get("content-type")||"")};function uk(e){if(!Bi(e))return e;for(var t=Gt({},e),n=0,r=Object.entries(t);n"u"&&a===lk&&console.warn("Warning: `fetch` is not available. Please supply a custom `fetchFn` property to use `fetchBaseQuery` on SSR environments."),function(g,b){return Yy(t,null,function(){var _,w,x,C,k,P,A,$,N,T,O,I,M,R,D,L,V,z,U,K,W,X,F,q,Q,J,ne,Z,me,ae,oe,Ce,se,qe,yt,$e;return qy(this,function(Fe){switch(Fe.label){case 0:return _=b.signal,w=b.getState,x=b.extra,C=b.endpoint,k=b.forced,P=b.type,$=typeof g=="string"?{url:g}:g,N=$.url,T=$.headers,O=T===void 0?new Headers(v.headers):T,I=$.params,M=I===void 0?void 0:I,R=$.responseHandler,D=R===void 0?m??"json":R,L=$.validateStatus,V=L===void 0?S??Mhe:L,z=$.timeout,U=z===void 0?p:z,K=ok($,["url","headers","params","responseHandler","validateStatus","timeout"]),W=Gt(co(Gt({},v),{signal:_}),K),O=new Headers(uk(O)),X=W,[4,o(O,{getState:w,extra:x,endpoint:C,forced:k,type:P})];case 1:X.headers=Fe.sent()||O,F=function(Ie){return typeof Ie=="object"&&(Bi(Ie)||Array.isArray(Ie)||typeof Ie.toJSON=="function")},!W.headers.has("content-type")&&F(W.body)&&W.headers.set("content-type",f),F(W.body)&&c(W.headers)&&(W.body=JSON.stringify(W.body,h)),M&&(q=~N.indexOf("?")?"&":"?",Q=l?l(M):new URLSearchParams(uk(M)),N+=q+Q),N=Ohe(r,N),J=new Request(N,W),ne=J.clone(),A={request:ne},me=!1,ae=U&&setTimeout(function(){me=!0,b.abort()},U),Fe.label=2;case 2:return Fe.trys.push([2,4,5,6]),[4,a(J)];case 3:return Z=Fe.sent(),[3,6];case 4:return oe=Fe.sent(),[2,{error:{status:me?"TIMEOUT_ERROR":"FETCH_ERROR",error:String(oe)},meta:A}];case 5:return ae&&clearTimeout(ae),[7];case 6:Ce=Z.clone(),A.response=Ce,qe="",Fe.label=7;case 7:return Fe.trys.push([7,9,,10]),[4,Promise.all([y(Z,D).then(function(Ie){return se=Ie},function(Ie){return yt=Ie}),Ce.text().then(function(Ie){return qe=Ie},function(){})])];case 8:if(Fe.sent(),yt)throw yt;return[3,10];case 9:return $e=Fe.sent(),[2,{error:{status:"PARSING_ERROR",originalStatus:Z.status,data:qe,error:String($e)},meta:A}];case 10:return[2,V(Z,se)?{data:se,meta:A}:{error:{status:Z.status,data:se},meta:A}]}})})};function y(g,b){return Yy(this,null,function(){var _;return qy(this,function(w){switch(w.label){case 0:return typeof b=="function"?[2,b(g)]:(b==="content-type"&&(b=c(g.headers)?"json":"text"),b!=="json"?[3,2]:[4,g.text()]);case 1:return _=w.sent(),[2,_.length?JSON.parse(_):null];case 2:return[2,g.text()]}})})}}var ck=function(){function e(t,n){n===void 0&&(n=void 0),this.value=t,this.meta=n}return e}(),h3=ge("__rtkq/focused"),yL=ge("__rtkq/unfocused"),p3=ge("__rtkq/online"),vL=ge("__rtkq/offline"),To;(function(e){e.query="query",e.mutation="mutation"})(To||(To={}));function bL(e){return e.type===To.query}function Lhe(e){return e.type===To.mutation}function SL(e,t,n,r,i,o){return $he(e)?e(t,n,r,i).map(qw).map(o):Array.isArray(e)?e.map(qw).map(o):[]}function $he(e){return typeof e=="function"}function qw(e){return typeof e=="string"?{type:e}:e}function c_(e){return e!=null}var xh=Symbol("forceQueryFn"),Ww=function(e){return typeof e[xh]=="function"};function Fhe(e){var t=e.serializeQueryArgs,n=e.queryThunk,r=e.mutationThunk,i=e.api,o=e.context,s=new Map,a=new Map,l=i.internalActions,u=l.unsubscribeQueryResult,c=l.removeMutationResult,d=l.updateSubscriptionOptions;return{buildInitiateQuery:y,buildInitiateMutation:g,getRunningQueryThunk:p,getRunningMutationThunk:m,getRunningQueriesThunk:S,getRunningMutationsThunk:v,getRunningOperationPromises:h,removalWarning:f};function f(){throw new Error(`This method had to be removed due to a conceptual bug in RTK. + Please see https://github.com/reduxjs/redux-toolkit/pull/2481 for details. + See https://redux-toolkit.js.org/rtk-query/usage/server-side-rendering for new guidance on SSR.`)}function h(){typeof process<"u";var b=function(_){return Array.from(_.values()).flatMap(function(w){return w?Object.values(w):[]})};return Wy(Wy([],b(s)),b(a)).filter(c_)}function p(b,_){return function(w){var x,C=o.endpointDefinitions[b],k=t({queryArgs:_,endpointDefinition:C,endpointName:b});return(x=s.get(w))==null?void 0:x[k]}}function m(b,_){return function(w){var x;return(x=a.get(w))==null?void 0:x[_]}}function S(){return function(b){return Object.values(s.get(b)||{}).filter(c_)}}function v(){return function(b){return Object.values(a.get(b)||{}).filter(c_)}}function y(b,_){var w=function(x,C){var k=C===void 0?{}:C,P=k.subscribe,A=P===void 0?!0:P,$=k.forceRefetch,N=k.subscriptionOptions,T=xh,O=k[T];return function(I,M){var R,D,L=t({queryArgs:x,endpointDefinition:_,endpointName:b}),V=n((R={type:"query",subscribe:A,forceRefetch:$,subscriptionOptions:N,endpointName:b,originalArgs:x,queryCacheKey:L},R[xh]=O,R)),z=i.endpoints[b].select(x),U=I(V),K=z(M()),W=U.requestId,X=U.abort,F=K.requestId!==W,q=(D=s.get(I))==null?void 0:D[L],Q=function(){return z(M())},J=Object.assign(O?U.then(Q):F&&!q?Promise.resolve(K):Promise.all([q,U]).then(Q),{arg:x,requestId:W,subscriptionOptions:N,queryCacheKey:L,abort:X,unwrap:function(){return Yy(this,null,function(){var Z;return qy(this,function(me){switch(me.label){case 0:return[4,J];case 1:if(Z=me.sent(),Z.isError)throw Z.error;return[2,Z.data]}})})},refetch:function(){return I(w(x,{subscribe:!1,forceRefetch:!0}))},unsubscribe:function(){A&&I(u({queryCacheKey:L,requestId:W}))},updateSubscriptionOptions:function(Z){J.subscriptionOptions=Z,I(d({endpointName:b,requestId:W,queryCacheKey:L,options:Z}))}});if(!q&&!F&&!O){var ne=s.get(I)||{};ne[L]=J,s.set(I,ne),J.then(function(){delete ne[L],Object.keys(ne).length||s.delete(I)})}return J}};return w}function g(b){return function(_,w){var x=w===void 0?{}:w,C=x.track,k=C===void 0?!0:C,P=x.fixedCacheKey;return function(A,$){var N=r({type:"mutation",endpointName:b,originalArgs:_,track:k,fixedCacheKey:P}),T=A(N),O=T.requestId,I=T.abort,M=T.unwrap,R=T.unwrap().then(function(z){return{data:z}}).catch(function(z){return{error:z}}),D=function(){A(c({requestId:O,fixedCacheKey:P}))},L=Object.assign(R,{arg:T.arg,requestId:O,abort:I,unwrap:M,unsubscribe:D,reset:D}),V=a.get(A)||{};return a.set(A,V),V[O]=L,L.then(function(){delete V[O],Object.keys(V).length||a.delete(A)}),P&&(V[P]=L,L.then(function(){V[P]===L&&(delete V[P],Object.keys(V).length||a.delete(A))})),L}}}}function dk(e){return e}function Bhe(e){var t=this,n=e.reducerPath,r=e.baseQuery,i=e.context.endpointDefinitions,o=e.serializeQueryArgs,s=e.api,a=function(g,b,_){return function(w){var x=i[g];w(s.internalActions.queryResultPatched({queryCacheKey:o({queryArgs:b,endpointDefinition:x,endpointName:g}),patches:_}))}},l=function(g,b,_){return function(w,x){var C,k,P=s.endpoints[g].select(b)(x()),A={patches:[],inversePatches:[],undo:function(){return w(s.util.patchQueryData(g,b,A.inversePatches))}};if(P.status===Et.uninitialized)return A;if("data"in P)if(Or(P.data)){var $=HC(P.data,_),N=$[1],T=$[2];(C=A.patches).push.apply(C,N),(k=A.inversePatches).push.apply(k,T)}else{var O=_(P.data);A.patches.push({op:"replace",path:[],value:O}),A.inversePatches.push({op:"replace",path:[],value:P.data})}return w(s.util.patchQueryData(g,b,A.patches)),A}},u=function(g,b,_){return function(w){var x;return w(s.endpoints[g].initiate(b,(x={subscribe:!1,forceRefetch:!0},x[xh]=function(){return{data:_}},x)))}},c=function(g,b){return Yy(t,[g,b],function(_,w){var x,C,k,P,A,$,N,T,O,I,M,R,D,L,V,z,U,K,W=w.signal,X=w.abort,F=w.rejectWithValue,q=w.fulfillWithValue,Q=w.dispatch,J=w.getState,ne=w.extra;return qy(this,function(Z){switch(Z.label){case 0:x=i[_.endpointName],Z.label=1;case 1:return Z.trys.push([1,8,,13]),C=dk,k=void 0,P={signal:W,abort:X,dispatch:Q,getState:J,extra:ne,endpoint:_.endpointName,type:_.type,forced:_.type==="query"?d(_,J()):void 0},A=_.type==="query"?_[xh]:void 0,A?(k=A(),[3,6]):[3,2];case 2:return x.query?[4,r(x.query(_.originalArgs),P,x.extraOptions)]:[3,4];case 3:return k=Z.sent(),x.transformResponse&&(C=x.transformResponse),[3,6];case 4:return[4,x.queryFn(_.originalArgs,P,x.extraOptions,function(me){return r(me,P,x.extraOptions)})];case 5:k=Z.sent(),Z.label=6;case 6:if(typeof process<"u",k.error)throw new ck(k.error,k.meta);return M=q,[4,C(k.data,k.meta,_.originalArgs)];case 7:return[2,M.apply(void 0,[Z.sent(),(U={fulfilledTimeStamp:Date.now(),baseQueryMeta:k.meta},U[tl]=!0,U)])];case 8:if(R=Z.sent(),D=R,!(D instanceof ck))return[3,12];L=dk,x.query&&x.transformErrorResponse&&(L=x.transformErrorResponse),Z.label=9;case 9:return Z.trys.push([9,11,,12]),V=F,[4,L(D.value,D.meta,_.originalArgs)];case 10:return[2,V.apply(void 0,[Z.sent(),(K={baseQueryMeta:D.meta},K[tl]=!0,K)])];case 11:return z=Z.sent(),D=z,[3,12];case 12:throw typeof process<"u",console.error(D),D;case 13:return[2]}})})};function d(g,b){var _,w,x,C,k=(w=(_=b[n])==null?void 0:_.queries)==null?void 0:w[g.queryCacheKey],P=(x=b[n])==null?void 0:x.config.refetchOnMountOrArgChange,A=k==null?void 0:k.fulfilledTimeStamp,$=(C=g.forceRefetch)!=null?C:g.subscribe&&P;return $?$===!0||(Number(new Date)-Number(A))/1e3>=$:!1}var f=Gf(n+"/executeQuery",c,{getPendingMeta:function(){var g;return g={startedTimeStamp:Date.now()},g[tl]=!0,g},condition:function(g,b){var _=b.getState,w,x,C,k=_(),P=(x=(w=k[n])==null?void 0:w.queries)==null?void 0:x[g.queryCacheKey],A=P==null?void 0:P.fulfilledTimeStamp,$=g.originalArgs,N=P==null?void 0:P.originalArgs,T=i[g.endpointName];return Ww(g)?!0:(P==null?void 0:P.status)==="pending"?!1:d(g,k)||bL(T)&&((C=T==null?void 0:T.forceRefetch)!=null&&C.call(T,{currentArg:$,previousArg:N,endpointState:P,state:k}))?!0:!A},dispatchConditionRejection:!0}),h=Gf(n+"/executeMutation",c,{getPendingMeta:function(){var g;return g={startedTimeStamp:Date.now()},g[tl]=!0,g}}),p=function(g){return"force"in g},m=function(g){return"ifOlderThan"in g},S=function(g,b,_){return function(w,x){var C=p(_)&&_.force,k=m(_)&&_.ifOlderThan,P=function(T){return T===void 0&&(T=!0),s.endpoints[g].initiate(b,{forceRefetch:T})},A=s.endpoints[g].select(b)(x());if(C)w(P());else if(k){var $=A==null?void 0:A.fulfilledTimeStamp;if(!$){w(P());return}var N=(Number(new Date)-Number(new Date($)))/1e3>=k;N&&w(P())}else w(P(!1))}};function v(g){return function(b){var _,w;return((w=(_=b==null?void 0:b.meta)==null?void 0:_.arg)==null?void 0:w.endpointName)===g}}function y(g,b){return{matchPending:Xu(pv(g),v(b)),matchFulfilled:Xu(ka(g),v(b)),matchRejected:Xu(wc(g),v(b))}}return{queryThunk:f,mutationThunk:h,prefetch:S,updateQueryData:l,upsertQueryData:u,patchQueryData:a,buildMatchThunkActions:y}}function _L(e,t,n,r){return SL(n[e.meta.arg.endpointName][t],ka(e)?e.payload:void 0,ep(e)?e.payload:void 0,e.meta.arg.originalArgs,"baseQueryMeta"in e.meta?e.meta.baseQueryMeta:void 0,r)}function wg(e,t,n){var r=e[t];r&&n(r)}function Ch(e){var t;return(t="arg"in e?e.arg.fixedCacheKey:e.fixedCacheKey)!=null?t:e.requestId}function fk(e,t,n){var r=e[Ch(t)];r&&n(r)}var Pd={};function jhe(e){var t=e.reducerPath,n=e.queryThunk,r=e.mutationThunk,i=e.context,o=i.endpointDefinitions,s=i.apiUid,a=i.extractRehydrationInfo,l=i.hasRehydrationInfo,u=e.assertTagType,c=e.config,d=ge(t+"/resetApiState"),f=Vt({name:t+"/queries",initialState:Pd,reducers:{removeQueryResult:{reducer:function(_,w){var x=w.payload.queryCacheKey;delete _[x]},prepare:am()},queryResultPatched:function(_,w){var x=w.payload,C=x.queryCacheKey,k=x.patches;wg(_,C,function(P){P.data=V2(P.data,k.concat())})}},extraReducers:function(_){_.addCase(n.pending,function(w,x){var C=x.meta,k=x.meta.arg,P,A,$=Ww(k);(k.subscribe||$)&&((A=w[P=k.queryCacheKey])!=null||(w[P]={status:Et.uninitialized,endpointName:k.endpointName})),wg(w,k.queryCacheKey,function(N){N.status=Et.pending,N.requestId=$&&N.requestId?N.requestId:C.requestId,k.originalArgs!==void 0&&(N.originalArgs=k.originalArgs),N.startedTimeStamp=C.startedTimeStamp})}).addCase(n.fulfilled,function(w,x){var C=x.meta,k=x.payload;wg(w,C.arg.queryCacheKey,function(P){var A;if(!(P.requestId!==C.requestId&&!Ww(C.arg))){var $=o[C.arg.endpointName].merge;if(P.status=Et.fulfilled,$)if(P.data!==void 0){var N=C.fulfilledTimeStamp,T=C.arg,O=C.baseQueryMeta,I=C.requestId,M=Pa(P.data,function(R){return $(R,k,{arg:T.originalArgs,baseQueryMeta:O,fulfilledTimeStamp:N,requestId:I})});P.data=M}else P.data=k;else P.data=(A=o[C.arg.endpointName].structuralSharing)==null||A?mL(dr(P.data)?FC(P.data):P.data,k):k;delete P.error,P.fulfilledTimeStamp=C.fulfilledTimeStamp}})}).addCase(n.rejected,function(w,x){var C=x.meta,k=C.condition,P=C.arg,A=C.requestId,$=x.error,N=x.payload;wg(w,P.queryCacheKey,function(T){if(!k){if(T.requestId!==A)return;T.status=Et.rejected,T.error=N??$}})}).addMatcher(l,function(w,x){for(var C=a(x).queries,k=0,P=Object.entries(C);k{const r=wh.get(),i=_h.get();return Dhe({baseUrl:`${r??""}/api/v1`,prepareHeaders:s=>(i&&s.set("Authorization",`Bearer ${i}`),s)})(e,t,n)},Eo=ype({baseQuery:bpe,reducerPath:"api",tagTypes:vpe,endpoints:()=>({})}),Th=Eo.injectEndpoints({endpoints:e=>({listBoards:e.query({query:t=>({url:"boards/",params:t}),providesTags:(t,n,r)=>{const i=[{type:"Board",id:bn}];return t&&i.push(...t.items.map(({board_id:o})=>({type:"Board",id:o}))),i}}),listAllBoards:e.query({query:()=>({url:"boards/",params:{all:!0}}),providesTags:(t,n,r)=>{const i=[{type:"Board",id:bn}];return t&&i.push(...t.map(({board_id:o})=>({type:"Board",id:o}))),i}}),createBoard:e.mutation({query:t=>({url:"boards/",method:"POST",params:{board_name:t}}),invalidatesTags:[{type:"Board",id:bn}]}),updateBoard:e.mutation({query:({board_id:t,changes:n})=>({url:`boards/${t}`,method:"PATCH",body:n}),invalidatesTags:(t,n,r)=>[{type:"Board",id:r.board_id}]}),deleteBoard:e.mutation({query:t=>({url:`boards/${t}`,method:"DELETE"}),invalidatesTags:(t,n,r)=>[{type:"Board",id:r}]}),deleteBoardAndImages:e.mutation({query:t=>({url:`boards/${t}`,method:"DELETE",params:{include_images:!0}}),invalidatesTags:(t,n,r)=>[{type:"Board",id:r},{type:"Image",id:bn}]})})}),{useListBoardsQuery:z6e,useListAllBoardsQuery:U6e,useCreateBoardMutation:G6e,useUpdateBoardMutation:H6e,useDeleteBoardMutation:Spe,useDeleteBoardAndImagesMutation:q6e}=Th,eo=Nl({selectId:e=>e.image_name,sortComparer:(e,t)=>whe(t.updated_at,e.updated_at)}),g1=["general"],m1=["control","mask","user","other"],wk=100,W6e=20,xL=eo.getInitialState({offset:0,limit:0,total:0,isLoading:!0,isFetching:!0,selection:[],shouldAutoSwitch:!0,galleryImageMinimumWidth:96,galleryView:"images",selectedBoardId:"all",isInitialized:!1,batchImageNames:[],isBatchEnabled:!1}),CL=Vt({name:"gallery",initialState:xL,reducers:{imageUpserted:(e,t)=>{eo.upsertOne(e,t.payload),e.shouldAutoSwitch&&t.payload.image_category==="general"&&(e.selection=[t.payload.image_name],e.galleryView="images",e.selectedBoardId="all")},imageUpdatedOne:(e,t)=>{eo.updateOne(e,t.payload)},imageRemoved:(e,t)=>{eo.removeOne(e,t.payload),e.batchImageNames=e.batchImageNames.filter(n=>n!==t.payload)},imagesRemoved:(e,t)=>{eo.removeMany(e,t.payload),e.batchImageNames=e.batchImageNames.filter(n=>!t.payload.includes(n))},imageRangeEndSelected:(e,t)=>{const n=t.payload,r=e.selection[e.selection.length-1],i=g3(e),o=i.findIndex(a=>a.image_name===r),s=i.findIndex(a=>a.image_name===n);if(o>-1&&s>-1){const a=Math.min(o,s),l=Math.max(o,s),u=i.slice(a,l+1).map(c=>c.image_name);e.selection=DS(e.selection.concat(u))}},imageSelectionToggled:(e,t)=>{e.selection.includes(t.payload)&&e.selection.length>1?e.selection=e.selection.filter(n=>n!==t.payload):e.selection=DS(e.selection.concat(t.payload))},imageSelected:(e,t)=>{e.selection=t.payload?[t.payload]:[]},shouldAutoSwitchChanged:(e,t)=>{e.shouldAutoSwitch=t.payload},setGalleryImageMinimumWidth:(e,t)=>{e.galleryImageMinimumWidth=t.payload},setGalleryView:(e,t)=>{e.galleryView=t.payload},boardIdSelected:(e,t)=>{e.selectedBoardId=t.payload},isLoadingChanged:(e,t)=>{e.isLoading=t.payload},isBatchEnabledChanged:(e,t)=>{e.isBatchEnabled=t.payload},imagesAddedToBatch:(e,t)=>{e.batchImageNames=DS(e.batchImageNames.concat(t.payload))},imagesRemovedFromBatch:(e,t)=>{e.batchImageNames=e.batchImageNames.filter(r=>!t.payload.includes(r));const n=e.selection.filter(r=>!t.payload.includes(r));if(n.length){e.selection=n;return}e.selection=[e.batchImageNames[0]]},batchReset:e=>{e.batchImageNames=[],e.selection=[]}},extraReducers:e=>{e.addCase(ua.pending,t=>{t.isFetching=!0}),e.addCase(ua.rejected,t=>{t.isFetching=!1}),e.addCase(ua.fulfilled,(t,n)=>{t.isFetching=!1;const{board_id:r,categories:i,image_origin:o,is_intermediate:s}=n.meta.arg,{items:a,offset:l,limit:u,total:c}=n.payload;eo.upsertMany(t,a),t.selection.length===0&&a.length&&(t.selection=[a[0].image_name]),!(!(i!=null&&i.includes("general"))||r)&&(t.offset=l,t.total=c)}),e.addCase(v3.fulfilled,(t,n)=>{const{image_name:r,image_url:i,thumbnail_url:o}=n.payload;eo.updateOne(t,{id:r,changes:{image_url:i,thumbnail_url:o}})}),e.addMatcher(Th.endpoints.deleteBoard.matchFulfilled,(t,n)=>{n.meta.arg.originalArgs===t.selectedBoardId&&(t.selectedBoardId="all")})}}),{selectAll:TL,selectById:Qa,selectEntities:K6e,selectIds:Y6e,selectTotal:X6e}=eo.getSelectors(e=>e.gallery),{imageUpserted:y1,imageUpdatedOne:_pe,imageRemoved:wpe,imagesRemoved:xpe,imageRangeEndSelected:Q6e,imageSelectionToggled:Z6e,imageSelected:hl,shouldAutoSwitchChanged:J6e,setGalleryImageMinimumWidth:eke,setGalleryView:tke,boardIdSelected:xk,isLoadingChanged:Cpe,isBatchEnabledChanged:nke,imagesAddedToBatch:Kw,imagesRemovedFromBatch:rke}=CL.actions,Tpe=CL.reducer,ike=e=>e.gallery,Epe=(e,t,n)=>e==="all"||e==="none"&&!t.board_id||e==="batch"&&n.includes(t.image_name)?!0:e===t.board_id,g3=at([e=>e],e=>{const t=eo.getSelectors().selectAll(e),{galleryView:n,selectedBoardId:r}=e,i=n==="images"?g1:m1;return t.filter(s=>{const a=i.includes(s.image_category),l=Epe(r,s,e.batchImageNames);return a&&l})}),v1=at(e=>e,e=>g3(e.gallery),_s);at(v1,e=>tZ(e,"image_name"));at(v1,e=>e.map(t=>t.image_name));const oke=at(e=>e,e=>e.gallery.selection[e.gallery.selection.length-1],_s);at(e=>e,e=>eo.getSelectors().selectAll(e.gallery).filter(t=>e.gallery.selection.includes(t.image_name)),_s);const Ppe=at([e=>e,(e,t)=>t],(e,t)=>{const r=g3(e).map(l=>l.image_name),i=r.findIndex(l=>l.toString()===t),o=r.filter(l=>l.toString()!==t),s=Jo(i,0,o.length-1);return o[s]}),kpe=at([e=>e,(e,t)=>t],(e,t)=>Ppe(e.gallery,t),_s),EL="%[a-f0-9]{2}",Ck=new RegExp("("+EL+")|([^%]+?)","gi"),Tk=new RegExp("("+EL+")+","gi");function Yw(e,t){try{return[decodeURIComponent(e.join(""))]}catch{}if(e.length===1)return e;t=t||1;const n=e.slice(0,t),r=e.slice(t);return Array.prototype.concat.call([],Yw(n),Yw(r))}function Ape(e){try{return decodeURIComponent(e)}catch{let t=e.match(Ck)||[];for(let n=1;ne==null,Npe=e=>encodeURIComponent(e).replace(/[!'()*]/g,t=>`%${t.charCodeAt(0).toString(16).toUpperCase()}`),Xw=Symbol("encodeFragmentIdentifier");function Dpe(e){switch(e.arrayFormat){case"index":return t=>(n,r)=>{const i=n.length;return r===void 0||e.skipNull&&r===null||e.skipEmptyString&&r===""?n:r===null?[...n,[Jt(t,e),"[",i,"]"].join("")]:[...n,[Jt(t,e),"[",Jt(i,e),"]=",Jt(r,e)].join("")]};case"bracket":return t=>(n,r)=>r===void 0||e.skipNull&&r===null||e.skipEmptyString&&r===""?n:r===null?[...n,[Jt(t,e),"[]"].join("")]:[...n,[Jt(t,e),"[]=",Jt(r,e)].join("")];case"colon-list-separator":return t=>(n,r)=>r===void 0||e.skipNull&&r===null||e.skipEmptyString&&r===""?n:r===null?[...n,[Jt(t,e),":list="].join("")]:[...n,[Jt(t,e),":list=",Jt(r,e)].join("")];case"comma":case"separator":case"bracket-separator":{const t=e.arrayFormat==="bracket-separator"?"[]=":"=";return n=>(r,i)=>i===void 0||e.skipNull&&i===null||e.skipEmptyString&&i===""?r:(i=i===null?"":i,r.length===0?[[Jt(n,e),t,Jt(i,e)].join("")]:[[r,Jt(i,e)].join(e.arrayFormatSeparator)])}default:return t=>(n,r)=>r===void 0||e.skipNull&&r===null||e.skipEmptyString&&r===""?n:r===null?[...n,Jt(t,e)]:[...n,[Jt(t,e),"=",Jt(r,e)].join("")]}}function Lpe(e){let t;switch(e.arrayFormat){case"index":return(n,r,i)=>{if(t=/\[(\d*)]$/.exec(n),n=n.replace(/\[\d*]$/,""),!t){i[n]=r;return}i[n]===void 0&&(i[n]={}),i[n][t[1]]=r};case"bracket":return(n,r,i)=>{if(t=/(\[])$/.exec(n),n=n.replace(/\[]$/,""),!t){i[n]=r;return}if(i[n]===void 0){i[n]=[r];return}i[n]=[...i[n],r]};case"colon-list-separator":return(n,r,i)=>{if(t=/(:list)$/.exec(n),n=n.replace(/:list$/,""),!t){i[n]=r;return}if(i[n]===void 0){i[n]=[r];return}i[n]=[...i[n],r]};case"comma":case"separator":return(n,r,i)=>{const o=typeof r=="string"&&r.includes(e.arrayFormatSeparator),s=typeof r=="string"&&!o&&Yo(r,e).includes(e.arrayFormatSeparator);r=s?Yo(r,e):r;const a=o||s?r.split(e.arrayFormatSeparator).map(l=>Yo(l,e)):r===null?r:Yo(r,e);i[n]=a};case"bracket-separator":return(n,r,i)=>{const o=/(\[])$/.test(n);if(n=n.replace(/\[]$/,""),!o){i[n]=r&&Yo(r,e);return}const s=r===null?[]:r.split(e.arrayFormatSeparator).map(a=>Yo(a,e));if(i[n]===void 0){i[n]=s;return}i[n]=[...i[n],...s]};default:return(n,r,i)=>{if(i[n]===void 0){i[n]=r;return}i[n]=[...[i[n]].flat(),r]}}}function kL(e){if(typeof e!="string"||e.length!==1)throw new TypeError("arrayFormatSeparator must be single character string")}function Jt(e,t){return t.encode?t.strict?Npe(e):encodeURIComponent(e):e}function Yo(e,t){return t.decode?Rpe(e):e}function AL(e){return Array.isArray(e)?e.sort():typeof e=="object"?AL(Object.keys(e)).sort((t,n)=>Number(t)-Number(n)).map(t=>e[t]):e}function OL(e){const t=e.indexOf("#");return t!==-1&&(e=e.slice(0,t)),e}function $pe(e){let t="";const n=e.indexOf("#");return n!==-1&&(t=e.slice(n)),t}function Ek(e,t){return t.parseNumbers&&!Number.isNaN(Number(e))&&typeof e=="string"&&e.trim()!==""?e=Number(e):t.parseBooleans&&e!==null&&(e.toLowerCase()==="true"||e.toLowerCase()==="false")&&(e=e.toLowerCase()==="true"),e}function m3(e){e=OL(e);const t=e.indexOf("?");return t===-1?"":e.slice(t+1)}function y3(e,t){t={decode:!0,sort:!0,arrayFormat:"none",arrayFormatSeparator:",",parseNumbers:!1,parseBooleans:!1,...t},kL(t.arrayFormatSeparator);const n=Lpe(t),r=Object.create(null);if(typeof e!="string"||(e=e.trim().replace(/^[?#&]/,""),!e))return r;for(const i of e.split("&")){if(i==="")continue;const o=t.decode?i.replace(/\+/g," "):i;let[s,a]=PL(o,"=");s===void 0&&(s=o),a=a===void 0?null:["comma","separator","bracket-separator"].includes(t.arrayFormat)?a:Yo(a,t),n(Yo(s,t),a,r)}for(const[i,o]of Object.entries(r))if(typeof o=="object"&&o!==null)for(const[s,a]of Object.entries(o))o[s]=Ek(a,t);else r[i]=Ek(o,t);return t.sort===!1?r:(t.sort===!0?Object.keys(r).sort():Object.keys(r).sort(t.sort)).reduce((i,o)=>{const s=r[o];return s&&typeof s=="object"&&!Array.isArray(s)?i[o]=AL(s):i[o]=s,i},Object.create(null))}function RL(e,t){if(!e)return"";t={encode:!0,strict:!0,arrayFormat:"none",arrayFormatSeparator:",",...t},kL(t.arrayFormatSeparator);const n=s=>t.skipNull&&Mpe(e[s])||t.skipEmptyString&&e[s]==="",r=Dpe(t),i={};for(const[s,a]of Object.entries(e))n(s)||(i[s]=a);const o=Object.keys(i);return t.sort!==!1&&o.sort(t.sort),o.map(s=>{const a=e[s];return a===void 0?"":a===null?Jt(s,t):Array.isArray(a)?a.length===0&&t.arrayFormat==="bracket-separator"?Jt(s,t)+"[]":a.reduce(r(s),[]).join("&"):Jt(s,t)+"="+Jt(a,t)}).filter(s=>s.length>0).join("&")}function IL(e,t){var i;t={decode:!0,...t};let[n,r]=PL(e,"#");return n===void 0&&(n=e),{url:((i=n==null?void 0:n.split("?"))==null?void 0:i[0])??"",query:y3(m3(e),t),...t&&t.parseFragmentIdentifier&&r?{fragmentIdentifier:Yo(r,t)}:{}}}function ML(e,t){t={encode:!0,strict:!0,[Xw]:!0,...t};const n=OL(e.url).split("?")[0]||"",r=m3(e.url),i={...y3(r,{sort:!1}),...e.query};let o=RL(i,t);o&&(o=`?${o}`);let s=$pe(e.url);if(e.fragmentIdentifier){const a=new URL(n);a.hash=e.fragmentIdentifier,s=t[Xw]?a.hash:`#${e.fragmentIdentifier}`}return`${n}${o}${s}`}function NL(e,t,n){n={parseFragmentIdentifier:!0,[Xw]:!1,...n};const{url:r,query:i,fragmentIdentifier:o}=IL(e,n);return ML({url:r,query:Ipe(i,t),fragmentIdentifier:o},n)}function Fpe(e,t,n){const r=Array.isArray(t)?i=>!t.includes(i):(i,o)=>!t(i,o);return NL(e,r,n)}const DL=Object.freeze(Object.defineProperty({__proto__:null,exclude:Fpe,extract:m3,parse:y3,parseUrl:IL,pick:NL,stringify:RL,stringifyUrl:ML},Symbol.toStringTag,{value:"Module"})),v3=Ro("thunkApi/imageUrlsReceived",async(e,{rejectWithValue:t})=>{const{image_name:n}=e,{get:r}=Io.get(),{data:i,error:o,response:s}=await r("/api/v1/images/{image_name}/urls",{params:{path:{image_name:n}}});return o?t({arg:e,error:o}):i}),Eh=Ro("thunkApi/imageMetadataReceived",async(e,{rejectWithValue:t})=>{const{image_name:n}=e,{get:r}=Io.get(),{data:i,error:o,response:s}=await r("/api/v1/images/{image_name}",{params:{path:{image_name:n}}});return o?t({arg:e,error:o}):i}),Br=Ro("thunkApi/imageUploaded",async(e,{rejectWithValue:t})=>{const{postUploadAction:n,file:r,image_category:i,is_intermediate:o,session_id:s}=e,{post:a}=Io.get(),{data:l,error:u,response:c}=await a("/api/v1/images/",{params:{query:{image_category:i,is_intermediate:o,session_id:s}},body:{file:r},bodySerializer:d=>{const f=new FormData;return f.append("file",d.file),f}});return u?t({arg:e,error:u}):l}),Lc=Ro("thunkApi/imageDeleted",async(e,{rejectWithValue:t})=>{const{image_name:n}=e,{del:r}=Io.get(),{data:i,error:o,response:s}=await r("/api/v1/images/{image_name}",{params:{path:{image_name:n}}});if(o)return t({arg:e,error:o})}),io=Ro("thunkApi/imageUpdated",async(e,{rejectWithValue:t})=>{const{image_name:n,image_category:r,is_intermediate:i,session_id:o}=e,{patch:s}=Io.get(),{data:a,error:l,response:u}=await s("/api/v1/images/{image_name}",{params:{path:{image_name:n}},body:{image_category:r,is_intermediate:i,session_id:o}});return l?t({arg:e,error:l}):a}),LL=20,Pk={limit:LL},ua=Ro("thunkApi/receivedPageOfImages",async(e,{getState:t,rejectWithValue:n})=>{const{get:r}=Io.get(),i=t(),o=v1(i),s=i.gallery.galleryView==="images"?g1:m1;let a={};p5(e)?a={...Pk,offset:o.length,...e}:a={...Pk,categories:s,offset:o.length};const{data:l,error:u,response:c}=await r("/api/v1/images/",{params:{query:a},querySerializer:d=>DL.stringify(d,{arrayFormat:"none"})});return u?n({arg:e,error:u}):l}),$L=ge("socket/socketConnected"),FL=ge("socket/appSocketConnected"),BL=ge("socket/socketDisconnected"),jL=ge("socket/appSocketDisconnected"),b3=ge("socket/socketSubscribed"),VL=ge("socket/appSocketSubscribed"),zL=ge("socket/socketUnsubscribed"),UL=ge("socket/appSocketUnsubscribed"),GL=ge("socket/socketInvocationStarted"),HL=ge("socket/appSocketInvocationStarted"),S3=ge("socket/socketInvocationComplete"),qL=ge("socket/appSocketInvocationComplete"),WL=ge("socket/socketInvocationError"),_3=ge("socket/appSocketInvocationError"),KL=ge("socket/socketGraphExecutionStateComplete"),YL=ge("socket/appSocketGraphExecutionStateComplete"),XL=ge("socket/socketGeneratorProgress"),QL=ge("socket/appSocketGeneratorProgress"),ZL=ge("socket/socketModelLoadStarted"),Bpe=ge("socket/appSocketModelLoadStarted"),JL=ge("socket/socketModelLoadCompleted"),jpe=ge("socket/appSocketModelLoadCompleted"),w3=ge("controlNet/imageProcessed"),wu={none:{type:"none",label:"none",description:"",default:{type:"none"}},canny_image_processor:{type:"canny_image_processor",label:"Canny",description:"",default:{id:"canny_image_processor",type:"canny_image_processor",low_threshold:100,high_threshold:200}},content_shuffle_image_processor:{type:"content_shuffle_image_processor",label:"Content Shuffle",description:"",default:{id:"content_shuffle_image_processor",type:"content_shuffle_image_processor",detect_resolution:512,image_resolution:512,h:512,w:512,f:256}},hed_image_processor:{type:"hed_image_processor",label:"HED",description:"",default:{id:"hed_image_processor",type:"hed_image_processor",detect_resolution:512,image_resolution:512,scribble:!1}},lineart_anime_image_processor:{type:"lineart_anime_image_processor",label:"Lineart Anime",description:"",default:{id:"lineart_anime_image_processor",type:"lineart_anime_image_processor",detect_resolution:512,image_resolution:512}},lineart_image_processor:{type:"lineart_image_processor",label:"Lineart",description:"",default:{id:"lineart_image_processor",type:"lineart_image_processor",detect_resolution:512,image_resolution:512,coarse:!1}},mediapipe_face_processor:{type:"mediapipe_face_processor",label:"Mediapipe Face",description:"",default:{id:"mediapipe_face_processor",type:"mediapipe_face_processor",max_faces:1,min_confidence:.5}},midas_depth_image_processor:{type:"midas_depth_image_processor",label:"Depth (Midas)",description:"",default:{id:"midas_depth_image_processor",type:"midas_depth_image_processor",a_mult:2,bg_th:.1}},mlsd_image_processor:{type:"mlsd_image_processor",label:"M-LSD",description:"",default:{id:"mlsd_image_processor",type:"mlsd_image_processor",detect_resolution:512,image_resolution:512,thr_d:.1,thr_v:.1}},normalbae_image_processor:{type:"normalbae_image_processor",label:"Normal BAE",description:"",default:{id:"normalbae_image_processor",type:"normalbae_image_processor",detect_resolution:512,image_resolution:512}},openpose_image_processor:{type:"openpose_image_processor",label:"Openpose",description:"",default:{id:"openpose_image_processor",type:"openpose_image_processor",detect_resolution:512,image_resolution:512,hand_and_face:!1}},pidi_image_processor:{type:"pidi_image_processor",label:"PIDI",description:"",default:{id:"pidi_image_processor",type:"pidi_image_processor",detect_resolution:512,image_resolution:512,scribble:!1,safe:!1}},zoe_depth_image_processor:{type:"zoe_depth_image_processor",label:"Depth (Zoe)",description:"",default:{id:"zoe_depth_image_processor",type:"zoe_depth_image_processor"}}},Eg={canny:"canny_image_processor",mlsd:"mlsd_image_processor",depth:"midas_depth_image_processor",bae:"normalbae_image_processor",lineart:"lineart_image_processor",lineart_anime:"lineart_anime_image_processor",softedge:"hed_image_processor",shuffle:"content_shuffle_image_processor",openpose:"openpose_image_processor",mediapipe:"mediapipe_face_processor"},kk={isEnabled:!0,model:null,weight:1,beginStepPct:0,endStepPct:1,controlMode:"balanced",controlImage:null,processedControlImage:null,processorType:"canny_image_processor",processorNode:wu.canny_image_processor.default,shouldAutoConfig:!0},Qw={controlNets:{},isEnabled:!1,pendingControlImages:[]},e$=Vt({name:"controlNet",initialState:Qw,reducers:{isControlNetEnabledToggled:e=>{e.isEnabled=!e.isEnabled},controlNetAdded:(e,t)=>{const{controlNetId:n,controlNet:r}=t.payload;e.controlNets[n]={...r??kk,controlNetId:n}},controlNetDuplicated:(e,t)=>{const{sourceControlNetId:n,newControlNetId:r}=t.payload,i=Yn(e.controlNets[n]);i.controlNetId=r,e.controlNets[r]=i},controlNetAddedFromImage:(e,t)=>{const{controlNetId:n,controlImage:r}=t.payload;e.controlNets[n]={...kk,controlNetId:n,controlImage:r}},controlNetRemoved:(e,t)=>{const{controlNetId:n}=t.payload;delete e.controlNets[n]},controlNetToggled:(e,t)=>{const{controlNetId:n}=t.payload;e.controlNets[n].isEnabled=!e.controlNets[n].isEnabled},controlNetImageChanged:(e,t)=>{const{controlNetId:n,controlImage:r}=t.payload;e.controlNets[n].controlImage=r,e.controlNets[n].processedControlImage=null,r!==null&&e.controlNets[n].processorType!=="none"&&e.pendingControlImages.push(n)},controlNetProcessedImageChanged:(e,t)=>{const{controlNetId:n,processedControlImage:r}=t.payload;e.controlNets[n].processedControlImage=r,e.pendingControlImages=e.pendingControlImages.filter(i=>i!==n)},controlNetModelChanged:(e,t)=>{const{controlNetId:n,model:r}=t.payload;if(e.controlNets[n].model=r,e.controlNets[n].processedControlImage=null,e.controlNets[n].shouldAutoConfig){let i;for(const o in Eg)if(r.model_name.includes(o)){i=Eg[o];break}i?(e.controlNets[n].processorType=i,e.controlNets[n].processorNode=wu[i].default):(e.controlNets[n].processorType="none",e.controlNets[n].processorNode=wu.none.default)}},controlNetWeightChanged:(e,t)=>{const{controlNetId:n,weight:r}=t.payload;e.controlNets[n].weight=r},controlNetBeginStepPctChanged:(e,t)=>{const{controlNetId:n,beginStepPct:r}=t.payload;e.controlNets[n].beginStepPct=r},controlNetEndStepPctChanged:(e,t)=>{const{controlNetId:n,endStepPct:r}=t.payload;e.controlNets[n].endStepPct=r},controlNetControlModeChanged:(e,t)=>{const{controlNetId:n,controlMode:r}=t.payload;e.controlNets[n].controlMode=r},controlNetProcessorParamsChanged:(e,t)=>{const{controlNetId:n,changes:r}=t.payload,i=e.controlNets[n].processorNode;e.controlNets[n].processorNode={...i,...r},e.controlNets[n].shouldAutoConfig=!1},controlNetProcessorTypeChanged:(e,t)=>{const{controlNetId:n,processorType:r}=t.payload;e.controlNets[n].processedControlImage=null,e.controlNets[n].processorType=r,e.controlNets[n].processorNode=wu[r].default,e.controlNets[n].shouldAutoConfig=!1},controlNetAutoConfigToggled:(e,t)=>{var i;const{controlNetId:n}=t.payload,r=!e.controlNets[n].shouldAutoConfig;if(r){let o;for(const s in Eg)if((i=e.controlNets[n].model)!=null&&i.model_name.includes(s)){o=Eg[s];break}o?(e.controlNets[n].processorType=o,e.controlNets[n].processorNode=wu[o].default):(e.controlNets[n].processorType="none",e.controlNets[n].processorNode=wu.none.default)}e.controlNets[n].shouldAutoConfig=r},controlNetReset:()=>({...Qw})},extraReducers:e=>{e.addCase(w3,(t,n)=>{t.controlNets[n.payload.controlNetId].controlImage!==null&&t.pendingControlImages.push(n.payload.controlNetId)}),e.addCase(Lc.pending,(t,n)=>{const{image_name:r}=n.meta.arg;_l(t.controlNets,i=>{i.controlImage===r&&(i.controlImage=null,i.processedControlImage=null),i.processedControlImage===r&&(i.processedControlImage=null)})}),e.addCase(_3,(t,n)=>{t.pendingControlImages=[]}),e.addMatcher(lL,(t,n)=>{t.pendingControlImages=[]})}}),{isControlNetEnabledToggled:ske,controlNetAdded:ake,controlNetDuplicated:lke,controlNetAddedFromImage:uke,controlNetRemoved:t$,controlNetImageChanged:x3,controlNetProcessedImageChanged:Vpe,controlNetToggled:cke,controlNetModelChanged:Ak,controlNetWeightChanged:dke,controlNetBeginStepPctChanged:fke,controlNetEndStepPctChanged:hke,controlNetControlModeChanged:pke,controlNetProcessorParamsChanged:zpe,controlNetProcessorTypeChanged:Upe,controlNetReset:n$,controlNetAutoConfigToggled:Ok}=e$.actions,Gpe=e$.reducer,Hpe=e=>e.controlNet,r$={isEnabled:!1,maxPrompts:100,combinatorial:!0},qpe=r$,i$=Vt({name:"dynamicPrompts",initialState:qpe,reducers:{maxPromptsChanged:(e,t)=>{e.maxPrompts=t.payload},maxPromptsReset:e=>{e.maxPrompts=r$.maxPrompts},combinatorialToggled:e=>{e.combinatorial=!e.combinatorial},isEnabledToggled:e=>{e.isEnabled=!e.isEnabled}},extraReducers:e=>{}}),{isEnabledToggled:gke,maxPromptsChanged:mke,maxPromptsReset:yke,combinatorialToggled:vke}=i$.actions,Wpe=i$.reducer,Kpe={updateBoardModalOpen:!1,searchText:""},o$=Vt({name:"boards",initialState:Kpe,reducers:{setBoardSearchText:(e,t)=>{e.searchText=t.payload},setUpdateBoardModalOpen:(e,t)=>{e.updateBoardModalOpen=t.payload}}}),{setBoardSearchText:bke,setUpdateBoardModalOpen:Ske}=o$.actions,Ype=o$.reducer,Xpe={imageToDelete:null,isModalOpen:!1},s$=Vt({name:"imageDeletion",initialState:Xpe,reducers:{isModalOpenChanged:(e,t)=>{e.isModalOpen=t.payload},imageToDeleteSelected:(e,t)=>{e.imageToDelete=t.payload},imageToDeleteCleared:e=>{e.imageToDelete=null,e.isModalOpen=!1}}}),{isModalOpenChanged:a$,imageToDeleteSelected:Qpe,imageToDeleteCleared:_ke}=s$.actions,Zpe=s$.reducer,Jpe=at([e=>e],({imageDeletion:e,generation:t,canvas:n,nodes:r,controlNet:i})=>{var f;const{imageToDelete:o}=e;if(!o)return;const{image_name:s}=o,a=((f=t.initialImage)==null?void 0:f.imageName)===s,l=n.layerState.objects.some(h=>h.kind==="image"&&h.imageName===s),u=r.nodes.some(h=>Xs(h.data.inputs,p=>{var m;return p.type==="image"&&((m=p.value)==null?void 0:m.image_name)===s})),c=Xs(i.controlNets,h=>h.controlImage===s||h.processedControlImage===s);return{isInitialImage:a,isCanvasImage:l,isNodesImage:u,isControlNetImage:c}},_s),l$=ge("imageDeletion/imageDeletionConfirmed"),Rk={weight:.75},ege={loras:{}},u$=Vt({name:"lora",initialState:ege,reducers:{loraAdded:(e,t)=>{const{model_name:n,id:r,base_model:i}=t.payload;e.loras[r]={id:r,model_name:n,base_model:i,...Rk}},loraRemoved:(e,t)=>{const n=t.payload;delete e.loras[n]},lorasCleared:e=>{e.loras={}},loraWeightChanged:(e,t)=>{const{id:n,weight:r}=t.payload;e.loras[n].weight=r},loraWeightReset:(e,t)=>{const n=t.payload;e.loras[n].weight=Rk.weight}}}),{loraAdded:wke,loraRemoved:c$,loraWeightChanged:xke,loraWeightReset:Cke,lorasCleared:Tke}=u$.actions,tge=u$.reducer;function _i(e){if(typeof e=="string"||typeof e=="number")return""+e;let t="";if(Array.isArray(e))for(let n=0,r;n{let t;const n=new Set,r=(l,u)=>{const c=typeof l=="function"?l(t):l;if(!Object.is(c,t)){const d=t;t=u??typeof c!="object"?c:Object.assign({},t,c),n.forEach(f=>f(t,d))}},i=()=>t,a={setState:r,getState:i,subscribe:l=>(n.add(l),()=>n.delete(l)),destroy:()=>{n.clear()}};return t=e(r,i,a),a},nge=e=>e?Ik(e):Ik,{useSyncExternalStoreWithSelector:rge}=tG;function ige(e,t=e.getState,n){const r=rge(e.subscribe,e.getState,e.getServerState||e.getState,t,n);return E.useDebugValue(r),r}function Mr(e,t){if(Object.is(e,t))return!0;if(typeof e!="object"||e===null||typeof t!="object"||t===null)return!1;if(e instanceof Map&&t instanceof Map){if(e.size!==t.size)return!1;for(const[r,i]of e)if(!Object.is(i,t.get(r)))return!1;return!0}if(e instanceof Set&&t instanceof Set){if(e.size!==t.size)return!1;for(const r of e)if(!t.has(r))return!1;return!0}const n=Object.keys(e);if(n.length!==Object.keys(t).length)return!1;for(let r=0;r{}};function b1(){for(var e=0,t=arguments.length,n={},r;e=0&&(r=n.slice(i+1),n=n.slice(0,i)),n&&!t.hasOwnProperty(n))throw new Error("unknown type: "+n);return{type:n,name:r}})}Em.prototype=b1.prototype={constructor:Em,on:function(e,t){var n=this._,r=sge(e+"",n),i,o=-1,s=r.length;if(arguments.length<2){for(;++o0)for(var n=new Array(i),r=0,i,o;r=0&&(t=e.slice(0,n))!=="xmlns"&&(e=e.slice(n+1)),Nk.hasOwnProperty(t)?{space:Nk[t],local:e}:e}function lge(e){return function(){var t=this.ownerDocument,n=this.namespaceURI;return n===Zw&&t.documentElement.namespaceURI===Zw?t.createElement(e):t.createElementNS(n,e)}}function uge(e){return function(){return this.ownerDocument.createElementNS(e.space,e.local)}}function d$(e){var t=S1(e);return(t.local?uge:lge)(t)}function cge(){}function C3(e){return e==null?cge:function(){return this.querySelector(e)}}function dge(e){typeof e!="function"&&(e=C3(e));for(var t=this._groups,n=t.length,r=new Array(n),i=0;i=g&&(g=y+1);!(_=S[g])&&++g=0;)(s=r[i])&&(o&&s.compareDocumentPosition(o)^4&&o.parentNode.insertBefore(s,o),o=s);return this}function Lge(e){e||(e=$ge);function t(d,f){return d&&f?e(d.__data__,f.__data__):!d-!f}for(var n=this._groups,r=n.length,i=new Array(r),o=0;ot?1:e>=t?0:NaN}function Fge(){var e=arguments[0];return arguments[0]=this,e.apply(null,arguments),this}function Bge(){return Array.from(this)}function jge(){for(var e=this._groups,t=0,n=e.length;t1?this.each((t==null?Qge:typeof t=="function"?Jge:Zge)(e,t,n??"")):$c(this.node(),e)}function $c(e,t){return e.style.getPropertyValue(t)||m$(e).getComputedStyle(e,null).getPropertyValue(t)}function tme(e){return function(){delete this[e]}}function nme(e,t){return function(){this[e]=t}}function rme(e,t){return function(){var n=t.apply(this,arguments);n==null?delete this[e]:this[e]=n}}function ime(e,t){return arguments.length>1?this.each((t==null?tme:typeof t=="function"?rme:nme)(e,t)):this.node()[e]}function y$(e){return e.trim().split(/^|\s+/)}function T3(e){return e.classList||new v$(e)}function v$(e){this._node=e,this._names=y$(e.getAttribute("class")||"")}v$.prototype={add:function(e){var t=this._names.indexOf(e);t<0&&(this._names.push(e),this._node.setAttribute("class",this._names.join(" ")))},remove:function(e){var t=this._names.indexOf(e);t>=0&&(this._names.splice(t,1),this._node.setAttribute("class",this._names.join(" ")))},contains:function(e){return this._names.indexOf(e)>=0}};function b$(e,t){for(var n=T3(e),r=-1,i=t.length;++r=0&&(n=t.slice(r+1),t=t.slice(0,r)),{type:t,name:n}})}function Ime(e){return function(){var t=this.__on;if(t){for(var n=0,r=-1,i=t.length,o;n()=>e;function Jw(e,{sourceEvent:t,subject:n,target:r,identifier:i,active:o,x:s,y:a,dx:l,dy:u,dispatch:c}){Object.defineProperties(this,{type:{value:e,enumerable:!0,configurable:!0},sourceEvent:{value:t,enumerable:!0,configurable:!0},subject:{value:n,enumerable:!0,configurable:!0},target:{value:r,enumerable:!0,configurable:!0},identifier:{value:i,enumerable:!0,configurable:!0},active:{value:o,enumerable:!0,configurable:!0},x:{value:s,enumerable:!0,configurable:!0},y:{value:a,enumerable:!0,configurable:!0},dx:{value:l,enumerable:!0,configurable:!0},dy:{value:u,enumerable:!0,configurable:!0},_:{value:c}})}Jw.prototype.on=function(){var e=this._.on.apply(this._,arguments);return e===this._?this:e};function zme(e){return!e.ctrlKey&&!e.button}function Ume(){return this.parentNode}function Gme(e,t){return t??{x:e.x,y:e.y}}function Hme(){return navigator.maxTouchPoints||"ontouchstart"in this}function qme(){var e=zme,t=Ume,n=Gme,r=Hme,i={},o=b1("start","drag","end"),s=0,a,l,u,c,d=0;function f(b){b.on("mousedown.drag",h).filter(r).on("touchstart.drag",S).on("touchmove.drag",v,Vme).on("touchend.drag touchcancel.drag",y).style("touch-action","none").style("-webkit-tap-highlight-color","rgba(0,0,0,0)")}function h(b,_){if(!(c||!e.call(this,b,_))){var w=g(this,t.call(this,b,_),b,_,"mouse");w&&(Ai(b.view).on("mousemove.drag",p,Ph).on("mouseup.drag",m,Ph),x$(b.view),p_(b),u=!1,a=b.clientX,l=b.clientY,w("start",b))}}function p(b){if(oc(b),!u){var _=b.clientX-a,w=b.clientY-l;u=_*_+w*w>d}i.mouse("drag",b)}function m(b){Ai(b.view).on("mousemove.drag mouseup.drag",null),C$(b.view,u),oc(b),i.mouse("end",b)}function S(b,_){if(e.call(this,b,_)){var w=b.changedTouches,x=t.call(this,b,_),C=w.length,k,P;for(k=0;k>8&15|t>>4&240,t>>4&15|t&240,(t&15)<<4|t&15,1):n===8?kg(t>>24&255,t>>16&255,t>>8&255,(t&255)/255):n===4?kg(t>>12&15|t>>8&240,t>>8&15|t>>4&240,t>>4&15|t&240,((t&15)<<4|t&15)/255):null):(t=Kme.exec(e))?new Cr(t[1],t[2],t[3],1):(t=Yme.exec(e))?new Cr(t[1]*255/100,t[2]*255/100,t[3]*255/100,1):(t=Xme.exec(e))?kg(t[1],t[2],t[3],t[4]):(t=Qme.exec(e))?kg(t[1]*255/100,t[2]*255/100,t[3]*255/100,t[4]):(t=Zme.exec(e))?Vk(t[1],t[2]/100,t[3]/100,1):(t=Jme.exec(e))?Vk(t[1],t[2]/100,t[3]/100,t[4]):Dk.hasOwnProperty(e)?Fk(Dk[e]):e==="transparent"?new Cr(NaN,NaN,NaN,0):null}function Fk(e){return new Cr(e>>16&255,e>>8&255,e&255,1)}function kg(e,t,n,r){return r<=0&&(e=t=n=NaN),new Cr(e,t,n,r)}function nye(e){return e instanceof kp||(e=Oh(e)),e?(e=e.rgb(),new Cr(e.r,e.g,e.b,e.opacity)):new Cr}function ex(e,t,n,r){return arguments.length===1?nye(e):new Cr(e,t,n,r??1)}function Cr(e,t,n,r){this.r=+e,this.g=+t,this.b=+n,this.opacity=+r}E3(Cr,ex,T$(kp,{brighter(e){return e=e==null?Zy:Math.pow(Zy,e),new Cr(this.r*e,this.g*e,this.b*e,this.opacity)},darker(e){return e=e==null?kh:Math.pow(kh,e),new Cr(this.r*e,this.g*e,this.b*e,this.opacity)},rgb(){return this},clamp(){return new Cr(pl(this.r),pl(this.g),pl(this.b),Jy(this.opacity))},displayable(){return-.5<=this.r&&this.r<255.5&&-.5<=this.g&&this.g<255.5&&-.5<=this.b&&this.b<255.5&&0<=this.opacity&&this.opacity<=1},hex:Bk,formatHex:Bk,formatHex8:rye,formatRgb:jk,toString:jk}));function Bk(){return`#${il(this.r)}${il(this.g)}${il(this.b)}`}function rye(){return`#${il(this.r)}${il(this.g)}${il(this.b)}${il((isNaN(this.opacity)?1:this.opacity)*255)}`}function jk(){const e=Jy(this.opacity);return`${e===1?"rgb(":"rgba("}${pl(this.r)}, ${pl(this.g)}, ${pl(this.b)}${e===1?")":`, ${e})`}`}function Jy(e){return isNaN(e)?1:Math.max(0,Math.min(1,e))}function pl(e){return Math.max(0,Math.min(255,Math.round(e)||0))}function il(e){return e=pl(e),(e<16?"0":"")+e.toString(16)}function Vk(e,t,n,r){return r<=0?e=t=n=NaN:n<=0||n>=1?e=t=NaN:t<=0&&(e=NaN),new Oi(e,t,n,r)}function E$(e){if(e instanceof Oi)return new Oi(e.h,e.s,e.l,e.opacity);if(e instanceof kp||(e=Oh(e)),!e)return new Oi;if(e instanceof Oi)return e;e=e.rgb();var t=e.r/255,n=e.g/255,r=e.b/255,i=Math.min(t,n,r),o=Math.max(t,n,r),s=NaN,a=o-i,l=(o+i)/2;return a?(t===o?s=(n-r)/a+(n0&&l<1?0:s,new Oi(s,a,l,e.opacity)}function iye(e,t,n,r){return arguments.length===1?E$(e):new Oi(e,t,n,r??1)}function Oi(e,t,n,r){this.h=+e,this.s=+t,this.l=+n,this.opacity=+r}E3(Oi,iye,T$(kp,{brighter(e){return e=e==null?Zy:Math.pow(Zy,e),new Oi(this.h,this.s,this.l*e,this.opacity)},darker(e){return e=e==null?kh:Math.pow(kh,e),new Oi(this.h,this.s,this.l*e,this.opacity)},rgb(){var e=this.h%360+(this.h<0)*360,t=isNaN(e)||isNaN(this.s)?0:this.s,n=this.l,r=n+(n<.5?n:1-n)*t,i=2*n-r;return new Cr(g_(e>=240?e-240:e+120,i,r),g_(e,i,r),g_(e<120?e+240:e-120,i,r),this.opacity)},clamp(){return new Oi(zk(this.h),Ag(this.s),Ag(this.l),Jy(this.opacity))},displayable(){return(0<=this.s&&this.s<=1||isNaN(this.s))&&0<=this.l&&this.l<=1&&0<=this.opacity&&this.opacity<=1},formatHsl(){const e=Jy(this.opacity);return`${e===1?"hsl(":"hsla("}${zk(this.h)}, ${Ag(this.s)*100}%, ${Ag(this.l)*100}%${e===1?")":`, ${e})`}`}}));function zk(e){return e=(e||0)%360,e<0?e+360:e}function Ag(e){return Math.max(0,Math.min(1,e||0))}function g_(e,t,n){return(e<60?t+(n-t)*e/60:e<180?n:e<240?t+(n-t)*(240-e)/60:t)*255}const P$=e=>()=>e;function oye(e,t){return function(n){return e+n*t}}function sye(e,t,n){return e=Math.pow(e,n),t=Math.pow(t,n)-e,n=1/n,function(r){return Math.pow(e+r*t,n)}}function aye(e){return(e=+e)==1?k$:function(t,n){return n-t?sye(t,n,e):P$(isNaN(t)?n:t)}}function k$(e,t){var n=t-e;return n?oye(e,n):P$(isNaN(e)?t:e)}const Uk=function e(t){var n=aye(t);function r(i,o){var s=n((i=ex(i)).r,(o=ex(o)).r),a=n(i.g,o.g),l=n(i.b,o.b),u=k$(i.opacity,o.opacity);return function(c){return i.r=s(c),i.g=a(c),i.b=l(c),i.opacity=u(c),i+""}}return r.gamma=e,r}(1);function js(e,t){return e=+e,t=+t,function(n){return e*(1-n)+t*n}}var tx=/[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g,m_=new RegExp(tx.source,"g");function lye(e){return function(){return e}}function uye(e){return function(t){return e(t)+""}}function cye(e,t){var n=tx.lastIndex=m_.lastIndex=0,r,i,o,s=-1,a=[],l=[];for(e=e+"",t=t+"";(r=tx.exec(e))&&(i=m_.exec(t));)(o=i.index)>n&&(o=t.slice(n,o),a[s]?a[s]+=o:a[++s]=o),(r=r[0])===(i=i[0])?a[s]?a[s]+=i:a[++s]=i:(a[++s]=null,l.push({i:s,x:js(r,i)})),n=m_.lastIndex;return n180?c+=360:c-u>180&&(u+=360),f.push({i:d.push(i(d)+"rotate(",null,r)-2,x:js(u,c)})):c&&d.push(i(d)+"rotate("+c+r)}function a(u,c,d,f){u!==c?f.push({i:d.push(i(d)+"skewX(",null,r)-2,x:js(u,c)}):c&&d.push(i(d)+"skewX("+c+r)}function l(u,c,d,f,h,p){if(u!==d||c!==f){var m=h.push(i(h)+"scale(",null,",",null,")");p.push({i:m-4,x:js(u,d)},{i:m-2,x:js(c,f)})}else(d!==1||f!==1)&&h.push(i(h)+"scale("+d+","+f+")")}return function(u,c){var d=[],f=[];return u=e(u),c=e(c),o(u.translateX,u.translateY,c.translateX,c.translateY,d,f),s(u.rotate,c.rotate,d,f),a(u.skewX,c.skewX,d,f),l(u.scaleX,u.scaleY,c.scaleX,c.scaleY,d,f),u=c=null,function(h){for(var p=-1,m=f.length,S;++p=0&&e._call.call(void 0,t),e=e._next;--Fc}function qk(){kl=(t0=Rh.now())+_1,Fc=Xd=0;try{Sye()}finally{Fc=0,wye(),kl=0}}function _ye(){var e=Rh.now(),t=e-t0;t>R$&&(_1-=t,t0=e)}function wye(){for(var e,t=e0,n,r=1/0;t;)t._call?(r>t._time&&(r=t._time),e=t,t=t._next):(n=t._next,t._next=null,t=e?e._next=n:e0=n);Qd=e,rx(r)}function rx(e){if(!Fc){Xd&&(Xd=clearTimeout(Xd));var t=e-kl;t>24?(e<1/0&&(Xd=setTimeout(qk,e-Rh.now()-_1)),kd&&(kd=clearInterval(kd))):(kd||(t0=Rh.now(),kd=setInterval(_ye,R$)),Fc=1,I$(qk))}}function Wk(e,t,n){var r=new n0;return t=t==null?0:+t,r.restart(i=>{r.stop(),e(i+t)},t,n),r}var xye=b1("start","end","cancel","interrupt"),Cye=[],N$=0,Kk=1,ix=2,Pm=3,Yk=4,ox=5,km=6;function w1(e,t,n,r,i,o){var s=e.__transition;if(!s)e.__transition={};else if(n in s)return;Tye(e,n,{name:t,index:r,group:i,on:xye,tween:Cye,time:o.time,delay:o.delay,duration:o.duration,ease:o.ease,timer:null,state:N$})}function k3(e,t){var n=Ui(e,t);if(n.state>N$)throw new Error("too late; already scheduled");return n}function Mo(e,t){var n=Ui(e,t);if(n.state>Pm)throw new Error("too late; already running");return n}function Ui(e,t){var n=e.__transition;if(!n||!(n=n[t]))throw new Error("transition not found");return n}function Tye(e,t,n){var r=e.__transition,i;r[t]=n,n.timer=M$(o,0,n.time);function o(u){n.state=Kk,n.timer.restart(s,n.delay,n.time),n.delay<=u&&s(u-n.delay)}function s(u){var c,d,f,h;if(n.state!==Kk)return l();for(c in r)if(h=r[c],h.name===n.name){if(h.state===Pm)return Wk(s);h.state===Yk?(h.state=km,h.timer.stop(),h.on.call("interrupt",e,e.__data__,h.index,h.group),delete r[c]):+cix&&r.state=0&&(t=t.slice(0,n)),!t||t==="start"})}function t0e(e,t,n){var r,i,o=e0e(t)?k3:Mo;return function(){var s=o(this,e),a=s.on;a!==r&&(i=(r=a).copy()).on(t,n),s.on=i}}function n0e(e,t){var n=this._id;return arguments.length<2?Ui(this.node(),n).on.on(e):this.each(t0e(n,e,t))}function r0e(e){return function(){var t=this.parentNode;for(var n in this.__transition)if(+n!==e)return;t&&t.removeChild(this)}}function i0e(){return this.on("end.remove",r0e(this._id))}function o0e(e){var t=this._name,n=this._id;typeof e!="function"&&(e=C3(e));for(var r=this._groups,i=r.length,o=new Array(i),s=0;s()=>e;function O0e(e,{sourceEvent:t,target:n,transform:r,dispatch:i}){Object.defineProperties(this,{type:{value:e,enumerable:!0,configurable:!0},sourceEvent:{value:t,enumerable:!0,configurable:!0},target:{value:n,enumerable:!0,configurable:!0},transform:{value:r,enumerable:!0,configurable:!0},_:{value:i}})}function ts(e,t,n){this.k=e,this.x=t,this.y=n}ts.prototype={constructor:ts,scale:function(e){return e===1?this:new ts(this.k*e,this.x,this.y)},translate:function(e,t){return e===0&t===0?this:new ts(this.k,this.x+this.k*e,this.y+this.k*t)},apply:function(e){return[e[0]*this.k+this.x,e[1]*this.k+this.y]},applyX:function(e){return e*this.k+this.x},applyY:function(e){return e*this.k+this.y},invert:function(e){return[(e[0]-this.x)/this.k,(e[1]-this.y)/this.k]},invertX:function(e){return(e-this.x)/this.k},invertY:function(e){return(e-this.y)/this.k},rescaleX:function(e){return e.copy().domain(e.range().map(this.invertX,this).map(e.invert,e))},rescaleY:function(e){return e.copy().domain(e.range().map(this.invertY,this).map(e.invert,e))},toString:function(){return"translate("+this.x+","+this.y+") scale("+this.k+")"}};var ca=new ts(1,0,0);ts.prototype;function y_(e){e.stopImmediatePropagation()}function Ad(e){e.preventDefault(),e.stopImmediatePropagation()}function R0e(e){return(!e.ctrlKey||e.type==="wheel")&&!e.button}function I0e(){var e=this;return e instanceof SVGElement?(e=e.ownerSVGElement||e,e.hasAttribute("viewBox")?(e=e.viewBox.baseVal,[[e.x,e.y],[e.x+e.width,e.y+e.height]]):[[0,0],[e.width.baseVal.value,e.height.baseVal.value]]):[[0,0],[e.clientWidth,e.clientHeight]]}function Xk(){return this.__zoom||ca}function M0e(e){return-e.deltaY*(e.deltaMode===1?.05:e.deltaMode?1:.002)*(e.ctrlKey?10:1)}function N0e(){return navigator.maxTouchPoints||"ontouchstart"in this}function D0e(e,t,n){var r=e.invertX(t[0][0])-n[0][0],i=e.invertX(t[1][0])-n[1][0],o=e.invertY(t[0][1])-n[0][1],s=e.invertY(t[1][1])-n[1][1];return e.translate(i>r?(r+i)/2:Math.min(0,r)||Math.max(0,i),s>o?(o+s)/2:Math.min(0,o)||Math.max(0,s))}function L0e(){var e=R0e,t=I0e,n=D0e,r=M0e,i=N0e,o=[0,1/0],s=[[-1/0,-1/0],[1/0,1/0]],a=250,l=vye,u=b1("start","zoom","end"),c,d,f,h=500,p=150,m=0,S=10;function v(T){T.property("__zoom",Xk).on("wheel.zoom",C,{passive:!1}).on("mousedown.zoom",k).on("dblclick.zoom",P).filter(i).on("touchstart.zoom",A).on("touchmove.zoom",$).on("touchend.zoom touchcancel.zoom",N).style("-webkit-tap-highlight-color","rgba(0,0,0,0)")}v.transform=function(T,O,I,M){var R=T.selection?T.selection():T;R.property("__zoom",Xk),T!==R?_(T,O,I,M):R.interrupt().each(function(){w(this,arguments).event(M).start().zoom(null,typeof O=="function"?O.apply(this,arguments):O).end()})},v.scaleBy=function(T,O,I,M){v.scaleTo(T,function(){var R=this.__zoom.k,D=typeof O=="function"?O.apply(this,arguments):O;return R*D},I,M)},v.scaleTo=function(T,O,I,M){v.transform(T,function(){var R=t.apply(this,arguments),D=this.__zoom,L=I==null?b(R):typeof I=="function"?I.apply(this,arguments):I,V=D.invert(L),z=typeof O=="function"?O.apply(this,arguments):O;return n(g(y(D,z),L,V),R,s)},I,M)},v.translateBy=function(T,O,I,M){v.transform(T,function(){return n(this.__zoom.translate(typeof O=="function"?O.apply(this,arguments):O,typeof I=="function"?I.apply(this,arguments):I),t.apply(this,arguments),s)},null,M)},v.translateTo=function(T,O,I,M,R){v.transform(T,function(){var D=t.apply(this,arguments),L=this.__zoom,V=M==null?b(D):typeof M=="function"?M.apply(this,arguments):M;return n(ca.translate(V[0],V[1]).scale(L.k).translate(typeof O=="function"?-O.apply(this,arguments):-O,typeof I=="function"?-I.apply(this,arguments):-I),D,s)},M,R)};function y(T,O){return O=Math.max(o[0],Math.min(o[1],O)),O===T.k?T:new ts(O,T.x,T.y)}function g(T,O,I){var M=O[0]-I[0]*T.k,R=O[1]-I[1]*T.k;return M===T.x&&R===T.y?T:new ts(T.k,M,R)}function b(T){return[(+T[0][0]+ +T[1][0])/2,(+T[0][1]+ +T[1][1])/2]}function _(T,O,I,M){T.on("start.zoom",function(){w(this,arguments).event(M).start()}).on("interrupt.zoom end.zoom",function(){w(this,arguments).event(M).end()}).tween("zoom",function(){var R=this,D=arguments,L=w(R,D).event(M),V=t.apply(R,D),z=I==null?b(V):typeof I=="function"?I.apply(R,D):I,U=Math.max(V[1][0]-V[0][0],V[1][1]-V[0][1]),K=R.__zoom,W=typeof O=="function"?O.apply(R,D):O,X=l(K.invert(z).concat(U/K.k),W.invert(z).concat(U/W.k));return function(F){if(F===1)F=W;else{var q=X(F),Q=U/q[2];F=new ts(Q,z[0]-q[0]*Q,z[1]-q[1]*Q)}L.zoom(null,F)}})}function w(T,O,I){return!I&&T.__zooming||new x(T,O)}function x(T,O){this.that=T,this.args=O,this.active=0,this.sourceEvent=null,this.extent=t.apply(T,O),this.taps=0}x.prototype={event:function(T){return T&&(this.sourceEvent=T),this},start:function(){return++this.active===1&&(this.that.__zooming=this,this.emit("start")),this},zoom:function(T,O){return this.mouse&&T!=="mouse"&&(this.mouse[1]=O.invert(this.mouse[0])),this.touch0&&T!=="touch"&&(this.touch0[1]=O.invert(this.touch0[0])),this.touch1&&T!=="touch"&&(this.touch1[1]=O.invert(this.touch1[0])),this.that.__zoom=O,this.emit("zoom"),this},end:function(){return--this.active===0&&(delete this.that.__zooming,this.emit("end")),this},emit:function(T){var O=Ai(this.that).datum();u.call(T,this.that,new O0e(T,{sourceEvent:this.sourceEvent,target:v,type:T,transform:this.that.__zoom,dispatch:u}),O)}};function C(T,...O){if(!e.apply(this,arguments))return;var I=w(this,O).event(T),M=this.__zoom,R=Math.max(o[0],Math.min(o[1],M.k*Math.pow(2,r.apply(this,arguments)))),D=Xi(T);if(I.wheel)(I.mouse[0][0]!==D[0]||I.mouse[0][1]!==D[1])&&(I.mouse[1]=M.invert(I.mouse[0]=D)),clearTimeout(I.wheel);else{if(M.k===R)return;I.mouse=[D,M.invert(D)],Am(this),I.start()}Ad(T),I.wheel=setTimeout(L,p),I.zoom("mouse",n(g(y(M,R),I.mouse[0],I.mouse[1]),I.extent,s));function L(){I.wheel=null,I.end()}}function k(T,...O){if(f||!e.apply(this,arguments))return;var I=T.currentTarget,M=w(this,O,!0).event(T),R=Ai(T.view).on("mousemove.zoom",z,!0).on("mouseup.zoom",U,!0),D=Xi(T,I),L=T.clientX,V=T.clientY;x$(T.view),y_(T),M.mouse=[D,this.__zoom.invert(D)],Am(this),M.start();function z(K){if(Ad(K),!M.moved){var W=K.clientX-L,X=K.clientY-V;M.moved=W*W+X*X>m}M.event(K).zoom("mouse",n(g(M.that.__zoom,M.mouse[0]=Xi(K,I),M.mouse[1]),M.extent,s))}function U(K){R.on("mousemove.zoom mouseup.zoom",null),C$(K.view,M.moved),Ad(K),M.event(K).end()}}function P(T,...O){if(e.apply(this,arguments)){var I=this.__zoom,M=Xi(T.changedTouches?T.changedTouches[0]:T,this),R=I.invert(M),D=I.k*(T.shiftKey?.5:2),L=n(g(y(I,D),M,R),t.apply(this,O),s);Ad(T),a>0?Ai(this).transition().duration(a).call(_,L,M,T):Ai(this).call(v.transform,L,M,T)}}function A(T,...O){if(e.apply(this,arguments)){var I=T.touches,M=I.length,R=w(this,O,T.changedTouches.length===M).event(T),D,L,V,z;for(y_(T),L=0;L"[React Flow]: Seems like you have not used zustand provider as an ancestor. Help: https://reactflow.dev/error#001",error002:()=>"It looks like you've created a new nodeTypes or edgeTypes object. If this wasn't on purpose please define the nodeTypes/edgeTypes outside of the component or memoize them.",error003:e=>`Node type "${e}" not found. Using fallback type "default".`,error004:()=>"The React Flow parent container needs a width and a height to render the graph.",error005:()=>"Only child nodes can use a parent extent.",error006:()=>"Can't create edge. An edge needs a source and a target.",error007:e=>`The old edge with id=${e} does not exist.`,error009:e=>`Marker type "${e}" doesn't exist.`,error008:(e,t)=>`Couldn't create edge for ${e?"target":"source"} handle id: "${e?t.targetHandle:t.sourceHandle}", edge id: ${t.id}.`,error010:()=>"Handle: No node id found. Make sure to only use a Handle inside a custom Node.",error011:e=>`Edge type "${e}" not found. Using fallback type "default".`},F$=wa.error001();function Kt(e,t){const n=E.useContext(x1);if(n===null)throw new Error(F$);return ige(n,e,t)}const er=()=>{const e=E.useContext(x1);if(e===null)throw new Error(F$);return E.useMemo(()=>({getState:e.getState,setState:e.setState,subscribe:e.subscribe,destroy:e.destroy}),[e])},F0e=e=>e.userSelectionActive?"none":"all";function B0e({position:e,children:t,className:n,style:r,...i}){const o=Kt(F0e),s=`${e}`.split("-");return j.jsx("div",{className:_i(["react-flow__panel",n,...s]),style:{...r,pointerEvents:o},...i,children:t})}function j0e({proOptions:e,position:t="bottom-right"}){return e!=null&&e.hideAttribution?null:j.jsx(B0e,{position:t,className:"react-flow__attribution","data-message":"Please only hide this attribution when you are subscribed to React Flow Pro: https://pro.reactflow.dev",children:j.jsx("a",{href:"https://reactflow.dev",target:"_blank",rel:"noopener noreferrer","aria-label":"React Flow attribution",children:"React Flow"})})}const V0e=({x:e,y:t,label:n,labelStyle:r={},labelShowBg:i=!0,labelBgStyle:o={},labelBgPadding:s=[2,4],labelBgBorderRadius:a=2,children:l,className:u,...c})=>{const d=E.useRef(null),[f,h]=E.useState({x:0,y:0,width:0,height:0}),p=_i(["react-flow__edge-textwrapper",u]);return E.useEffect(()=>{if(d.current){const m=d.current.getBBox();h({x:m.x,y:m.y,width:m.width,height:m.height})}},[n]),typeof n>"u"||!n?null:j.jsxs("g",{transform:`translate(${e-f.width/2} ${t-f.height/2})`,className:p,visibility:f.width?"visible":"hidden",...c,children:[i&&j.jsx("rect",{width:f.width+2*s[0],x:-s[0],y:-s[1],height:f.height+2*s[1],className:"react-flow__edge-textbg",style:o,rx:a,ry:a}),j.jsx("text",{className:"react-flow__edge-text",y:f.height/2,dy:"0.3em",ref:d,style:r,children:n}),l]})};var z0e=E.memo(V0e);const O3=e=>({width:e.offsetWidth,height:e.offsetHeight}),Bc=(e,t=0,n=1)=>Math.min(Math.max(e,t),n),R3=(e={x:0,y:0},t)=>({x:Bc(e.x,t[0][0],t[1][0]),y:Bc(e.y,t[0][1],t[1][1])}),Qk=(e,t,n)=>en?-Bc(Math.abs(e-n),1,50)/50:0,B$=(e,t)=>{const n=Qk(e.x,35,t.width-35)*20,r=Qk(e.y,35,t.height-35)*20;return[n,r]},j$=e=>{var t;return((t=e.getRootNode)==null?void 0:t.call(e))||(window==null?void 0:window.document)},V$=(e,t)=>({x:Math.min(e.x,t.x),y:Math.min(e.y,t.y),x2:Math.max(e.x2,t.x2),y2:Math.max(e.y2,t.y2)}),r0=({x:e,y:t,width:n,height:r})=>({x:e,y:t,x2:e+n,y2:t+r}),z$=({x:e,y:t,x2:n,y2:r})=>({x:e,y:t,width:n-e,height:r-t}),Zk=e=>({...e.positionAbsolute||{x:0,y:0},width:e.width||0,height:e.height||0}),Eke=(e,t)=>z$(V$(r0(e),r0(t))),sx=(e,t)=>{const n=Math.max(0,Math.min(e.x+e.width,t.x+t.width)-Math.max(e.x,t.x)),r=Math.max(0,Math.min(e.y+e.height,t.y+t.height)-Math.max(e.y,t.y));return Math.ceil(n*r)},U0e=e=>ci(e.width)&&ci(e.height)&&ci(e.x)&&ci(e.y),ci=e=>!isNaN(e)&&isFinite(e),hn=Symbol.for("internals"),U$=["Enter"," ","Escape"],G0e=(e,t)=>{},H0e=e=>"nativeEvent"in e;function ax(e){var i,o;const t=H0e(e)?e.nativeEvent:e,n=((o=(i=t.composedPath)==null?void 0:i.call(t))==null?void 0:o[0])||e.target;return["INPUT","SELECT","TEXTAREA"].includes(n==null?void 0:n.nodeName)||(n==null?void 0:n.hasAttribute("contenteditable"))||!!(n!=null&&n.closest(".nokey"))}const G$=e=>"clientX"in e,da=(e,t)=>{var o,s;const n=G$(e),r=n?e.clientX:(o=e.touches)==null?void 0:o[0].clientX,i=n?e.clientY:(s=e.touches)==null?void 0:s[0].clientY;return{x:r-((t==null?void 0:t.left)??0),y:i-((t==null?void 0:t.top)??0)}},Ap=({id:e,path:t,labelX:n,labelY:r,label:i,labelStyle:o,labelShowBg:s,labelBgStyle:a,labelBgPadding:l,labelBgBorderRadius:u,style:c,markerEnd:d,markerStart:f,interactionWidth:h=20})=>j.jsxs(j.Fragment,{children:[j.jsx("path",{id:e,style:c,d:t,fill:"none",className:"react-flow__edge-path",markerEnd:d,markerStart:f}),h&&j.jsx("path",{d:t,fill:"none",strokeOpacity:0,strokeWidth:h,className:"react-flow__edge-interaction"}),i&&ci(n)&&ci(r)?j.jsx(z0e,{x:n,y:r,label:i,labelStyle:o,labelShowBg:s,labelBgStyle:a,labelBgPadding:l,labelBgBorderRadius:u}):null]});Ap.displayName="BaseEdge";function Od(e,t,n){return n===void 0?n:r=>{const i=t().edges.find(o=>o.id===e);i&&n(r,{...i})}}function H$({sourceX:e,sourceY:t,targetX:n,targetY:r}){const i=Math.abs(n-e)/2,o=n{const[S,v,y]=W$({sourceX:e,sourceY:t,sourcePosition:i,targetX:n,targetY:r,targetPosition:o});return j.jsx(Ap,{path:S,labelX:v,labelY:y,label:s,labelStyle:a,labelShowBg:l,labelBgStyle:u,labelBgPadding:c,labelBgBorderRadius:d,style:f,markerEnd:h,markerStart:p,interactionWidth:m})});I3.displayName="SimpleBezierEdge";const e8={[ye.Left]:{x:-1,y:0},[ye.Right]:{x:1,y:0},[ye.Top]:{x:0,y:-1},[ye.Bottom]:{x:0,y:1}},q0e=({source:e,sourcePosition:t=ye.Bottom,target:n})=>t===ye.Left||t===ye.Right?e.xMath.sqrt(Math.pow(t.x-e.x,2)+Math.pow(t.y-e.y,2));function W0e({source:e,sourcePosition:t=ye.Bottom,target:n,targetPosition:r=ye.Top,center:i,offset:o}){const s=e8[t],a=e8[r],l={x:e.x+s.x*o,y:e.y+s.y*o},u={x:n.x+a.x*o,y:n.y+a.y*o},c=q0e({source:l,sourcePosition:t,target:u}),d=c.x!==0?"x":"y",f=c[d];let h=[],p,m;const[S,v,y,g]=H$({sourceX:e.x,sourceY:e.y,targetX:n.x,targetY:n.y});if(s[d]*a[d]===-1){p=i.x||S,m=i.y||v;const _=[{x:p,y:l.y},{x:p,y:u.y}],w=[{x:l.x,y:m},{x:u.x,y:m}];s[d]===f?h=d==="x"?_:w:h=d==="x"?w:_}else{const _=[{x:l.x,y:u.y}],w=[{x:u.x,y:l.y}];if(d==="x"?h=s.x===f?w:_:h=s.y===f?_:w,t!==r){const x=d==="x"?"y":"x",C=s[d]===a[x],k=l[x]>u[x],P=l[x]{let g="";return y>0&&y{const[v,y,g]=lx({sourceX:e,sourceY:t,sourcePosition:d,targetX:n,targetY:r,targetPosition:f,borderRadius:m==null?void 0:m.borderRadius,offset:m==null?void 0:m.offset});return j.jsx(Ap,{path:v,labelX:y,labelY:g,label:i,labelStyle:o,labelShowBg:s,labelBgStyle:a,labelBgPadding:l,labelBgBorderRadius:u,style:c,markerEnd:h,markerStart:p,interactionWidth:S})});C1.displayName="SmoothStepEdge";const M3=E.memo(e=>{var t;return j.jsx(C1,{...e,pathOptions:E.useMemo(()=>{var n;return{borderRadius:0,offset:(n=e.pathOptions)==null?void 0:n.offset}},[(t=e.pathOptions)==null?void 0:t.offset])})});M3.displayName="StepEdge";function Y0e({sourceX:e,sourceY:t,targetX:n,targetY:r}){const[i,o,s,a]=H$({sourceX:e,sourceY:t,targetX:n,targetY:r});return[`M ${e},${t}L ${n},${r}`,i,o,s,a]}const N3=E.memo(({sourceX:e,sourceY:t,targetX:n,targetY:r,label:i,labelStyle:o,labelShowBg:s,labelBgStyle:a,labelBgPadding:l,labelBgBorderRadius:u,style:c,markerEnd:d,markerStart:f,interactionWidth:h})=>{const[p,m,S]=Y0e({sourceX:e,sourceY:t,targetX:n,targetY:r});return j.jsx(Ap,{path:p,labelX:m,labelY:S,label:i,labelStyle:o,labelShowBg:s,labelBgStyle:a,labelBgPadding:l,labelBgBorderRadius:u,style:c,markerEnd:d,markerStart:f,interactionWidth:h})});N3.displayName="StraightEdge";function Ig(e,t){return e>=0?.5*e:t*25*Math.sqrt(-e)}function n8({pos:e,x1:t,y1:n,x2:r,y2:i,c:o}){switch(e){case ye.Left:return[t-Ig(t-r,o),n];case ye.Right:return[t+Ig(r-t,o),n];case ye.Top:return[t,n-Ig(n-i,o)];case ye.Bottom:return[t,n+Ig(i-n,o)]}}function K$({sourceX:e,sourceY:t,sourcePosition:n=ye.Bottom,targetX:r,targetY:i,targetPosition:o=ye.Top,curvature:s=.25}){const[a,l]=n8({pos:n,x1:e,y1:t,x2:r,y2:i,c:s}),[u,c]=n8({pos:o,x1:r,y1:i,x2:e,y2:t,c:s}),[d,f,h,p]=q$({sourceX:e,sourceY:t,targetX:r,targetY:i,sourceControlX:a,sourceControlY:l,targetControlX:u,targetControlY:c});return[`M${e},${t} C${a},${l} ${u},${c} ${r},${i}`,d,f,h,p]}const o0=E.memo(({sourceX:e,sourceY:t,targetX:n,targetY:r,sourcePosition:i=ye.Bottom,targetPosition:o=ye.Top,label:s,labelStyle:a,labelShowBg:l,labelBgStyle:u,labelBgPadding:c,labelBgBorderRadius:d,style:f,markerEnd:h,markerStart:p,pathOptions:m,interactionWidth:S})=>{const[v,y,g]=K$({sourceX:e,sourceY:t,sourcePosition:i,targetX:n,targetY:r,targetPosition:o,curvature:m==null?void 0:m.curvature});return j.jsx(Ap,{path:v,labelX:y,labelY:g,label:s,labelStyle:a,labelShowBg:l,labelBgStyle:u,labelBgPadding:c,labelBgBorderRadius:d,style:f,markerEnd:h,markerStart:p,interactionWidth:S})});o0.displayName="BezierEdge";const D3=E.createContext(null),X0e=D3.Provider;D3.Consumer;const Q0e=()=>E.useContext(D3),Z0e=e=>"id"in e&&"source"in e&&"target"in e,J0e=({source:e,sourceHandle:t,target:n,targetHandle:r})=>`reactflow__edge-${e}${t||""}-${n}${r||""}`,ux=(e,t)=>typeof e>"u"?"":typeof e=="string"?e:`${t?`${t}__`:""}${Object.keys(e).sort().map(r=>`${r}=${e[r]}`).join("&")}`,eve=(e,t)=>t.some(n=>n.source===e.source&&n.target===e.target&&(n.sourceHandle===e.sourceHandle||!n.sourceHandle&&!e.sourceHandle)&&(n.targetHandle===e.targetHandle||!n.targetHandle&&!e.targetHandle)),Y$=(e,t)=>{if(!e.source||!e.target)return t;let n;return Z0e(e)?n={...e}:n={...e,id:J0e(e)},eve(n,t)?t:t.concat(n)},X$=({x:e,y:t},[n,r,i],o,[s,a])=>{const l={x:(e-n)/i,y:(t-r)/i};return o?{x:s*Math.round(l.x/s),y:a*Math.round(l.y/a)}:l},tve=({x:e,y:t},[n,r,i])=>({x:e*i+n,y:t*i+r}),lc=(e,t=[0,0])=>{if(!e)return{x:0,y:0,positionAbsolute:{x:0,y:0}};const n=(e.width??0)*t[0],r=(e.height??0)*t[1],i={x:e.position.x-n,y:e.position.y-r};return{...i,positionAbsolute:e.positionAbsolute?{x:e.positionAbsolute.x-n,y:e.positionAbsolute.y-r}:i}},Q$=(e,t=[0,0])=>{if(e.length===0)return{x:0,y:0,width:0,height:0};const n=e.reduce((r,i)=>{const{x:o,y:s}=lc(i,t).positionAbsolute;return V$(r,r0({x:o,y:s,width:i.width||0,height:i.height||0}))},{x:1/0,y:1/0,x2:-1/0,y2:-1/0});return z$(n)},Z$=(e,t,[n,r,i]=[0,0,1],o=!1,s=!1,a=[0,0])=>{const l={x:(t.x-n)/i,y:(t.y-r)/i,width:t.width/i,height:t.height/i},u=[];return e.forEach(c=>{const{width:d,height:f,selectable:h=!0,hidden:p=!1}=c;if(s&&!h||p)return!1;const{positionAbsolute:m}=lc(c,a),S={x:m.x,y:m.y,width:d||0,height:f||0},v=sx(l,S),y=typeof d>"u"||typeof f>"u"||d===null||f===null,g=o&&v>0,b=(d||0)*(f||0);(y||g||v>=b||c.dragging)&&u.push(c)}),u},J$=(e,t)=>{const n=e.map(r=>r.id);return t.filter(r=>n.includes(r.source)||n.includes(r.target))},eF=(e,t,n,r,i,o=.1)=>{const s=t/(e.width*(1+o)),a=n/(e.height*(1+o)),l=Math.min(s,a),u=Bc(l,r,i),c=e.x+e.width/2,d=e.y+e.height/2,f=t/2-c*u,h=n/2-d*u;return[f,h,u]},Ya=(e,t=0)=>e.transition().duration(t);function r8(e,t,n,r){return(t[n]||[]).reduce((i,o)=>{var s,a;return`${e.id}-${o.id}-${n}`!==r&&i.push({id:o.id||null,type:n,nodeId:e.id,x:(((s=e.positionAbsolute)==null?void 0:s.x)??0)+o.x+o.width/2,y:(((a=e.positionAbsolute)==null?void 0:a.y)??0)+o.y+o.height/2}),i},[])}function nve(e,t,n,r,i,o){const{x:s,y:a}=da(e),u=t.elementsFromPoint(s,a).find(p=>p.classList.contains("react-flow__handle"));if(u){const p=u.getAttribute("data-nodeid");if(p){const m=L3(void 0,u),S=u.getAttribute("data-handleid"),v=o({nodeId:p,id:S,type:m});if(v)return{handle:{id:S,type:m,nodeId:p,x:n.x,y:n.y},validHandleResult:v}}}let c=[],d=1/0;if(i.forEach(p=>{const m=Math.sqrt((p.x-n.x)**2+(p.y-n.y)**2);if(m<=r){const S=o(p);m<=d&&(mp.isValid),h=c.some(({handle:p})=>p.type==="target");return c.find(({handle:p,validHandleResult:m})=>h?p.type==="target":f?m.isValid:!0)||c[0]}const rve={source:null,target:null,sourceHandle:null,targetHandle:null},tF=()=>({handleDomNode:null,isValid:!1,connection:rve,endHandle:null});function nF(e,t,n,r,i,o,s){const a=i==="target",l=s.querySelector(`.react-flow__handle[data-id="${e==null?void 0:e.nodeId}-${e==null?void 0:e.id}-${e==null?void 0:e.type}"]`),u={...tF(),handleDomNode:l};if(l){const c=L3(void 0,l),d=l.getAttribute("data-nodeid"),f=l.getAttribute("data-handleid"),h=l.classList.contains("connectable"),p=l.classList.contains("connectableend"),m={source:a?d:n,sourceHandle:a?f:r,target:a?n:d,targetHandle:a?r:f};u.connection=m,h&&p&&(t===Al.Strict?a&&c==="source"||!a&&c==="target":d!==n||f!==r)&&(u.endHandle={nodeId:d,handleId:f,type:c},u.isValid=o(m))}return u}function ive({nodes:e,nodeId:t,handleId:n,handleType:r}){return e.reduce((i,o)=>{if(o[hn]){const{handleBounds:s}=o[hn];let a=[],l=[];s&&(a=r8(o,s,"source",`${t}-${n}-${r}`),l=r8(o,s,"target",`${t}-${n}-${r}`)),i.push(...a,...l)}return i},[])}function L3(e,t){return e||(t!=null&&t.classList.contains("target")?"target":t!=null&&t.classList.contains("source")?"source":null)}function v_(e){e==null||e.classList.remove("valid","connecting","react-flow__handle-valid","react-flow__handle-connecting")}function ove(e,t){let n=null;return t?n="valid":e&&!t&&(n="invalid"),n}function rF({event:e,handleId:t,nodeId:n,onConnect:r,isTarget:i,getState:o,setState:s,isValidConnection:a,edgeUpdaterType:l,onEdgeUpdateEnd:u}){const c=j$(e.target),{connectionMode:d,domNode:f,autoPanOnConnect:h,connectionRadius:p,onConnectStart:m,panBy:S,getNodes:v,cancelConnection:y}=o();let g=0,b;const{x:_,y:w}=da(e),x=c==null?void 0:c.elementFromPoint(_,w),C=L3(l,x),k=f==null?void 0:f.getBoundingClientRect();if(!k||!C)return;let P,A=da(e,k),$=!1,N=null,T=!1,O=null;const I=ive({nodes:v(),nodeId:n,handleId:t,handleType:C}),M=()=>{if(!h)return;const[L,V]=B$(A,k);S({x:L,y:V}),g=requestAnimationFrame(M)};s({connectionPosition:A,connectionStatus:null,connectionNodeId:n,connectionHandleId:t,connectionHandleType:C,connectionStartHandle:{nodeId:n,handleId:t,type:C},connectionEndHandle:null}),m==null||m(e,{nodeId:n,handleId:t,handleType:C});function R(L){const{transform:V}=o();A=da(L,k);const{handle:z,validHandleResult:U}=nve(L,c,X$(A,V,!1,[1,1]),p,I,K=>nF(K,d,n,t,i?"target":"source",a,c));if(b=z,$||(M(),$=!0),O=U.handleDomNode,N=U.connection,T=U.isValid,s({connectionPosition:b&&T?tve({x:b.x,y:b.y},V):A,connectionStatus:ove(!!b,T),connectionEndHandle:U.endHandle}),!b&&!T&&!O)return v_(P);N.source!==N.target&&O&&(v_(P),P=O,O.classList.add("connecting","react-flow__handle-connecting"),O.classList.toggle("valid",T),O.classList.toggle("react-flow__handle-valid",T))}function D(L){var V,z;(b||O)&&N&&T&&(r==null||r(N)),(z=(V=o()).onConnectEnd)==null||z.call(V,L),l&&(u==null||u(L)),v_(P),y(),cancelAnimationFrame(g),$=!1,T=!1,N=null,O=null,c.removeEventListener("mousemove",R),c.removeEventListener("mouseup",D),c.removeEventListener("touchmove",R),c.removeEventListener("touchend",D)}c.addEventListener("mousemove",R),c.addEventListener("mouseup",D),c.addEventListener("touchmove",R),c.addEventListener("touchend",D)}const i8=()=>!0,sve=e=>({connectionStartHandle:e.connectionStartHandle,connectOnClick:e.connectOnClick,noPanClassName:e.noPanClassName}),ave=(e,t,n)=>r=>{const{connectionStartHandle:i,connectionEndHandle:o,connectionClickStartHandle:s}=r;return{connecting:(i==null?void 0:i.nodeId)===e&&(i==null?void 0:i.handleId)===t&&(i==null?void 0:i.type)===n||(o==null?void 0:o.nodeId)===e&&(o==null?void 0:o.handleId)===t&&(o==null?void 0:o.type)===n,clickConnecting:(s==null?void 0:s.nodeId)===e&&(s==null?void 0:s.handleId)===t&&(s==null?void 0:s.type)===n}},iF=E.forwardRef(({type:e="source",position:t=ye.Top,isValidConnection:n,isConnectable:r=!0,isConnectableStart:i=!0,isConnectableEnd:o=!0,id:s,onConnect:a,children:l,className:u,onMouseDown:c,onTouchStart:d,...f},h)=>{var k,P;const p=s||null,m=e==="target",S=er(),v=Q0e(),{connectOnClick:y,noPanClassName:g}=Kt(sve,Mr),{connecting:b,clickConnecting:_}=Kt(ave(v,p,e),Mr);v||(P=(k=S.getState()).onError)==null||P.call(k,"010",wa.error010());const w=A=>{const{defaultEdgeOptions:$,onConnect:N,hasDefaultEdges:T}=S.getState(),O={...$,...A};if(T){const{edges:I,setEdges:M}=S.getState();M(Y$(O,I))}N==null||N(O),a==null||a(O)},x=A=>{if(!v)return;const $=G$(A);i&&($&&A.button===0||!$)&&rF({event:A,handleId:p,nodeId:v,onConnect:w,isTarget:m,getState:S.getState,setState:S.setState,isValidConnection:n||S.getState().isValidConnection||i8}),$?c==null||c(A):d==null||d(A)},C=A=>{const{onClickConnectStart:$,onClickConnectEnd:N,connectionClickStartHandle:T,connectionMode:O,isValidConnection:I}=S.getState();if(!v||!T&&!i)return;if(!T){$==null||$(A,{nodeId:v,handleId:p,handleType:e}),S.setState({connectionClickStartHandle:{nodeId:v,type:e,handleId:p}});return}const M=j$(A.target),R=n||I||i8,{connection:D,isValid:L}=nF({nodeId:v,id:p,type:e},O,T.nodeId,T.handleId||null,T.type,R,M);L&&w(D),N==null||N(A),S.setState({connectionClickStartHandle:null})};return j.jsx("div",{"data-handleid":p,"data-nodeid":v,"data-handlepos":t,"data-id":`${v}-${p}-${e}`,className:_i(["react-flow__handle",`react-flow__handle-${t}`,"nodrag",g,u,{source:!m,target:m,connectable:r,connectablestart:i,connectableend:o,connecting:_,connectionindicator:r&&(i&&!b||o&&b)}]),onMouseDown:x,onTouchStart:x,onClick:y?C:void 0,ref:h,...f,children:l})});iF.displayName="Handle";var s0=E.memo(iF);const oF=({data:e,isConnectable:t,targetPosition:n=ye.Top,sourcePosition:r=ye.Bottom})=>j.jsxs(j.Fragment,{children:[j.jsx(s0,{type:"target",position:n,isConnectable:t}),e==null?void 0:e.label,j.jsx(s0,{type:"source",position:r,isConnectable:t})]});oF.displayName="DefaultNode";var cx=E.memo(oF);const sF=({data:e,isConnectable:t,sourcePosition:n=ye.Bottom})=>j.jsxs(j.Fragment,{children:[e==null?void 0:e.label,j.jsx(s0,{type:"source",position:n,isConnectable:t})]});sF.displayName="InputNode";var aF=E.memo(sF);const lF=({data:e,isConnectable:t,targetPosition:n=ye.Top})=>j.jsxs(j.Fragment,{children:[j.jsx(s0,{type:"target",position:n,isConnectable:t}),e==null?void 0:e.label]});lF.displayName="OutputNode";var uF=E.memo(lF);const $3=()=>null;$3.displayName="GroupNode";const lve=e=>({selectedNodes:e.getNodes().filter(t=>t.selected),selectedEdges:e.edges.filter(t=>t.selected)}),Mg=e=>e.id;function uve(e,t){return Mr(e.selectedNodes.map(Mg),t.selectedNodes.map(Mg))&&Mr(e.selectedEdges.map(Mg),t.selectedEdges.map(Mg))}const cF=E.memo(({onSelectionChange:e})=>{const t=er(),{selectedNodes:n,selectedEdges:r}=Kt(lve,uve);return E.useEffect(()=>{var o,s;const i={nodes:n,edges:r};e==null||e(i),(s=(o=t.getState()).onSelectionChange)==null||s.call(o,i)},[n,r,e]),null});cF.displayName="SelectionListener";const cve=e=>!!e.onSelectionChange;function dve({onSelectionChange:e}){const t=Kt(cve);return e||t?j.jsx(cF,{onSelectionChange:e}):null}const fve=e=>({setNodes:e.setNodes,setEdges:e.setEdges,setDefaultNodesAndEdges:e.setDefaultNodesAndEdges,setMinZoom:e.setMinZoom,setMaxZoom:e.setMaxZoom,setTranslateExtent:e.setTranslateExtent,setNodeExtent:e.setNodeExtent,reset:e.reset});function lu(e,t){E.useEffect(()=>{typeof e<"u"&&t(e)},[e])}function Le(e,t,n){E.useEffect(()=>{typeof t<"u"&&n({[e]:t})},[t])}const hve=({nodes:e,edges:t,defaultNodes:n,defaultEdges:r,onConnect:i,onConnectStart:o,onConnectEnd:s,onClickConnectStart:a,onClickConnectEnd:l,nodesDraggable:u,nodesConnectable:c,nodesFocusable:d,edgesFocusable:f,edgesUpdatable:h,elevateNodesOnSelect:p,minZoom:m,maxZoom:S,nodeExtent:v,onNodesChange:y,onEdgesChange:g,elementsSelectable:b,connectionMode:_,snapGrid:w,snapToGrid:x,translateExtent:C,connectOnClick:k,defaultEdgeOptions:P,fitView:A,fitViewOptions:$,onNodesDelete:N,onEdgesDelete:T,onNodeDrag:O,onNodeDragStart:I,onNodeDragStop:M,onSelectionDrag:R,onSelectionDragStart:D,onSelectionDragStop:L,noPanClassName:V,nodeOrigin:z,rfId:U,autoPanOnConnect:K,autoPanOnNodeDrag:W,onError:X,connectionRadius:F,isValidConnection:q})=>{const{setNodes:Q,setEdges:J,setDefaultNodesAndEdges:ne,setMinZoom:Z,setMaxZoom:me,setTranslateExtent:ae,setNodeExtent:oe,reset:Ce}=Kt(fve,Mr),se=er();return E.useEffect(()=>{const qe=r==null?void 0:r.map(yt=>({...yt,...P}));return ne(n,qe),()=>{Ce()}},[]),Le("defaultEdgeOptions",P,se.setState),Le("connectionMode",_,se.setState),Le("onConnect",i,se.setState),Le("onConnectStart",o,se.setState),Le("onConnectEnd",s,se.setState),Le("onClickConnectStart",a,se.setState),Le("onClickConnectEnd",l,se.setState),Le("nodesDraggable",u,se.setState),Le("nodesConnectable",c,se.setState),Le("nodesFocusable",d,se.setState),Le("edgesFocusable",f,se.setState),Le("edgesUpdatable",h,se.setState),Le("elementsSelectable",b,se.setState),Le("elevateNodesOnSelect",p,se.setState),Le("snapToGrid",x,se.setState),Le("snapGrid",w,se.setState),Le("onNodesChange",y,se.setState),Le("onEdgesChange",g,se.setState),Le("connectOnClick",k,se.setState),Le("fitViewOnInit",A,se.setState),Le("fitViewOnInitOptions",$,se.setState),Le("onNodesDelete",N,se.setState),Le("onEdgesDelete",T,se.setState),Le("onNodeDrag",O,se.setState),Le("onNodeDragStart",I,se.setState),Le("onNodeDragStop",M,se.setState),Le("onSelectionDrag",R,se.setState),Le("onSelectionDragStart",D,se.setState),Le("onSelectionDragStop",L,se.setState),Le("noPanClassName",V,se.setState),Le("nodeOrigin",z,se.setState),Le("rfId",U,se.setState),Le("autoPanOnConnect",K,se.setState),Le("autoPanOnNodeDrag",W,se.setState),Le("onError",X,se.setState),Le("connectionRadius",F,se.setState),Le("isValidConnection",q,se.setState),lu(e,Q),lu(t,J),lu(m,Z),lu(S,me),lu(C,ae),lu(v,oe),null},o8={display:"none"},pve={position:"absolute",width:1,height:1,margin:-1,border:0,padding:0,overflow:"hidden",clip:"rect(0px, 0px, 0px, 0px)",clipPath:"inset(100%)"},dF="react-flow__node-desc",fF="react-flow__edge-desc",gve="react-flow__aria-live",mve=e=>e.ariaLiveMessage;function yve({rfId:e}){const t=Kt(mve);return j.jsx("div",{id:`${gve}-${e}`,"aria-live":"assertive","aria-atomic":"true",style:pve,children:t})}function vve({rfId:e,disableKeyboardA11y:t}){return j.jsxs(j.Fragment,{children:[j.jsxs("div",{id:`${dF}-${e}`,style:o8,children:["Press enter or space to select a node.",!t&&"You can then use the arrow keys to move the node around."," Press delete to remove it and escape to cancel."," "]}),j.jsx("div",{id:`${fF}-${e}`,style:o8,children:"Press enter or space to select an edge. You can then press delete to remove it or escape to cancel."}),!t&&j.jsx(yve,{rfId:e})]})}const bve=(e,t,n)=>n===ye.Left?e-t:n===ye.Right?e+t:e,Sve=(e,t,n)=>n===ye.Top?e-t:n===ye.Bottom?e+t:e,s8="react-flow__edgeupdater",a8=({position:e,centerX:t,centerY:n,radius:r=10,onMouseDown:i,onMouseEnter:o,onMouseOut:s,type:a})=>j.jsx("circle",{onMouseDown:i,onMouseEnter:o,onMouseOut:s,className:_i([s8,`${s8}-${a}`]),cx:bve(t,r,e),cy:Sve(n,r,e),r,stroke:"transparent",fill:"transparent"}),_ve=()=>!0;var uu=e=>{const t=({id:n,className:r,type:i,data:o,onClick:s,onEdgeDoubleClick:a,selected:l,animated:u,label:c,labelStyle:d,labelShowBg:f,labelBgStyle:h,labelBgPadding:p,labelBgBorderRadius:m,style:S,source:v,target:y,sourceX:g,sourceY:b,targetX:_,targetY:w,sourcePosition:x,targetPosition:C,elementsSelectable:k,hidden:P,sourceHandleId:A,targetHandleId:$,onContextMenu:N,onMouseEnter:T,onMouseMove:O,onMouseLeave:I,edgeUpdaterRadius:M,onEdgeUpdate:R,onEdgeUpdateStart:D,onEdgeUpdateEnd:L,markerEnd:V,markerStart:z,rfId:U,ariaLabel:K,isFocusable:W,isUpdatable:X,pathOptions:F,interactionWidth:q})=>{const Q=E.useRef(null),[J,ne]=E.useState(!1),[Z,me]=E.useState(!1),ae=er(),oe=E.useMemo(()=>`url(#${ux(z,U)})`,[z,U]),Ce=E.useMemo(()=>`url(#${ux(V,U)})`,[V,U]);if(P)return null;const se=Te=>{const{edges:Me,addSelectedEdges:ie}=ae.getState();if(k&&(ae.setState({nodesSelectionActive:!1}),ie([n])),s){const pe=Me.find(Qt=>Qt.id===n);s(Te,pe)}},qe=Od(n,ae.getState,a),yt=Od(n,ae.getState,N),$e=Od(n,ae.getState,T),Fe=Od(n,ae.getState,O),Ie=Od(n,ae.getState,I),nt=(Te,Me)=>{if(Te.button!==0)return;const{edges:ie,isValidConnection:pe}=ae.getState(),Qt=Me?y:v,Rt=(Me?$:A)||null,ut=Me?"target":"source",nr=pe||_ve,Lo=Me,Xr=ie.find(We=>We.id===n);me(!0),D==null||D(Te,Xr,ut);const $o=We=>{me(!1),L==null||L(We,Xr,ut)};rF({event:Te,handleId:Rt,nodeId:Qt,onConnect:We=>R==null?void 0:R(Xr,We),isTarget:Lo,getState:ae.getState,setState:ae.setState,isValidConnection:nr,edgeUpdaterType:ut,onEdgeUpdateEnd:$o})},xt=Te=>nt(Te,!0),yn=Te=>nt(Te,!1),an=()=>ne(!0),Ot=()=>ne(!1),ee=!k&&!s,Se=Te=>{var Me;if(U$.includes(Te.key)&&k){const{unselectNodesAndEdges:ie,addSelectedEdges:pe,edges:Qt}=ae.getState();Te.key==="Escape"?((Me=Q.current)==null||Me.blur(),ie({edges:[Qt.find(ut=>ut.id===n)]})):pe([n])}};return j.jsxs("g",{className:_i(["react-flow__edge",`react-flow__edge-${i}`,r,{selected:l,animated:u,inactive:ee,updating:J}]),onClick:se,onDoubleClick:qe,onContextMenu:yt,onMouseEnter:$e,onMouseMove:Fe,onMouseLeave:Ie,onKeyDown:W?Se:void 0,tabIndex:W?0:void 0,role:W?"button":void 0,"data-testid":`rf__edge-${n}`,"aria-label":K===null?void 0:K||`Edge from ${v} to ${y}`,"aria-describedby":W?`${fF}-${U}`:void 0,ref:Q,children:[!Z&&j.jsx(e,{id:n,source:v,target:y,selected:l,animated:u,label:c,labelStyle:d,labelShowBg:f,labelBgStyle:h,labelBgPadding:p,labelBgBorderRadius:m,data:o,style:S,sourceX:g,sourceY:b,targetX:_,targetY:w,sourcePosition:x,targetPosition:C,sourceHandleId:A,targetHandleId:$,markerStart:oe,markerEnd:Ce,pathOptions:F,interactionWidth:q}),X&&j.jsxs(j.Fragment,{children:[(X==="source"||X===!0)&&j.jsx(a8,{position:x,centerX:g,centerY:b,radius:M,onMouseDown:xt,onMouseEnter:an,onMouseOut:Ot,type:"source"}),(X==="target"||X===!0)&&j.jsx(a8,{position:C,centerX:_,centerY:w,radius:M,onMouseDown:yn,onMouseEnter:an,onMouseOut:Ot,type:"target"})]})]})};return t.displayName="EdgeWrapper",E.memo(t)};function wve(e){const t={default:uu(e.default||o0),straight:uu(e.bezier||N3),step:uu(e.step||M3),smoothstep:uu(e.step||C1),simplebezier:uu(e.simplebezier||I3)},n={},r=Object.keys(e).filter(i=>!["default","bezier"].includes(i)).reduce((i,o)=>(i[o]=uu(e[o]||o0),i),n);return{...t,...r}}function l8(e,t,n=null){const r=((n==null?void 0:n.x)||0)+t.x,i=((n==null?void 0:n.y)||0)+t.y,o=(n==null?void 0:n.width)||t.width,s=(n==null?void 0:n.height)||t.height;switch(e){case ye.Top:return{x:r+o/2,y:i};case ye.Right:return{x:r+o,y:i+s/2};case ye.Bottom:return{x:r+o/2,y:i+s};case ye.Left:return{x:r,y:i+s/2}}}function u8(e,t){return e?e.length===1||!t?e[0]:t&&e.find(n=>n.id===t)||null:null}const xve=(e,t,n,r,i,o)=>{const s=l8(n,e,t),a=l8(o,r,i);return{sourceX:s.x,sourceY:s.y,targetX:a.x,targetY:a.y}};function Cve({sourcePos:e,targetPos:t,sourceWidth:n,sourceHeight:r,targetWidth:i,targetHeight:o,width:s,height:a,transform:l}){const u={x:Math.min(e.x,t.x),y:Math.min(e.y,t.y),x2:Math.max(e.x+n,t.x+i),y2:Math.max(e.y+r,t.y+o)};u.x===u.x2&&(u.x2+=1),u.y===u.y2&&(u.y2+=1);const c=r0({x:(0-l[0])/l[2],y:(0-l[1])/l[2],width:s/l[2],height:a/l[2]}),d=Math.max(0,Math.min(c.x2,u.x2)-Math.max(c.x,u.x)),f=Math.max(0,Math.min(c.y2,u.y2)-Math.max(c.y,u.y));return Math.ceil(d*f)>0}function c8(e){var r,i,o,s,a;const t=((r=e==null?void 0:e[hn])==null?void 0:r.handleBounds)||null,n=t&&(e==null?void 0:e.width)&&(e==null?void 0:e.height)&&typeof((i=e==null?void 0:e.positionAbsolute)==null?void 0:i.x)<"u"&&typeof((o=e==null?void 0:e.positionAbsolute)==null?void 0:o.y)<"u";return[{x:((s=e==null?void 0:e.positionAbsolute)==null?void 0:s.x)||0,y:((a=e==null?void 0:e.positionAbsolute)==null?void 0:a.y)||0,width:(e==null?void 0:e.width)||0,height:(e==null?void 0:e.height)||0},t,!!n]}function hF(e,t){if(!e.parentNode)return!1;const n=t.get(e.parentNode);return n?n.selected?!0:hF(n,t):!1}function d8(e,t,n){let r=e;do{if(r!=null&&r.matches(t))return!0;if(r===n.current)return!1;r=r.parentElement}while(r);return!1}function Tve(e,t,n,r){return Array.from(e.values()).filter(i=>(i.selected||i.id===r)&&(!i.parentNode||!hF(i,e))&&(i.draggable||t&&typeof i.draggable>"u")).map(i=>{var o,s;return{id:i.id,position:i.position||{x:0,y:0},positionAbsolute:i.positionAbsolute||{x:0,y:0},distance:{x:n.x-(((o=i.positionAbsolute)==null?void 0:o.x)??0),y:n.y-(((s=i.positionAbsolute)==null?void 0:s.y)??0)},delta:{x:0,y:0},extent:i.extent,parentNode:i.parentNode,width:i.width,height:i.height}})}function Eve(e,t){return!t||t==="parent"?t:[t[0],[t[1][0]-(e.width||0),t[1][1]-(e.height||0)]]}function pF(e,t,n,r,i=[0,0],o){const s=Eve(e,e.extent||r);let a=s;if(e.extent==="parent")if(e.parentNode&&e.width&&e.height){const c=n.get(e.parentNode),{x:d,y:f}=lc(c,i).positionAbsolute;a=c&&ci(d)&&ci(f)&&ci(c.width)&&ci(c.height)?[[d+e.width*i[0],f+e.height*i[1]],[d+c.width-e.width+e.width*i[0],f+c.height-e.height+e.height*i[1]]]:a}else o==null||o("005",wa.error005()),a=s;else if(e.extent&&e.parentNode){const c=n.get(e.parentNode),{x:d,y:f}=lc(c,i).positionAbsolute;a=[[e.extent[0][0]+d,e.extent[0][1]+f],[e.extent[1][0]+d,e.extent[1][1]+f]]}let l={x:0,y:0};if(e.parentNode){const c=n.get(e.parentNode);l=lc(c,i).positionAbsolute}const u=a?R3(t,a):t;return{position:{x:u.x-l.x,y:u.y-l.y},positionAbsolute:u}}function b_({nodeId:e,dragItems:t,nodeInternals:n}){const r=t.map(i=>({...n.get(i.id),position:i.position,positionAbsolute:i.positionAbsolute}));return[e?r.find(i=>i.id===e):r[0],r]}const f8=(e,t,n,r)=>{const i=t.querySelectorAll(e);if(!i||!i.length)return null;const o=Array.from(i),s=t.getBoundingClientRect(),a={x:s.width*r[0],y:s.height*r[1]};return o.map(l=>{const u=l.getBoundingClientRect();return{id:l.getAttribute("data-handleid"),position:l.getAttribute("data-handlepos"),x:(u.left-s.left-a.x)/n,y:(u.top-s.top-a.y)/n,...O3(l)}})};function Rd(e,t,n){return n===void 0?n:r=>{const i=t().nodeInternals.get(e);n(r,{...i})}}function dx({id:e,store:t,unselect:n=!1,nodeRef:r}){const{addSelectedNodes:i,unselectNodesAndEdges:o,multiSelectionActive:s,nodeInternals:a}=t.getState(),l=a.get(e);t.setState({nodesSelectionActive:!1}),l.selected?(n||l.selected&&s)&&(o({nodes:[l]}),requestAnimationFrame(()=>{var u;return(u=r==null?void 0:r.current)==null?void 0:u.blur()})):i([e])}function Pve(){const e=er();return E.useCallback(({sourceEvent:n})=>{const{transform:r,snapGrid:i,snapToGrid:o}=e.getState(),s=n.touches?n.touches[0].clientX:n.clientX,a=n.touches?n.touches[0].clientY:n.clientY,l={x:(s-r[0])/r[2],y:(a-r[1])/r[2]};return{xSnapped:o?i[0]*Math.round(l.x/i[0]):l.x,ySnapped:o?i[1]*Math.round(l.y/i[1]):l.y,...l}},[])}function S_(e){return(t,n,r)=>e==null?void 0:e(t,r)}function gF({nodeRef:e,disabled:t=!1,noDragClassName:n,handleSelector:r,nodeId:i,isSelectable:o,selectNodesOnDrag:s}){const a=er(),[l,u]=E.useState(!1),c=E.useRef([]),d=E.useRef({x:null,y:null}),f=E.useRef(0),h=E.useRef(null),p=E.useRef({x:0,y:0}),m=E.useRef(null),S=E.useRef(!1),v=Pve();return E.useEffect(()=>{if(e!=null&&e.current){const y=Ai(e.current),g=({x:_,y:w})=>{const{nodeInternals:x,onNodeDrag:C,onSelectionDrag:k,updateNodePositions:P,nodeExtent:A,snapGrid:$,snapToGrid:N,nodeOrigin:T,onError:O}=a.getState();d.current={x:_,y:w};let I=!1;if(c.current=c.current.map(R=>{const D={x:_-R.distance.x,y:w-R.distance.y};N&&(D.x=$[0]*Math.round(D.x/$[0]),D.y=$[1]*Math.round(D.y/$[1]));const L=pF(R,D,x,A,T,O);return I=I||R.position.x!==L.position.x||R.position.y!==L.position.y,R.position=L.position,R.positionAbsolute=L.positionAbsolute,R}),!I)return;P(c.current,!0,!0),u(!0);const M=i?C:S_(k);if(M&&m.current){const[R,D]=b_({nodeId:i,dragItems:c.current,nodeInternals:x});M(m.current,R,D)}},b=()=>{if(!h.current)return;const[_,w]=B$(p.current,h.current);if(_!==0||w!==0){const{transform:x,panBy:C}=a.getState();d.current.x=(d.current.x??0)-_/x[2],d.current.y=(d.current.y??0)-w/x[2],C({x:_,y:w})&&g(d.current)}f.current=requestAnimationFrame(b)};if(t)y.on(".drag",null);else{const _=qme().on("start",w=>{var I;const{nodeInternals:x,multiSelectionActive:C,domNode:k,nodesDraggable:P,unselectNodesAndEdges:A,onNodeDragStart:$,onSelectionDragStart:N}=a.getState(),T=i?$:S_(N);!s&&!C&&i&&((I=x.get(i))!=null&&I.selected||A()),i&&o&&s&&dx({id:i,store:a,nodeRef:e});const O=v(w);if(d.current=O,c.current=Tve(x,P,O,i),T&&c.current){const[M,R]=b_({nodeId:i,dragItems:c.current,nodeInternals:x});T(w.sourceEvent,M,R)}h.current=(k==null?void 0:k.getBoundingClientRect())||null,p.current=da(w.sourceEvent,h.current)}).on("drag",w=>{const x=v(w),{autoPanOnNodeDrag:C}=a.getState();!S.current&&C&&(S.current=!0,b()),(d.current.x!==x.xSnapped||d.current.y!==x.ySnapped)&&c.current&&(m.current=w.sourceEvent,p.current=da(w.sourceEvent,h.current),g(x))}).on("end",w=>{if(u(!1),S.current=!1,cancelAnimationFrame(f.current),c.current){const{updateNodePositions:x,nodeInternals:C,onNodeDragStop:k,onSelectionDragStop:P}=a.getState(),A=i?k:S_(P);if(x(c.current,!1,!1),A){const[$,N]=b_({nodeId:i,dragItems:c.current,nodeInternals:C});A(w.sourceEvent,$,N)}}}).filter(w=>{const x=w.target;return!w.button&&(!n||!d8(x,`.${n}`,e))&&(!r||d8(x,r,e))});return y.call(_),()=>{y.on(".drag",null)}}}},[e,t,n,r,o,a,i,s,v]),l}function mF(){const e=er();return E.useCallback(n=>{const{nodeInternals:r,nodeExtent:i,updateNodePositions:o,getNodes:s,snapToGrid:a,snapGrid:l,onError:u,nodesDraggable:c}=e.getState(),d=s().filter(y=>y.selected&&(y.draggable||c&&typeof y.draggable>"u")),f=a?l[0]:5,h=a?l[1]:5,p=n.isShiftPressed?4:1,m=n.x*f*p,S=n.y*h*p,v=d.map(y=>{if(y.positionAbsolute){const g={x:y.positionAbsolute.x+m,y:y.positionAbsolute.y+S};a&&(g.x=l[0]*Math.round(g.x/l[0]),g.y=l[1]*Math.round(g.y/l[1]));const{positionAbsolute:b,position:_}=pF(y,g,r,i,void 0,u);y.position=_,y.positionAbsolute=b}return y});o(v,!0,!1)},[])}const uc={ArrowUp:{x:0,y:-1},ArrowDown:{x:0,y:1},ArrowLeft:{x:-1,y:0},ArrowRight:{x:1,y:0}};var Id=e=>{const t=({id:n,type:r,data:i,xPos:o,yPos:s,xPosOrigin:a,yPosOrigin:l,selected:u,onClick:c,onMouseEnter:d,onMouseMove:f,onMouseLeave:h,onContextMenu:p,onDoubleClick:m,style:S,className:v,isDraggable:y,isSelectable:g,isConnectable:b,isFocusable:_,selectNodesOnDrag:w,sourcePosition:x,targetPosition:C,hidden:k,resizeObserver:P,dragHandle:A,zIndex:$,isParent:N,noDragClassName:T,noPanClassName:O,initialized:I,disableKeyboardA11y:M,ariaLabel:R,rfId:D})=>{const L=er(),V=E.useRef(null),z=E.useRef(x),U=E.useRef(C),K=E.useRef(r),W=g||y||c||d||f||h,X=mF(),F=Rd(n,L.getState,d),q=Rd(n,L.getState,f),Q=Rd(n,L.getState,h),J=Rd(n,L.getState,p),ne=Rd(n,L.getState,m),Z=oe=>{if(g&&(!w||!y)&&dx({id:n,store:L,nodeRef:V}),c){const Ce=L.getState().nodeInternals.get(n);c(oe,{...Ce})}},me=oe=>{if(!ax(oe))if(U$.includes(oe.key)&&g){const Ce=oe.key==="Escape";dx({id:n,store:L,unselect:Ce,nodeRef:V})}else!M&&y&&u&&Object.prototype.hasOwnProperty.call(uc,oe.key)&&(L.setState({ariaLiveMessage:`Moved selected node ${oe.key.replace("Arrow","").toLowerCase()}. New position, x: ${~~o}, y: ${~~s}`}),X({x:uc[oe.key].x,y:uc[oe.key].y,isShiftPressed:oe.shiftKey}))};E.useEffect(()=>{if(V.current&&!k){const oe=V.current;return P==null||P.observe(oe),()=>P==null?void 0:P.unobserve(oe)}},[k]),E.useEffect(()=>{const oe=K.current!==r,Ce=z.current!==x,se=U.current!==C;V.current&&(oe||Ce||se)&&(oe&&(K.current=r),Ce&&(z.current=x),se&&(U.current=C),L.getState().updateNodeDimensions([{id:n,nodeElement:V.current,forceUpdate:!0}]))},[n,r,x,C]);const ae=gF({nodeRef:V,disabled:k||!y,noDragClassName:T,handleSelector:A,nodeId:n,isSelectable:g,selectNodesOnDrag:w});return k?null:j.jsx("div",{className:_i(["react-flow__node",`react-flow__node-${r}`,{[O]:y},v,{selected:u,selectable:g,parent:N,dragging:ae}]),ref:V,style:{zIndex:$,transform:`translate(${a}px,${l}px)`,pointerEvents:W?"all":"none",visibility:I?"visible":"hidden",...S},"data-id":n,"data-testid":`rf__node-${n}`,onMouseEnter:F,onMouseMove:q,onMouseLeave:Q,onContextMenu:J,onClick:Z,onDoubleClick:ne,onKeyDown:_?me:void 0,tabIndex:_?0:void 0,role:_?"button":void 0,"aria-describedby":M?void 0:`${dF}-${D}`,"aria-label":R,children:j.jsx(X0e,{value:n,children:j.jsx(e,{id:n,data:i,type:r,xPos:o,yPos:s,selected:u,isConnectable:b,sourcePosition:x,targetPosition:C,dragging:ae,dragHandle:A,zIndex:$})})})};return t.displayName="NodeWrapper",E.memo(t)};function kve(e){const t={input:Id(e.input||aF),default:Id(e.default||cx),output:Id(e.output||uF),group:Id(e.group||$3)},n={},r=Object.keys(e).filter(i=>!["input","default","output","group"].includes(i)).reduce((i,o)=>(i[o]=Id(e[o]||cx),i),n);return{...t,...r}}const Ave=({x:e,y:t,width:n,height:r,origin:i})=>!n||!r?{x:e,y:t}:i[0]<0||i[1]<0||i[0]>1||i[1]>1?{x:e,y:t}:{x:e-n*i[0],y:t-r*i[1]},Ove=typeof document<"u"?document:null;var Mh=(e=null,t={target:Ove})=>{const[n,r]=E.useState(!1),i=E.useRef(!1),o=E.useRef(new Set([])),[s,a]=E.useMemo(()=>{if(e!==null){const u=(Array.isArray(e)?e:[e]).filter(d=>typeof d=="string").map(d=>d.split("+")),c=u.reduce((d,f)=>d.concat(...f),[]);return[u,c]}return[[],[]]},[e]);return E.useEffect(()=>{var l,u;if(e!==null){const c=h=>{if(i.current=h.ctrlKey||h.metaKey||h.shiftKey,!i.current&&ax(h))return!1;const p=p8(h.code,a);o.current.add(h[p]),h8(s,o.current,!1)&&(h.preventDefault(),r(!0))},d=h=>{if(!i.current&&ax(h))return!1;const p=p8(h.code,a);h8(s,o.current,!0)?(r(!1),o.current.clear()):o.current.delete(h[p]),i.current=!1},f=()=>{o.current.clear(),r(!1)};return(l=t==null?void 0:t.target)==null||l.addEventListener("keydown",c),(u=t==null?void 0:t.target)==null||u.addEventListener("keyup",d),window.addEventListener("blur",f),()=>{var h,p;(h=t==null?void 0:t.target)==null||h.removeEventListener("keydown",c),(p=t==null?void 0:t.target)==null||p.removeEventListener("keyup",d),window.removeEventListener("blur",f)}}},[e,r]),n};function h8(e,t,n){return e.filter(r=>n||r.length===t.size).some(r=>r.every(i=>t.has(i)))}function p8(e,t){return t.includes(e)?"code":"key"}function yF(e,t,n,r){var s,a;if(!e.parentNode)return n;const i=t.get(e.parentNode),o=lc(i,r);return yF(i,t,{x:(n.x??0)+o.x,y:(n.y??0)+o.y,z:(((s=i[hn])==null?void 0:s.z)??0)>(n.z??0)?((a=i[hn])==null?void 0:a.z)??0:n.z??0},r)}function vF(e,t,n){e.forEach(r=>{var i;if(r.parentNode&&!e.has(r.parentNode))throw new Error(`Parent node ${r.parentNode} not found`);if(r.parentNode||n!=null&&n[r.id]){const{x:o,y:s,z:a}=yF(r,e,{...r.position,z:((i=r[hn])==null?void 0:i.z)??0},t);r.positionAbsolute={x:o,y:s},r[hn].z=a,n!=null&&n[r.id]&&(r[hn].isParent=!0)}})}function __(e,t,n,r){const i=new Map,o={},s=r?1e3:0;return e.forEach(a=>{var d;const l=(ci(a.zIndex)?a.zIndex:0)+(a.selected?s:0),u=t.get(a.id),c={width:u==null?void 0:u.width,height:u==null?void 0:u.height,...a,positionAbsolute:{x:a.position.x,y:a.position.y}};a.parentNode&&(c.parentNode=a.parentNode,o[a.parentNode]=!0),Object.defineProperty(c,hn,{enumerable:!1,value:{handleBounds:(d=u==null?void 0:u[hn])==null?void 0:d.handleBounds,z:l}}),i.set(a.id,c)}),vF(i,n,o),i}function bF(e,t={}){const{getNodes:n,width:r,height:i,minZoom:o,maxZoom:s,d3Zoom:a,d3Selection:l,fitViewOnInitDone:u,fitViewOnInit:c,nodeOrigin:d}=e(),f=t.initial&&!u&&c;if(a&&l&&(f||!t.initial)){const p=n().filter(S=>{var y;const v=t.includeHiddenNodes?S.width&&S.height:!S.hidden;return(y=t.nodes)!=null&&y.length?v&&t.nodes.some(g=>g.id===S.id):v}),m=p.every(S=>S.width&&S.height);if(p.length>0&&m){const S=Q$(p,d),[v,y,g]=eF(S,r,i,t.minZoom??o,t.maxZoom??s,t.padding??.1),b=ca.translate(v,y).scale(g);return typeof t.duration=="number"&&t.duration>0?a.transform(Ya(l,t.duration),b):a.transform(l,b),!0}}return!1}function Rve(e,t){return e.forEach(n=>{const r=t.get(n.id);r&&t.set(r.id,{...r,[hn]:r[hn],selected:n.selected})}),new Map(t)}function Ive(e,t){return t.map(n=>{const r=e.find(i=>i.id===n.id);return r&&(n.selected=r.selected),n})}function Ng({changedNodes:e,changedEdges:t,get:n,set:r}){const{nodeInternals:i,edges:o,onNodesChange:s,onEdgesChange:a,hasDefaultNodes:l,hasDefaultEdges:u}=n();e!=null&&e.length&&(l&&r({nodeInternals:Rve(e,i)}),s==null||s(e)),t!=null&&t.length&&(u&&r({edges:Ive(t,o)}),a==null||a(t))}const cu=()=>{},Mve={zoomIn:cu,zoomOut:cu,zoomTo:cu,getZoom:()=>1,setViewport:cu,getViewport:()=>({x:0,y:0,zoom:1}),fitView:()=>!1,setCenter:cu,fitBounds:cu,project:e=>e,viewportInitialized:!1},Nve=e=>({d3Zoom:e.d3Zoom,d3Selection:e.d3Selection}),Dve=()=>{const e=er(),{d3Zoom:t,d3Selection:n}=Kt(Nve,Mr);return E.useMemo(()=>n&&t?{zoomIn:i=>t.scaleBy(Ya(n,i==null?void 0:i.duration),1.2),zoomOut:i=>t.scaleBy(Ya(n,i==null?void 0:i.duration),1/1.2),zoomTo:(i,o)=>t.scaleTo(Ya(n,o==null?void 0:o.duration),i),getZoom:()=>e.getState().transform[2],setViewport:(i,o)=>{const[s,a,l]=e.getState().transform,u=ca.translate(i.x??s,i.y??a).scale(i.zoom??l);t.transform(Ya(n,o==null?void 0:o.duration),u)},getViewport:()=>{const[i,o,s]=e.getState().transform;return{x:i,y:o,zoom:s}},fitView:i=>bF(e.getState,i),setCenter:(i,o,s)=>{const{width:a,height:l,maxZoom:u}=e.getState(),c=typeof(s==null?void 0:s.zoom)<"u"?s.zoom:u,d=a/2-i*c,f=l/2-o*c,h=ca.translate(d,f).scale(c);t.transform(Ya(n,s==null?void 0:s.duration),h)},fitBounds:(i,o)=>{const{width:s,height:a,minZoom:l,maxZoom:u}=e.getState(),[c,d,f]=eF(i,s,a,l,u,(o==null?void 0:o.padding)??.1),h=ca.translate(c,d).scale(f);t.transform(Ya(n,o==null?void 0:o.duration),h)},project:i=>{const{transform:o,snapToGrid:s,snapGrid:a}=e.getState();return X$(i,o,s,a)},viewportInitialized:!0}:Mve,[t,n])};function SF(){const e=Dve(),t=er(),n=E.useCallback(()=>t.getState().getNodes().map(m=>({...m})),[]),r=E.useCallback(m=>t.getState().nodeInternals.get(m),[]),i=E.useCallback(()=>{const{edges:m=[]}=t.getState();return m.map(S=>({...S}))},[]),o=E.useCallback(m=>{const{edges:S=[]}=t.getState();return S.find(v=>v.id===m)},[]),s=E.useCallback(m=>{const{getNodes:S,setNodes:v,hasDefaultNodes:y,onNodesChange:g}=t.getState(),b=S(),_=typeof m=="function"?m(b):m;if(y)v(_);else if(g){const w=_.length===0?b.map(x=>({type:"remove",id:x.id})):_.map(x=>({item:x,type:"reset"}));g(w)}},[]),a=E.useCallback(m=>{const{edges:S=[],setEdges:v,hasDefaultEdges:y,onEdgesChange:g}=t.getState(),b=typeof m=="function"?m(S):m;if(y)v(b);else if(g){const _=b.length===0?S.map(w=>({type:"remove",id:w.id})):b.map(w=>({item:w,type:"reset"}));g(_)}},[]),l=E.useCallback(m=>{const S=Array.isArray(m)?m:[m],{getNodes:v,setNodes:y,hasDefaultNodes:g,onNodesChange:b}=t.getState();if(g){const w=[...v(),...S];y(w)}else if(b){const _=S.map(w=>({item:w,type:"add"}));b(_)}},[]),u=E.useCallback(m=>{const S=Array.isArray(m)?m:[m],{edges:v=[],setEdges:y,hasDefaultEdges:g,onEdgesChange:b}=t.getState();if(g)y([...v,...S]);else if(b){const _=S.map(w=>({item:w,type:"add"}));b(_)}},[]),c=E.useCallback(()=>{const{getNodes:m,edges:S=[],transform:v}=t.getState(),[y,g,b]=v;return{nodes:m().map(_=>({..._})),edges:S.map(_=>({..._})),viewport:{x:y,y:g,zoom:b}}},[]),d=E.useCallback(({nodes:m,edges:S})=>{const{nodeInternals:v,getNodes:y,edges:g,hasDefaultNodes:b,hasDefaultEdges:_,onNodesDelete:w,onEdgesDelete:x,onNodesChange:C,onEdgesChange:k}=t.getState(),P=(m||[]).map(O=>O.id),A=(S||[]).map(O=>O.id),$=y().reduce((O,I)=>{const M=!P.includes(I.id)&&I.parentNode&&O.find(D=>D.id===I.parentNode);return(typeof I.deletable=="boolean"?I.deletable:!0)&&(P.includes(I.id)||M)&&O.push(I),O},[]),N=g.filter(O=>typeof O.deletable=="boolean"?O.deletable:!0),T=N.filter(O=>A.includes(O.id));if($||T){const O=J$($,N),I=[...T,...O],M=I.reduce((R,D)=>(R.includes(D.id)||R.push(D.id),R),[]);if((_||b)&&(_&&t.setState({edges:g.filter(R=>!M.includes(R.id))}),b&&($.forEach(R=>{v.delete(R.id)}),t.setState({nodeInternals:new Map(v)}))),M.length>0&&(x==null||x(I),k&&k(M.map(R=>({id:R,type:"remove"})))),$.length>0&&(w==null||w($),C)){const R=$.map(D=>({id:D.id,type:"remove"}));C(R)}}},[]),f=E.useCallback(m=>{const S=U0e(m),v=S?null:t.getState().nodeInternals.get(m.id);return[S?m:Zk(v),v,S]},[]),h=E.useCallback((m,S=!0,v)=>{const[y,g,b]=f(m);return y?(v||t.getState().getNodes()).filter(_=>{if(!b&&(_.id===g.id||!_.positionAbsolute))return!1;const w=Zk(_),x=sx(w,y);return S&&x>0||x>=m.width*m.height}):[]},[]),p=E.useCallback((m,S,v=!0)=>{const[y]=f(m);if(!y)return!1;const g=sx(y,S);return v&&g>0||g>=m.width*m.height},[]);return E.useMemo(()=>({...e,getNodes:n,getNode:r,getEdges:i,getEdge:o,setNodes:s,setEdges:a,addNodes:l,addEdges:u,toObject:c,deleteElements:d,getIntersectingNodes:h,isNodeIntersecting:p}),[e,n,r,i,o,s,a,l,u,c,d,h,p])}var Lve=({deleteKeyCode:e,multiSelectionKeyCode:t})=>{const n=er(),{deleteElements:r}=SF(),i=Mh(e),o=Mh(t);E.useEffect(()=>{if(i){const{edges:s,getNodes:a}=n.getState(),l=a().filter(c=>c.selected),u=s.filter(c=>c.selected);r({nodes:l,edges:u}),n.setState({nodesSelectionActive:!1})}},[i]),E.useEffect(()=>{n.setState({multiSelectionActive:o})},[o])};function $ve(e){const t=er();E.useEffect(()=>{let n;const r=()=>{var o,s;if(!e.current)return;const i=O3(e.current);(i.height===0||i.width===0)&&((s=(o=t.getState()).onError)==null||s.call(o,"004",wa.error004())),t.setState({width:i.width||500,height:i.height||500})};return r(),window.addEventListener("resize",r),e.current&&(n=new ResizeObserver(()=>r()),n.observe(e.current)),()=>{window.removeEventListener("resize",r),n&&e.current&&n.unobserve(e.current)}},[])}const F3={position:"absolute",width:"100%",height:"100%",top:0,left:0},Fve=(e,t)=>e.x!==t.x||e.y!==t.y||e.zoom!==t.k,w_=e=>({x:e.x,y:e.y,zoom:e.k}),du=(e,t)=>e.target.closest(`.${t}`),g8=(e,t)=>t===2&&Array.isArray(e)&&e.includes(2),Bve=e=>({d3Zoom:e.d3Zoom,d3Selection:e.d3Selection,d3ZoomHandler:e.d3ZoomHandler,userSelectionActive:e.userSelectionActive}),jve=({onMove:e,onMoveStart:t,onMoveEnd:n,onPaneContextMenu:r,zoomOnScroll:i=!0,zoomOnPinch:o=!0,panOnScroll:s=!1,panOnScrollSpeed:a=.5,panOnScrollMode:l=ac.Free,zoomOnDoubleClick:u=!0,elementsSelectable:c,panOnDrag:d=!0,defaultViewport:f,translateExtent:h,minZoom:p,maxZoom:m,zoomActivationKeyCode:S,preventScrolling:v=!0,children:y,noWheelClassName:g,noPanClassName:b})=>{const _=E.useRef(),w=er(),x=E.useRef(!1),C=E.useRef(!1),k=E.useRef(null),P=E.useRef({x:0,y:0,zoom:0}),{d3Zoom:A,d3Selection:$,d3ZoomHandler:N,userSelectionActive:T}=Kt(Bve,Mr),O=Mh(S),I=E.useRef(0);return $ve(k),E.useEffect(()=>{if(k.current){const M=k.current.getBoundingClientRect(),R=L0e().scaleExtent([p,m]).translateExtent(h),D=Ai(k.current).call(R),L=ca.translate(f.x,f.y).scale(Bc(f.zoom,p,m)),V=[[0,0],[M.width,M.height]],z=R.constrain()(L,V,h);R.transform(D,z),w.setState({d3Zoom:R,d3Selection:D,d3ZoomHandler:D.on("wheel.zoom"),transform:[z.x,z.y,z.k],domNode:k.current.closest(".react-flow")})}},[]),E.useEffect(()=>{$&&A&&(s&&!O&&!T?$.on("wheel.zoom",M=>{if(du(M,g))return!1;M.preventDefault(),M.stopImmediatePropagation();const R=$.property("__zoom").k||1;if(M.ctrlKey&&o){const z=Xi(M),U=-M.deltaY*(M.deltaMode===1?.05:M.deltaMode?1:.002)*10,K=R*Math.pow(2,U);A.scaleTo($,K,z);return}const D=M.deltaMode===1?20:1,L=l===ac.Vertical?0:M.deltaX*D,V=l===ac.Horizontal?0:M.deltaY*D;A.translateBy($,-(L/R)*a,-(V/R)*a)},{passive:!1}):typeof N<"u"&&$.on("wheel.zoom",function(M,R){if(!v||du(M,g))return null;M.preventDefault(),N.call(this,M,R)},{passive:!1}))},[T,s,l,$,A,N,O,o,v,g]),E.useEffect(()=>{A&&A.on("start",M=>{var D;if(!M.sourceEvent)return null;I.current=M.sourceEvent.button;const{onViewportChangeStart:R}=w.getState();if(x.current=!0,((D=M.sourceEvent)==null?void 0:D.type)==="mousedown"&&w.setState({paneDragging:!0}),t||R){const L=w_(M.transform);P.current=L,R==null||R(L),t==null||t(M.sourceEvent,L)}})},[A,t]),E.useEffect(()=>{A&&(T&&!x.current?A.on("zoom",null):T||A.on("zoom",M=>{const{onViewportChange:R}=w.getState();if(w.setState({transform:[M.transform.x,M.transform.y,M.transform.k]}),C.current=!!(r&&g8(d,I.current??0)),e||R){const D=w_(M.transform);R==null||R(D),e==null||e(M.sourceEvent,D)}}))},[T,A,e,d,r]),E.useEffect(()=>{A&&A.on("end",M=>{if(!M.sourceEvent)return null;const{onViewportChangeEnd:R}=w.getState();if(x.current=!1,w.setState({paneDragging:!1}),r&&g8(d,I.current??0)&&!C.current&&r(M.sourceEvent),C.current=!1,(n||R)&&Fve(P.current,M.transform)){const D=w_(M.transform);P.current=D,clearTimeout(_.current),_.current=setTimeout(()=>{R==null||R(D),n==null||n(M.sourceEvent,D)},s?150:0)}})},[A,s,d,n,r]),E.useEffect(()=>{A&&A.filter(M=>{const R=O||i,D=o&&M.ctrlKey;if(M.button===1&&M.type==="mousedown"&&(du(M,"react-flow__node")||du(M,"react-flow__edge")))return!0;if(!d&&!R&&!s&&!u&&!o||T||!u&&M.type==="dblclick"||du(M,g)&&M.type==="wheel"||du(M,b)&&M.type!=="wheel"||!o&&M.ctrlKey&&M.type==="wheel"||!R&&!s&&!D&&M.type==="wheel"||!d&&(M.type==="mousedown"||M.type==="touchstart")||Array.isArray(d)&&!d.includes(M.button)&&(M.type==="mousedown"||M.type==="touchstart"))return!1;const L=Array.isArray(d)&&d.includes(M.button)||!M.button||M.button<=1;return(!M.ctrlKey||M.type==="wheel")&&L})},[T,A,i,o,s,u,d,c,O]),j.jsx("div",{className:"react-flow__renderer",ref:k,style:F3,children:y})},Vve=e=>({userSelectionActive:e.userSelectionActive,userSelectionRect:e.userSelectionRect});function zve(){const{userSelectionActive:e,userSelectionRect:t}=Kt(Vve,Mr);return e&&t?j.jsx("div",{className:"react-flow__selection react-flow__container",style:{width:t.width,height:t.height,transform:`translate(${t.x}px, ${t.y}px)`}}):null}function m8(e,t){const n=e.find(r=>r.id===t.parentNode);if(n){const r=t.position.x+t.width-n.width,i=t.position.y+t.height-n.height;if(r>0||i>0||t.position.x<0||t.position.y<0){if(n.style={...n.style},n.style.width=n.style.width??n.width,n.style.height=n.style.height??n.height,r>0&&(n.style.width+=r),i>0&&(n.style.height+=i),t.position.x<0){const o=Math.abs(t.position.x);n.position.x=n.position.x-o,n.style.width+=o,t.position.x=0}if(t.position.y<0){const o=Math.abs(t.position.y);n.position.y=n.position.y-o,n.style.height+=o,t.position.y=0}n.width=n.style.width,n.height=n.style.height}}}function _F(e,t){if(e.some(r=>r.type==="reset"))return e.filter(r=>r.type==="reset").map(r=>r.item);const n=e.filter(r=>r.type==="add").map(r=>r.item);return t.reduce((r,i)=>{const o=e.filter(a=>a.id===i.id);if(o.length===0)return r.push(i),r;const s={...i};for(const a of o)if(a)switch(a.type){case"select":{s.selected=a.selected;break}case"position":{typeof a.position<"u"&&(s.position=a.position),typeof a.positionAbsolute<"u"&&(s.positionAbsolute=a.positionAbsolute),typeof a.dragging<"u"&&(s.dragging=a.dragging),s.expandParent&&m8(r,s);break}case"dimensions":{typeof a.dimensions<"u"&&(s.width=a.dimensions.width,s.height=a.dimensions.height),typeof a.updateStyle<"u"&&(s.style={...s.style||{},...a.dimensions}),typeof a.resizing=="boolean"&&(s.resizing=a.resizing),s.expandParent&&m8(r,s);break}case"remove":return r}return r.push(s),r},n)}function wF(e,t){return _F(e,t)}function Uve(e,t){return _F(e,t)}const Vs=(e,t)=>({id:e,type:"select",selected:t});function Vu(e,t){return e.reduce((n,r)=>{const i=t.includes(r.id);return!r.selected&&i?(r.selected=!0,n.push(Vs(r.id,!0))):r.selected&&!i&&(r.selected=!1,n.push(Vs(r.id,!1))),n},[])}const x_=(e,t)=>n=>{n.target===t.current&&(e==null||e(n))},Gve=e=>({userSelectionActive:e.userSelectionActive,elementsSelectable:e.elementsSelectable,dragging:e.paneDragging}),xF=E.memo(({isSelecting:e,selectionMode:t=Ih.Full,panOnDrag:n,onSelectionStart:r,onSelectionEnd:i,onPaneClick:o,onPaneContextMenu:s,onPaneScroll:a,onPaneMouseEnter:l,onPaneMouseMove:u,onPaneMouseLeave:c,children:d})=>{const f=E.useRef(null),h=er(),p=E.useRef(0),m=E.useRef(0),S=E.useRef(),{userSelectionActive:v,elementsSelectable:y,dragging:g}=Kt(Gve,Mr),b=()=>{h.setState({userSelectionActive:!1,userSelectionRect:null}),p.current=0,m.current=0},_=N=>{o==null||o(N),h.getState().resetSelectedElements(),h.setState({nodesSelectionActive:!1})},w=N=>{if(Array.isArray(n)&&(n!=null&&n.includes(2))){N.preventDefault();return}s==null||s(N)},x=a?N=>a(N):void 0,C=N=>{const{resetSelectedElements:T,domNode:O}=h.getState();if(S.current=O==null?void 0:O.getBoundingClientRect(),!y||!e||N.button!==0||N.target!==f.current||!S.current)return;const{x:I,y:M}=da(N,S.current);T(),h.setState({userSelectionRect:{width:0,height:0,startX:I,startY:M,x:I,y:M}}),r==null||r(N)},k=N=>{const{userSelectionRect:T,nodeInternals:O,edges:I,transform:M,onNodesChange:R,onEdgesChange:D,nodeOrigin:L,getNodes:V}=h.getState();if(!e||!S.current||!T)return;h.setState({userSelectionActive:!0,nodesSelectionActive:!1});const z=da(N,S.current),U=T.startX??0,K=T.startY??0,W={...T,x:z.xJ.id),Q=F.map(J=>J.id);if(p.current!==Q.length){p.current=Q.length;const J=Vu(X,Q);J.length&&(R==null||R(J))}if(m.current!==q.length){m.current=q.length;const J=Vu(I,q);J.length&&(D==null||D(J))}h.setState({userSelectionRect:W})},P=N=>{if(N.button!==0)return;const{userSelectionRect:T}=h.getState();!v&&T&&N.target===f.current&&(_==null||_(N)),h.setState({nodesSelectionActive:p.current>0}),b(),i==null||i(N)},A=N=>{v&&(h.setState({nodesSelectionActive:p.current>0}),i==null||i(N)),b()},$=y&&(e||v);return j.jsxs("div",{className:_i(["react-flow__pane",{dragging:g,selection:e}]),onClick:$?void 0:x_(_,f),onContextMenu:x_(w,f),onWheel:x_(x,f),onMouseEnter:$?void 0:l,onMouseDown:$?C:void 0,onMouseMove:$?k:u,onMouseUp:$?P:void 0,onMouseLeave:$?A:c,ref:f,style:F3,children:[d,j.jsx(zve,{})]})});xF.displayName="Pane";const Hve=e=>{const t=e.getNodes().filter(n=>n.selected);return{...Q$(t,e.nodeOrigin),transformString:`translate(${e.transform[0]}px,${e.transform[1]}px) scale(${e.transform[2]})`,userSelectionActive:e.userSelectionActive}};function qve({onSelectionContextMenu:e,noPanClassName:t,disableKeyboardA11y:n}){const r=er(),{width:i,height:o,x:s,y:a,transformString:l,userSelectionActive:u}=Kt(Hve,Mr),c=mF(),d=E.useRef(null);if(E.useEffect(()=>{var p;n||(p=d.current)==null||p.focus({preventScroll:!0})},[n]),gF({nodeRef:d}),u||!i||!o)return null;const f=e?p=>{const m=r.getState().getNodes().filter(S=>S.selected);e(p,m)}:void 0,h=p=>{Object.prototype.hasOwnProperty.call(uc,p.key)&&c({x:uc[p.key].x,y:uc[p.key].y,isShiftPressed:p.shiftKey})};return j.jsx("div",{className:_i(["react-flow__nodesselection","react-flow__container",t]),style:{transform:l},children:j.jsx("div",{ref:d,className:"react-flow__nodesselection-rect",onContextMenu:f,tabIndex:n?void 0:-1,onKeyDown:n?void 0:h,style:{width:i,height:o,top:a,left:s}})})}var Wve=E.memo(qve);const Kve=e=>e.nodesSelectionActive,CF=({children:e,onPaneClick:t,onPaneMouseEnter:n,onPaneMouseMove:r,onPaneMouseLeave:i,onPaneContextMenu:o,onPaneScroll:s,deleteKeyCode:a,onMove:l,onMoveStart:u,onMoveEnd:c,selectionKeyCode:d,selectionOnDrag:f,selectionMode:h,onSelectionStart:p,onSelectionEnd:m,multiSelectionKeyCode:S,panActivationKeyCode:v,zoomActivationKeyCode:y,elementsSelectable:g,zoomOnScroll:b,zoomOnPinch:_,panOnScroll:w,panOnScrollSpeed:x,panOnScrollMode:C,zoomOnDoubleClick:k,panOnDrag:P,defaultViewport:A,translateExtent:$,minZoom:N,maxZoom:T,preventScrolling:O,onSelectionContextMenu:I,noWheelClassName:M,noPanClassName:R,disableKeyboardA11y:D})=>{const L=Kt(Kve),V=Mh(d),U=Mh(v)||P,K=V||f&&U!==!0;return Lve({deleteKeyCode:a,multiSelectionKeyCode:S}),j.jsx(jve,{onMove:l,onMoveStart:u,onMoveEnd:c,onPaneContextMenu:o,elementsSelectable:g,zoomOnScroll:b,zoomOnPinch:_,panOnScroll:w,panOnScrollSpeed:x,panOnScrollMode:C,zoomOnDoubleClick:k,panOnDrag:!V&&U,defaultViewport:A,translateExtent:$,minZoom:N,maxZoom:T,zoomActivationKeyCode:y,preventScrolling:O,noWheelClassName:M,noPanClassName:R,children:j.jsxs(xF,{onSelectionStart:p,onSelectionEnd:m,onPaneClick:t,onPaneMouseEnter:n,onPaneMouseMove:r,onPaneMouseLeave:i,onPaneContextMenu:o,onPaneScroll:s,panOnDrag:U,isSelecting:!!K,selectionMode:h,children:[e,L&&j.jsx(Wve,{onSelectionContextMenu:I,noPanClassName:R,disableKeyboardA11y:D})]})})};CF.displayName="FlowRenderer";var Yve=E.memo(CF);function Xve(e){return Kt(E.useCallback(n=>e?Z$(n.nodeInternals,{x:0,y:0,width:n.width,height:n.height},n.transform,!0):n.getNodes(),[e]))}const Qve=e=>({nodesDraggable:e.nodesDraggable,nodesConnectable:e.nodesConnectable,nodesFocusable:e.nodesFocusable,elementsSelectable:e.elementsSelectable,updateNodeDimensions:e.updateNodeDimensions,onError:e.onError}),TF=e=>{const{nodesDraggable:t,nodesConnectable:n,nodesFocusable:r,elementsSelectable:i,updateNodeDimensions:o,onError:s}=Kt(Qve,Mr),a=Xve(e.onlyRenderVisibleElements),l=E.useRef(),u=E.useMemo(()=>{if(typeof ResizeObserver>"u")return null;const c=new ResizeObserver(d=>{const f=d.map(h=>({id:h.target.getAttribute("data-id"),nodeElement:h.target,forceUpdate:!0}));o(f)});return l.current=c,c},[]);return E.useEffect(()=>()=>{var c;(c=l==null?void 0:l.current)==null||c.disconnect()},[]),j.jsx("div",{className:"react-flow__nodes",style:F3,children:a.map(c=>{var _,w;let d=c.type||"default";e.nodeTypes[d]||(s==null||s("003",wa.error003(d)),d="default");const f=e.nodeTypes[d]||e.nodeTypes.default,h=!!(c.draggable||t&&typeof c.draggable>"u"),p=!!(c.selectable||i&&typeof c.selectable>"u"),m=!!(c.connectable||n&&typeof c.connectable>"u"),S=!!(c.focusable||r&&typeof c.focusable>"u"),v=e.nodeExtent?R3(c.positionAbsolute,e.nodeExtent):c.positionAbsolute,y=(v==null?void 0:v.x)??0,g=(v==null?void 0:v.y)??0,b=Ave({x:y,y:g,width:c.width??0,height:c.height??0,origin:e.nodeOrigin});return j.jsx(f,{id:c.id,className:c.className,style:c.style,type:d,data:c.data,sourcePosition:c.sourcePosition||ye.Bottom,targetPosition:c.targetPosition||ye.Top,hidden:c.hidden,xPos:y,yPos:g,xPosOrigin:b.x,yPosOrigin:b.y,selectNodesOnDrag:e.selectNodesOnDrag,onClick:e.onNodeClick,onMouseEnter:e.onNodeMouseEnter,onMouseMove:e.onNodeMouseMove,onMouseLeave:e.onNodeMouseLeave,onContextMenu:e.onNodeContextMenu,onDoubleClick:e.onNodeDoubleClick,selected:!!c.selected,isDraggable:h,isSelectable:p,isConnectable:m,isFocusable:S,resizeObserver:u,dragHandle:c.dragHandle,zIndex:((_=c[hn])==null?void 0:_.z)??0,isParent:!!((w=c[hn])!=null&&w.isParent),noDragClassName:e.noDragClassName,noPanClassName:e.noPanClassName,initialized:!!c.width&&!!c.height,rfId:e.rfId,disableKeyboardA11y:e.disableKeyboardA11y,ariaLabel:c.ariaLabel},c.id)})})};TF.displayName="NodeRenderer";var Zve=E.memo(TF);const Jve=[{level:0,isMaxLevel:!0,edges:[]}];function e1e(e,t,n=!1){let r=-1;const i=e.reduce((s,a)=>{var c,d;const l=ci(a.zIndex);let u=l?a.zIndex:0;if(n){const f=t.get(a.target),h=t.get(a.source),p=a.selected||(f==null?void 0:f.selected)||(h==null?void 0:h.selected),m=Math.max(((c=h==null?void 0:h[hn])==null?void 0:c.z)||0,((d=f==null?void 0:f[hn])==null?void 0:d.z)||0,1e3);u=(l?a.zIndex:0)+(p?m:0)}return s[u]?s[u].push(a):s[u]=[a],r=u>r?u:r,s},{}),o=Object.entries(i).map(([s,a])=>{const l=+s;return{edges:a,level:l,isMaxLevel:l===r}});return o.length===0?Jve:o}function t1e(e,t,n){const r=Kt(E.useCallback(i=>e?i.edges.filter(o=>{const s=t.get(o.source),a=t.get(o.target);return(s==null?void 0:s.width)&&(s==null?void 0:s.height)&&(a==null?void 0:a.width)&&(a==null?void 0:a.height)&&Cve({sourcePos:s.positionAbsolute||{x:0,y:0},targetPos:a.positionAbsolute||{x:0,y:0},sourceWidth:s.width,sourceHeight:s.height,targetWidth:a.width,targetHeight:a.height,width:i.width,height:i.height,transform:i.transform})}):i.edges,[e,t]));return e1e(r,t,n)}const n1e=({color:e="none",strokeWidth:t=1})=>j.jsx("polyline",{stroke:e,strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:t,fill:"none",points:"-5,-4 0,0 -5,4"}),r1e=({color:e="none",strokeWidth:t=1})=>j.jsx("polyline",{stroke:e,strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:t,fill:e,points:"-5,-4 0,0 -5,4 -5,-4"}),y8={[i0.Arrow]:n1e,[i0.ArrowClosed]:r1e};function i1e(e){const t=er();return E.useMemo(()=>{var i,o;return Object.prototype.hasOwnProperty.call(y8,e)?y8[e]:((o=(i=t.getState()).onError)==null||o.call(i,"009",wa.error009(e)),null)},[e])}const o1e=({id:e,type:t,color:n,width:r=12.5,height:i=12.5,markerUnits:o="strokeWidth",strokeWidth:s,orient:a="auto-start-reverse"})=>{const l=i1e(t);return l?j.jsx("marker",{className:"react-flow__arrowhead",id:e,markerWidth:`${r}`,markerHeight:`${i}`,viewBox:"-10 -10 20 20",markerUnits:o,orient:a,refX:"0",refY:"0",children:j.jsx(l,{color:n,strokeWidth:s})}):null},s1e=({defaultColor:e,rfId:t})=>n=>{const r=[];return n.edges.reduce((i,o)=>([o.markerStart,o.markerEnd].forEach(s=>{if(s&&typeof s=="object"){const a=ux(s,t);r.includes(a)||(i.push({id:a,color:s.color||e,...s}),r.push(a))}}),i),[]).sort((i,o)=>i.id.localeCompare(o.id))},EF=({defaultColor:e,rfId:t})=>{const n=Kt(E.useCallback(s1e({defaultColor:e,rfId:t}),[e,t]),(r,i)=>!(r.length!==i.length||r.some((o,s)=>o.id!==i[s].id)));return j.jsx("defs",{children:n.map(r=>j.jsx(o1e,{id:r.id,type:r.type,color:r.color,width:r.width,height:r.height,markerUnits:r.markerUnits,strokeWidth:r.strokeWidth,orient:r.orient},r.id))})};EF.displayName="MarkerDefinitions";var a1e=E.memo(EF);const l1e=e=>({nodesConnectable:e.nodesConnectable,edgesFocusable:e.edgesFocusable,edgesUpdatable:e.edgesUpdatable,elementsSelectable:e.elementsSelectable,width:e.width,height:e.height,connectionMode:e.connectionMode,nodeInternals:e.nodeInternals,onError:e.onError}),PF=({defaultMarkerColor:e,onlyRenderVisibleElements:t,elevateEdgesOnSelect:n,rfId:r,edgeTypes:i,noPanClassName:o,onEdgeUpdate:s,onEdgeContextMenu:a,onEdgeMouseEnter:l,onEdgeMouseMove:u,onEdgeMouseLeave:c,onEdgeClick:d,edgeUpdaterRadius:f,onEdgeDoubleClick:h,onEdgeUpdateStart:p,onEdgeUpdateEnd:m,children:S})=>{const{edgesFocusable:v,edgesUpdatable:y,elementsSelectable:g,width:b,height:_,connectionMode:w,nodeInternals:x,onError:C}=Kt(l1e,Mr),k=t1e(t,x,n);return b?j.jsxs(j.Fragment,{children:[k.map(({level:P,edges:A,isMaxLevel:$})=>j.jsxs("svg",{style:{zIndex:P},width:b,height:_,className:"react-flow__edges react-flow__container",children:[$&&j.jsx(a1e,{defaultColor:e,rfId:r}),j.jsx("g",{children:A.map(N=>{const[T,O,I]=c8(x.get(N.source)),[M,R,D]=c8(x.get(N.target));if(!I||!D)return null;let L=N.type||"default";i[L]||(C==null||C("011",wa.error011(L)),L="default");const V=i[L]||i.default,z=w===Al.Strict?R.target:(R.target??[]).concat(R.source??[]),U=u8(O.source,N.sourceHandle),K=u8(z,N.targetHandle),W=(U==null?void 0:U.position)||ye.Bottom,X=(K==null?void 0:K.position)||ye.Top,F=!!(N.focusable||v&&typeof N.focusable>"u"),q=typeof s<"u"&&(N.updatable||y&&typeof N.updatable>"u");if(!U||!K)return C==null||C("008",wa.error008(U,N)),null;const{sourceX:Q,sourceY:J,targetX:ne,targetY:Z}=xve(T,U,W,M,K,X);return j.jsx(V,{id:N.id,className:_i([N.className,o]),type:L,data:N.data,selected:!!N.selected,animated:!!N.animated,hidden:!!N.hidden,label:N.label,labelStyle:N.labelStyle,labelShowBg:N.labelShowBg,labelBgStyle:N.labelBgStyle,labelBgPadding:N.labelBgPadding,labelBgBorderRadius:N.labelBgBorderRadius,style:N.style,source:N.source,target:N.target,sourceHandleId:N.sourceHandle,targetHandleId:N.targetHandle,markerEnd:N.markerEnd,markerStart:N.markerStart,sourceX:Q,sourceY:J,targetX:ne,targetY:Z,sourcePosition:W,targetPosition:X,elementsSelectable:g,onEdgeUpdate:s,onContextMenu:a,onMouseEnter:l,onMouseMove:u,onMouseLeave:c,onClick:d,edgeUpdaterRadius:f,onEdgeDoubleClick:h,onEdgeUpdateStart:p,onEdgeUpdateEnd:m,rfId:r,ariaLabel:N.ariaLabel,isFocusable:F,isUpdatable:q,pathOptions:"pathOptions"in N?N.pathOptions:void 0,interactionWidth:N.interactionWidth},N.id)})})]},P)),S]}):null};PF.displayName="EdgeRenderer";var u1e=E.memo(PF);const c1e=e=>`translate(${e.transform[0]}px,${e.transform[1]}px) scale(${e.transform[2]})`;function d1e({children:e}){const t=Kt(c1e);return j.jsx("div",{className:"react-flow__viewport react-flow__container",style:{transform:t},children:e})}function f1e(e){const t=SF(),n=E.useRef(!1);E.useEffect(()=>{!n.current&&t.viewportInitialized&&e&&(setTimeout(()=>e(t),1),n.current=!0)},[e,t.viewportInitialized])}const h1e={[ye.Left]:ye.Right,[ye.Right]:ye.Left,[ye.Top]:ye.Bottom,[ye.Bottom]:ye.Top},kF=({nodeId:e,handleType:t,style:n,type:r=Ws.Bezier,CustomComponent:i,connectionStatus:o})=>{var w,x,C;const{fromNode:s,handleId:a,toX:l,toY:u,connectionMode:c}=Kt(E.useCallback(k=>({fromNode:k.nodeInternals.get(e),handleId:k.connectionHandleId,toX:(k.connectionPosition.x-k.transform[0])/k.transform[2],toY:(k.connectionPosition.y-k.transform[1])/k.transform[2],connectionMode:k.connectionMode}),[e]),Mr),d=(w=s==null?void 0:s[hn])==null?void 0:w.handleBounds;let f=d==null?void 0:d[t];if(c===Al.Loose&&(f=f||(d==null?void 0:d[t==="source"?"target":"source"])),!s||!f)return null;const h=a?f.find(k=>k.id===a):f[0],p=h?h.x+h.width/2:(s.width??0)/2,m=h?h.y+h.height/2:s.height??0,S=(((x=s.positionAbsolute)==null?void 0:x.x)??0)+p,v=(((C=s.positionAbsolute)==null?void 0:C.y)??0)+m,y=h==null?void 0:h.position,g=y?h1e[y]:null;if(!y||!g)return null;if(i)return j.jsx(i,{connectionLineType:r,connectionLineStyle:n,fromNode:s,fromHandle:h,fromX:S,fromY:v,toX:l,toY:u,fromPosition:y,toPosition:g,connectionStatus:o});let b="";const _={sourceX:S,sourceY:v,sourcePosition:y,targetX:l,targetY:u,targetPosition:g};return r===Ws.Bezier?[b]=K$(_):r===Ws.Step?[b]=lx({..._,borderRadius:0}):r===Ws.SmoothStep?[b]=lx(_):r===Ws.SimpleBezier?[b]=W$(_):b=`M${S},${v} ${l},${u}`,j.jsx("path",{d:b,fill:"none",className:"react-flow__connection-path",style:n})};kF.displayName="ConnectionLine";const p1e=e=>({nodeId:e.connectionNodeId,handleType:e.connectionHandleType,nodesConnectable:e.nodesConnectable,connectionStatus:e.connectionStatus,width:e.width,height:e.height});function g1e({containerStyle:e,style:t,type:n,component:r}){const{nodeId:i,handleType:o,nodesConnectable:s,width:a,height:l,connectionStatus:u}=Kt(p1e,Mr);return!(i&&o&&a&&s)?null:j.jsx("svg",{style:e,width:a,height:l,className:"react-flow__edges react-flow__connectionline react-flow__container",children:j.jsx("g",{className:_i(["react-flow__connection",u]),children:j.jsx(kF,{nodeId:i,handleType:o,style:t,type:n,CustomComponent:r,connectionStatus:u})})})}const AF=({nodeTypes:e,edgeTypes:t,onMove:n,onMoveStart:r,onMoveEnd:i,onInit:o,onNodeClick:s,onEdgeClick:a,onNodeDoubleClick:l,onEdgeDoubleClick:u,onNodeMouseEnter:c,onNodeMouseMove:d,onNodeMouseLeave:f,onNodeContextMenu:h,onSelectionContextMenu:p,onSelectionStart:m,onSelectionEnd:S,connectionLineType:v,connectionLineStyle:y,connectionLineComponent:g,connectionLineContainerStyle:b,selectionKeyCode:_,selectionOnDrag:w,selectionMode:x,multiSelectionKeyCode:C,panActivationKeyCode:k,zoomActivationKeyCode:P,deleteKeyCode:A,onlyRenderVisibleElements:$,elementsSelectable:N,selectNodesOnDrag:T,defaultViewport:O,translateExtent:I,minZoom:M,maxZoom:R,preventScrolling:D,defaultMarkerColor:L,zoomOnScroll:V,zoomOnPinch:z,panOnScroll:U,panOnScrollSpeed:K,panOnScrollMode:W,zoomOnDoubleClick:X,panOnDrag:F,onPaneClick:q,onPaneMouseEnter:Q,onPaneMouseMove:J,onPaneMouseLeave:ne,onPaneScroll:Z,onPaneContextMenu:me,onEdgeUpdate:ae,onEdgeContextMenu:oe,onEdgeMouseEnter:Ce,onEdgeMouseMove:se,onEdgeMouseLeave:qe,edgeUpdaterRadius:yt,onEdgeUpdateStart:$e,onEdgeUpdateEnd:Fe,noDragClassName:Ie,noWheelClassName:nt,noPanClassName:xt,elevateEdgesOnSelect:yn,disableKeyboardA11y:an,nodeOrigin:Ot,nodeExtent:ee,rfId:Se})=>(f1e(o),j.jsx(Yve,{onPaneClick:q,onPaneMouseEnter:Q,onPaneMouseMove:J,onPaneMouseLeave:ne,onPaneContextMenu:me,onPaneScroll:Z,deleteKeyCode:A,selectionKeyCode:_,selectionOnDrag:w,selectionMode:x,onSelectionStart:m,onSelectionEnd:S,multiSelectionKeyCode:C,panActivationKeyCode:k,zoomActivationKeyCode:P,elementsSelectable:N,onMove:n,onMoveStart:r,onMoveEnd:i,zoomOnScroll:V,zoomOnPinch:z,zoomOnDoubleClick:X,panOnScroll:U,panOnScrollSpeed:K,panOnScrollMode:W,panOnDrag:F,defaultViewport:O,translateExtent:I,minZoom:M,maxZoom:R,onSelectionContextMenu:p,preventScrolling:D,noDragClassName:Ie,noWheelClassName:nt,noPanClassName:xt,disableKeyboardA11y:an,children:j.jsxs(d1e,{children:[j.jsx(u1e,{edgeTypes:t,onEdgeClick:a,onEdgeDoubleClick:u,onEdgeUpdate:ae,onlyRenderVisibleElements:$,onEdgeContextMenu:oe,onEdgeMouseEnter:Ce,onEdgeMouseMove:se,onEdgeMouseLeave:qe,onEdgeUpdateStart:$e,onEdgeUpdateEnd:Fe,edgeUpdaterRadius:yt,defaultMarkerColor:L,noPanClassName:xt,elevateEdgesOnSelect:!!yn,disableKeyboardA11y:an,rfId:Se,children:j.jsx(g1e,{style:y,type:v,component:g,containerStyle:b})}),j.jsx("div",{className:"react-flow__edgelabel-renderer"}),j.jsx(Zve,{nodeTypes:e,onNodeClick:s,onNodeDoubleClick:l,onNodeMouseEnter:c,onNodeMouseMove:d,onNodeMouseLeave:f,onNodeContextMenu:h,selectNodesOnDrag:T,onlyRenderVisibleElements:$,noPanClassName:xt,noDragClassName:Ie,disableKeyboardA11y:an,nodeOrigin:Ot,nodeExtent:ee,rfId:Se})]})}));AF.displayName="GraphView";var m1e=E.memo(AF);const fx=[[Number.NEGATIVE_INFINITY,Number.NEGATIVE_INFINITY],[Number.POSITIVE_INFINITY,Number.POSITIVE_INFINITY]],Is={rfId:"1",width:0,height:0,transform:[0,0,1],nodeInternals:new Map,edges:[],onNodesChange:null,onEdgesChange:null,hasDefaultNodes:!1,hasDefaultEdges:!1,d3Zoom:null,d3Selection:null,d3ZoomHandler:void 0,minZoom:.5,maxZoom:2,translateExtent:fx,nodeExtent:fx,nodesSelectionActive:!1,userSelectionActive:!1,userSelectionRect:null,connectionNodeId:null,connectionHandleId:null,connectionHandleType:"source",connectionPosition:{x:0,y:0},connectionStatus:null,connectionMode:Al.Strict,domNode:null,paneDragging:!1,noPanClassName:"nopan",nodeOrigin:[0,0],snapGrid:[15,15],snapToGrid:!1,nodesDraggable:!0,nodesConnectable:!0,nodesFocusable:!0,edgesFocusable:!0,edgesUpdatable:!0,elementsSelectable:!0,elevateNodesOnSelect:!0,fitViewOnInit:!1,fitViewOnInitDone:!1,fitViewOnInitOptions:void 0,multiSelectionActive:!1,connectionStartHandle:null,connectionEndHandle:null,connectionClickStartHandle:null,connectOnClick:!0,ariaLiveMessage:"",autoPanOnConnect:!0,autoPanOnNodeDrag:!0,connectionRadius:20,onError:G0e,isValidConnection:void 0},y1e=()=>nge((e,t)=>({...Is,setNodes:n=>{const{nodeInternals:r,nodeOrigin:i,elevateNodesOnSelect:o}=t();e({nodeInternals:__(n,r,i,o)})},getNodes:()=>Array.from(t().nodeInternals.values()),setEdges:n=>{const{defaultEdgeOptions:r={}}=t();e({edges:n.map(i=>({...r,...i}))})},setDefaultNodesAndEdges:(n,r)=>{const i=typeof n<"u",o=typeof r<"u",s=i?__(n,new Map,t().nodeOrigin,t().elevateNodesOnSelect):new Map;e({nodeInternals:s,edges:o?r:[],hasDefaultNodes:i,hasDefaultEdges:o})},updateNodeDimensions:n=>{const{onNodesChange:r,nodeInternals:i,fitViewOnInit:o,fitViewOnInitDone:s,fitViewOnInitOptions:a,domNode:l,nodeOrigin:u}=t(),c=l==null?void 0:l.querySelector(".react-flow__viewport");if(!c)return;const d=window.getComputedStyle(c),{m22:f}=new window.DOMMatrixReadOnly(d.transform),h=n.reduce((m,S)=>{const v=i.get(S.id);if(v){const y=O3(S.nodeElement);!!(y.width&&y.height&&(v.width!==y.width||v.height!==y.height||S.forceUpdate))&&(i.set(v.id,{...v,[hn]:{...v[hn],handleBounds:{source:f8(".source",S.nodeElement,f,u),target:f8(".target",S.nodeElement,f,u)}},...y}),m.push({id:v.id,type:"dimensions",dimensions:y}))}return m},[]);vF(i,u);const p=s||o&&!s&&bF(t,{initial:!0,...a});e({nodeInternals:new Map(i),fitViewOnInitDone:p}),(h==null?void 0:h.length)>0&&(r==null||r(h))},updateNodePositions:(n,r=!0,i=!1)=>{const{triggerNodeChanges:o}=t(),s=n.map(a=>{const l={id:a.id,type:"position",dragging:i};return r&&(l.positionAbsolute=a.positionAbsolute,l.position=a.position),l});o(s)},triggerNodeChanges:n=>{const{onNodesChange:r,nodeInternals:i,hasDefaultNodes:o,nodeOrigin:s,getNodes:a,elevateNodesOnSelect:l}=t();if(n!=null&&n.length){if(o){const u=wF(n,a()),c=__(u,i,s,l);e({nodeInternals:c})}r==null||r(n)}},addSelectedNodes:n=>{const{multiSelectionActive:r,edges:i,getNodes:o}=t();let s,a=null;r?s=n.map(l=>Vs(l,!0)):(s=Vu(o(),n),a=Vu(i,[])),Ng({changedNodes:s,changedEdges:a,get:t,set:e})},addSelectedEdges:n=>{const{multiSelectionActive:r,edges:i,getNodes:o}=t();let s,a=null;r?s=n.map(l=>Vs(l,!0)):(s=Vu(i,n),a=Vu(o(),[])),Ng({changedNodes:a,changedEdges:s,get:t,set:e})},unselectNodesAndEdges:({nodes:n,edges:r}={})=>{const{edges:i,getNodes:o}=t(),s=n||o(),a=r||i,l=s.map(c=>(c.selected=!1,Vs(c.id,!1))),u=a.map(c=>Vs(c.id,!1));Ng({changedNodes:l,changedEdges:u,get:t,set:e})},setMinZoom:n=>{const{d3Zoom:r,maxZoom:i}=t();r==null||r.scaleExtent([n,i]),e({minZoom:n})},setMaxZoom:n=>{const{d3Zoom:r,minZoom:i}=t();r==null||r.scaleExtent([i,n]),e({maxZoom:n})},setTranslateExtent:n=>{var r;(r=t().d3Zoom)==null||r.translateExtent(n),e({translateExtent:n})},resetSelectedElements:()=>{const{edges:n,getNodes:r}=t(),o=r().filter(a=>a.selected).map(a=>Vs(a.id,!1)),s=n.filter(a=>a.selected).map(a=>Vs(a.id,!1));Ng({changedNodes:o,changedEdges:s,get:t,set:e})},setNodeExtent:n=>{const{nodeInternals:r}=t();r.forEach(i=>{i.positionAbsolute=R3(i.position,n)}),e({nodeExtent:n,nodeInternals:new Map(r)})},panBy:n=>{const{transform:r,width:i,height:o,d3Zoom:s,d3Selection:a,translateExtent:l}=t();if(!s||!a||!n.x&&!n.y)return!1;const u=ca.translate(r[0]+n.x,r[1]+n.y).scale(r[2]),c=[[0,0],[i,o]],d=s==null?void 0:s.constrain()(u,c,l);return s.transform(a,d),r[0]!==d.x||r[1]!==d.y||r[2]!==d.k},cancelConnection:()=>e({connectionNodeId:Is.connectionNodeId,connectionHandleId:Is.connectionHandleId,connectionHandleType:Is.connectionHandleType,connectionStatus:Is.connectionStatus,connectionStartHandle:Is.connectionStartHandle,connectionEndHandle:Is.connectionEndHandle}),reset:()=>e({...Is})})),OF=({children:e})=>{const t=E.useRef(null);return t.current||(t.current=y1e()),j.jsx($0e,{value:t.current,children:e})};OF.displayName="ReactFlowProvider";const RF=({children:e})=>E.useContext(x1)?j.jsx(j.Fragment,{children:e}):j.jsx(OF,{children:e});RF.displayName="ReactFlowWrapper";function v8(e,t){return E.useRef(null),E.useMemo(()=>t(e),[e])}const v1e={input:aF,default:cx,output:uF,group:$3},b1e={default:o0,straight:N3,step:M3,smoothstep:C1,simplebezier:I3},S1e=[0,0],_1e=[15,15],w1e={x:0,y:0,zoom:1},x1e={width:"100%",height:"100%",overflow:"hidden",position:"relative",zIndex:0},C1e=E.forwardRef(({nodes:e,edges:t,defaultNodes:n,defaultEdges:r,className:i,nodeTypes:o=v1e,edgeTypes:s=b1e,onNodeClick:a,onEdgeClick:l,onInit:u,onMove:c,onMoveStart:d,onMoveEnd:f,onConnect:h,onConnectStart:p,onConnectEnd:m,onClickConnectStart:S,onClickConnectEnd:v,onNodeMouseEnter:y,onNodeMouseMove:g,onNodeMouseLeave:b,onNodeContextMenu:_,onNodeDoubleClick:w,onNodeDragStart:x,onNodeDrag:C,onNodeDragStop:k,onNodesDelete:P,onEdgesDelete:A,onSelectionChange:$,onSelectionDragStart:N,onSelectionDrag:T,onSelectionDragStop:O,onSelectionContextMenu:I,onSelectionStart:M,onSelectionEnd:R,connectionMode:D=Al.Strict,connectionLineType:L=Ws.Bezier,connectionLineStyle:V,connectionLineComponent:z,connectionLineContainerStyle:U,deleteKeyCode:K="Backspace",selectionKeyCode:W="Shift",selectionOnDrag:X=!1,selectionMode:F=Ih.Full,panActivationKeyCode:q="Space",multiSelectionKeyCode:Q="Meta",zoomActivationKeyCode:J="Meta",snapToGrid:ne=!1,snapGrid:Z=_1e,onlyRenderVisibleElements:me=!1,selectNodesOnDrag:ae=!0,nodesDraggable:oe,nodesConnectable:Ce,nodesFocusable:se,nodeOrigin:qe=S1e,edgesFocusable:yt,edgesUpdatable:$e,elementsSelectable:Fe,defaultViewport:Ie=w1e,minZoom:nt=.5,maxZoom:xt=2,translateExtent:yn=fx,preventScrolling:an=!0,nodeExtent:Ot,defaultMarkerColor:ee="#b1b1b7",zoomOnScroll:Se=!0,zoomOnPinch:Te=!0,panOnScroll:Me=!1,panOnScrollSpeed:ie=.5,panOnScrollMode:pe=ac.Free,zoomOnDoubleClick:Qt=!0,panOnDrag:Rt=!0,onPaneClick:ut,onPaneMouseEnter:nr,onPaneMouseMove:Lo,onPaneMouseLeave:Xr,onPaneScroll:$o,onPaneContextMenu:ct,children:We,onEdgeUpdate:On,onEdgeContextMenu:vn,onEdgeDoubleClick:Hn,onEdgeMouseEnter:rr,onEdgeMouseMove:yr,onEdgeMouseLeave:Hi,onEdgeUpdateStart:ir,onEdgeUpdateEnd:Rn,edgeUpdaterRadius:Fo=10,onNodesChange:Es,onEdgesChange:Ps,noDragClassName:Zl="nodrag",noWheelClassName:Bo="nowheel",noPanClassName:or="nopan",fitView:Fa=!1,fitViewOptions:kb,connectOnClick:Ab=!0,attributionPosition:Ob,proOptions:Rb,defaultEdgeOptions:ks,elevateNodesOnSelect:Ib=!0,elevateEdgesOnSelect:Mb=!1,disableKeyboardA11y:zp=!1,autoPanOnConnect:Nb=!0,autoPanOnNodeDrag:Db=!0,connectionRadius:Lb=20,isValidConnection:ud,onError:$b,style:Jl,id:eu,...Fb},tu)=>{const Up=v8(o,kve),Bb=v8(s,wve),cd=eu||"1";return j.jsx("div",{...Fb,style:{...Jl,...x1e},ref:tu,className:_i(["react-flow",i]),"data-testid":"rf__wrapper",id:eu,children:j.jsxs(RF,{children:[j.jsx(m1e,{onInit:u,onMove:c,onMoveStart:d,onMoveEnd:f,onNodeClick:a,onEdgeClick:l,onNodeMouseEnter:y,onNodeMouseMove:g,onNodeMouseLeave:b,onNodeContextMenu:_,onNodeDoubleClick:w,nodeTypes:Up,edgeTypes:Bb,connectionLineType:L,connectionLineStyle:V,connectionLineComponent:z,connectionLineContainerStyle:U,selectionKeyCode:W,selectionOnDrag:X,selectionMode:F,deleteKeyCode:K,multiSelectionKeyCode:Q,panActivationKeyCode:q,zoomActivationKeyCode:J,onlyRenderVisibleElements:me,selectNodesOnDrag:ae,defaultViewport:Ie,translateExtent:yn,minZoom:nt,maxZoom:xt,preventScrolling:an,zoomOnScroll:Se,zoomOnPinch:Te,zoomOnDoubleClick:Qt,panOnScroll:Me,panOnScrollSpeed:ie,panOnScrollMode:pe,panOnDrag:Rt,onPaneClick:ut,onPaneMouseEnter:nr,onPaneMouseMove:Lo,onPaneMouseLeave:Xr,onPaneScroll:$o,onPaneContextMenu:ct,onSelectionContextMenu:I,onSelectionStart:M,onSelectionEnd:R,onEdgeUpdate:On,onEdgeContextMenu:vn,onEdgeDoubleClick:Hn,onEdgeMouseEnter:rr,onEdgeMouseMove:yr,onEdgeMouseLeave:Hi,onEdgeUpdateStart:ir,onEdgeUpdateEnd:Rn,edgeUpdaterRadius:Fo,defaultMarkerColor:ee,noDragClassName:Zl,noWheelClassName:Bo,noPanClassName:or,elevateEdgesOnSelect:Mb,rfId:cd,disableKeyboardA11y:zp,nodeOrigin:qe,nodeExtent:Ot}),j.jsx(hve,{nodes:e,edges:t,defaultNodes:n,defaultEdges:r,onConnect:h,onConnectStart:p,onConnectEnd:m,onClickConnectStart:S,onClickConnectEnd:v,nodesDraggable:oe,nodesConnectable:Ce,nodesFocusable:se,edgesFocusable:yt,edgesUpdatable:$e,elementsSelectable:Fe,elevateNodesOnSelect:Ib,minZoom:nt,maxZoom:xt,nodeExtent:Ot,onNodesChange:Es,onEdgesChange:Ps,snapToGrid:ne,snapGrid:Z,connectionMode:D,translateExtent:yn,connectOnClick:Ab,defaultEdgeOptions:ks,fitView:Fa,fitViewOptions:kb,onNodesDelete:P,onEdgesDelete:A,onNodeDragStart:x,onNodeDrag:C,onNodeDragStop:k,onSelectionDrag:T,onSelectionDragStart:N,onSelectionDragStop:O,noPanClassName:or,nodeOrigin:qe,rfId:cd,autoPanOnConnect:Nb,autoPanOnNodeDrag:Db,onError:$b,connectionRadius:Lb,isValidConnection:ud}),j.jsx(dve,{onSelectionChange:$}),We,j.jsx(j0e,{proOptions:Rb,position:Ob}),j.jsx(vve,{rfId:cd,disableKeyboardA11y:zp})]})})});C1e.displayName="ReactFlow";const T1e=ve.child({namespace:"schema"});function E1e(){const e=[];return function(t,n){if(typeof n!="object"||n===null)return n;for(;e.length>0&&e.at(-1)!==this;)e.pop();return e.includes(n)?"[Circular]":(e.push(n),n)}}const Nh=Gf("nodes/receivedOpenAPISchema",async(e,{dispatch:t,rejectWithValue:n})=>{try{const i=await(await fetch("openapi.json")).json();return T1e.info({openAPISchema:i},"Received OpenAPI schema"),JSON.parse(JSON.stringify(i,E1e()))}catch(r){return n({error:r})}}),IF={nodes:[],edges:[],schema:null,invocationTemplates:{},connectionStartParams:null,shouldShowGraphOverlay:!1,shouldShowFieldTypeLegend:!1,shouldShowMinimapPanel:!0,editorInstance:void 0},MF=Vt({name:"nodes",initialState:IF,reducers:{nodesChanged:(e,t)=>{e.nodes=wF(t.payload,e.nodes)},nodeAdded:(e,t)=>{e.nodes.push(t.payload)},edgesChanged:(e,t)=>{e.edges=Uve(t.payload,e.edges)},connectionStarted:(e,t)=>{e.connectionStartParams=t.payload},connectionMade:(e,t)=>{e.edges=Y$(t.payload,e.edges)},connectionEnded:e=>{e.connectionStartParams=null},fieldValueChanged:(e,t)=>{const{nodeId:n,fieldName:r,value:i}=t.payload,o=e.nodes.findIndex(s=>s.id===n);o>-1&&(e.nodes[o].data.inputs[r].value=i)},imageCollectionFieldValueChanged:(e,t)=>{const{nodeId:n,fieldName:r,value:i}=t.payload,o=e.nodes.findIndex(a=>a.id===n);if(o===-1)return;const s=Yn(e.nodes[o].data.inputs[r].value);if(!s){e.nodes[o].data.inputs[r].value=i;return}e.nodes[o].data.inputs[r].value=DZ(s.concat(i),"image_name")},shouldShowGraphOverlayChanged:(e,t)=>{e.shouldShowGraphOverlay=t.payload},shouldShowFieldTypeLegendChanged:(e,t)=>{e.shouldShowFieldTypeLegend=t.payload},shouldShowMinimapPanelChanged:(e,t)=>{e.shouldShowMinimapPanel=t.payload},nodeTemplatesBuilt:(e,t)=>{e.invocationTemplates=t.payload},nodeEditorReset:e=>{e.nodes=[],e.edges=[]},setEditorInstance:(e,t)=>{e.editorInstance=t.payload},loadFileNodes:(e,t)=>{e.nodes=t.payload},loadFileEdges:(e,t)=>{e.edges=t.payload}},extraReducers:e=>{e.addCase(Nh.fulfilled,(t,n)=>{t.schema=n.payload})}}),{nodesChanged:Pke,edgesChanged:kke,nodeAdded:Ake,fieldValueChanged:hx,connectionMade:Oke,connectionStarted:Rke,connectionEnded:Ike,shouldShowGraphOverlayChanged:Mke,shouldShowFieldTypeLegendChanged:Nke,shouldShowMinimapPanelChanged:Dke,nodeTemplatesBuilt:B3,nodeEditorReset:NF,imageCollectionFieldValueChanged:P1e,setEditorInstance:Lke,loadFileNodes:$ke,loadFileEdges:Fke}=MF.actions,k1e=MF.reducer,A1e=e=>e.nodes,DF={esrganModelName:"RealESRGAN_x4plus.pth"},LF=Vt({name:"postprocessing",initialState:DF,reducers:{esrganModelNameChanged:(e,t)=>{e.esrganModelName=t.payload}}}),{esrganModelNameChanged:Bke}=LF.actions,O1e=LF.reducer,Op=ge("app/userInvoked"),R1e={type:"logger",log(e){this.output("log",e)},warn(e){this.output("warn",e)},error(e){this.output("error",e)},output(e,t){console&&console[e]&&console[e].apply(console,t)}};class a0{constructor(t){let n=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};this.init(t,n)}init(t){let n=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};this.prefix=n.prefix||"i18next:",this.logger=t||R1e,this.options=n,this.debug=n.debug}log(){for(var t=arguments.length,n=new Array(t),r=0;r{this.observers[r]=this.observers[r]||[],this.observers[r].push(n)}),this}off(t,n){if(this.observers[t]){if(!n){delete this.observers[t];return}this.observers[t]=this.observers[t].filter(r=>r!==n)}}emit(t){for(var n=arguments.length,r=new Array(n>1?n-1:0),i=1;i{s(...r)}),this.observers["*"]&&[].concat(this.observers["*"]).forEach(s=>{s.apply(s,[t,...r])})}}function Md(){let e,t;const n=new Promise((r,i)=>{e=r,t=i});return n.resolve=e,n.reject=t,n}function b8(e){return e==null?"":""+e}function I1e(e,t,n){e.forEach(r=>{t[r]&&(n[r]=t[r])})}function j3(e,t,n){function r(s){return s&&s.indexOf("###")>-1?s.replace(/###/g,"."):s}function i(){return!e||typeof e=="string"}const o=typeof t!="string"?[].concat(t):t.split(".");for(;o.length>1;){if(i())return{};const s=r(o.shift());!e[s]&&n&&(e[s]=new n),Object.prototype.hasOwnProperty.call(e,s)?e=e[s]:e={}}return i()?{}:{obj:e,k:r(o.shift())}}function S8(e,t,n){const{obj:r,k:i}=j3(e,t,Object);r[i]=n}function M1e(e,t,n,r){const{obj:i,k:o}=j3(e,t,Object);i[o]=i[o]||[],r&&(i[o]=i[o].concat(n)),r||i[o].push(n)}function l0(e,t){const{obj:n,k:r}=j3(e,t);if(n)return n[r]}function N1e(e,t,n){const r=l0(e,n);return r!==void 0?r:l0(t,n)}function $F(e,t,n){for(const r in t)r!=="__proto__"&&r!=="constructor"&&(r in e?typeof e[r]=="string"||e[r]instanceof String||typeof t[r]=="string"||t[r]instanceof String?n&&(e[r]=t[r]):$F(e[r],t[r],n):e[r]=t[r]);return e}function fu(e){return e.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&")}var D1e={"&":"&","<":"<",">":">",'"':""","'":"'","/":"/"};function L1e(e){return typeof e=="string"?e.replace(/[&<>"'\/]/g,t=>D1e[t]):e}const $1e=[" ",",","?","!",";"];function F1e(e,t,n){t=t||"",n=n||"";const r=$1e.filter(s=>t.indexOf(s)<0&&n.indexOf(s)<0);if(r.length===0)return!0;const i=new RegExp(`(${r.map(s=>s==="?"?"\\?":s).join("|")})`);let o=!i.test(e);if(!o){const s=e.indexOf(n);s>0&&!i.test(e.substring(0,s))&&(o=!0)}return o}function u0(e,t){let n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:".";if(!e)return;if(e[t])return e[t];const r=t.split(n);let i=e;for(let o=0;oo+s;)s++,a=r.slice(o,o+s).join(n),l=i[a];if(l===void 0)return;if(l===null)return null;if(t.endsWith(a)){if(typeof l=="string")return l;if(a&&typeof l[a]=="string")return l[a]}const u=r.slice(o+s).join(n);return u?u0(l,u,n):void 0}i=i[r[o]]}return i}function c0(e){return e&&e.indexOf("_")>0?e.replace("_","-"):e}class _8 extends T1{constructor(t){let n=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{ns:["translation"],defaultNS:"translation"};super(),this.data=t||{},this.options=n,this.options.keySeparator===void 0&&(this.options.keySeparator="."),this.options.ignoreJSONStructure===void 0&&(this.options.ignoreJSONStructure=!0)}addNamespaces(t){this.options.ns.indexOf(t)<0&&this.options.ns.push(t)}removeNamespaces(t){const n=this.options.ns.indexOf(t);n>-1&&this.options.ns.splice(n,1)}getResource(t,n,r){let i=arguments.length>3&&arguments[3]!==void 0?arguments[3]:{};const o=i.keySeparator!==void 0?i.keySeparator:this.options.keySeparator,s=i.ignoreJSONStructure!==void 0?i.ignoreJSONStructure:this.options.ignoreJSONStructure;let a=[t,n];r&&typeof r!="string"&&(a=a.concat(r)),r&&typeof r=="string"&&(a=a.concat(o?r.split(o):r)),t.indexOf(".")>-1&&(a=t.split("."));const l=l0(this.data,a);return l||!s||typeof r!="string"?l:u0(this.data&&this.data[t]&&this.data[t][n],r,o)}addResource(t,n,r,i){let o=arguments.length>4&&arguments[4]!==void 0?arguments[4]:{silent:!1};const s=o.keySeparator!==void 0?o.keySeparator:this.options.keySeparator;let a=[t,n];r&&(a=a.concat(s?r.split(s):r)),t.indexOf(".")>-1&&(a=t.split("."),i=n,n=a[1]),this.addNamespaces(n),S8(this.data,a,i),o.silent||this.emit("added",t,n,r,i)}addResources(t,n,r){let i=arguments.length>3&&arguments[3]!==void 0?arguments[3]:{silent:!1};for(const o in r)(typeof r[o]=="string"||Object.prototype.toString.apply(r[o])==="[object Array]")&&this.addResource(t,n,o,r[o],{silent:!0});i.silent||this.emit("added",t,n,r)}addResourceBundle(t,n,r,i,o){let s=arguments.length>5&&arguments[5]!==void 0?arguments[5]:{silent:!1},a=[t,n];t.indexOf(".")>-1&&(a=t.split("."),i=r,r=n,n=a[1]),this.addNamespaces(n);let l=l0(this.data,a)||{};i?$F(l,r,o):l={...l,...r},S8(this.data,a,l),s.silent||this.emit("added",t,n,r)}removeResourceBundle(t,n){this.hasResourceBundle(t,n)&&delete this.data[t][n],this.removeNamespaces(n),this.emit("removed",t,n)}hasResourceBundle(t,n){return this.getResource(t,n)!==void 0}getResourceBundle(t,n){return n||(n=this.options.defaultNS),this.options.compatibilityAPI==="v1"?{...this.getResource(t,n)}:this.getResource(t,n)}getDataByLanguage(t){return this.data[t]}hasLanguageSomeTranslations(t){const n=this.getDataByLanguage(t);return!!(n&&Object.keys(n)||[]).find(i=>n[i]&&Object.keys(n[i]).length>0)}toJSON(){return this.data}}var FF={processors:{},addPostProcessor(e){this.processors[e.name]=e},handle(e,t,n,r,i){return e.forEach(o=>{this.processors[o]&&(t=this.processors[o].process(t,n,r,i))}),t}};const w8={};class d0 extends T1{constructor(t){let n=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};super(),I1e(["resourceStore","languageUtils","pluralResolver","interpolator","backendConnector","i18nFormat","utils"],t,this),this.options=n,this.options.keySeparator===void 0&&(this.options.keySeparator="."),this.logger=fo.create("translator")}changeLanguage(t){t&&(this.language=t)}exists(t){let n=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{interpolation:{}};if(t==null)return!1;const r=this.resolve(t,n);return r&&r.res!==void 0}extractFromKey(t,n){let r=n.nsSeparator!==void 0?n.nsSeparator:this.options.nsSeparator;r===void 0&&(r=":");const i=n.keySeparator!==void 0?n.keySeparator:this.options.keySeparator;let o=n.ns||this.options.defaultNS||[];const s=r&&t.indexOf(r)>-1,a=!this.options.userDefinedKeySeparator&&!n.keySeparator&&!this.options.userDefinedNsSeparator&&!n.nsSeparator&&!F1e(t,r,i);if(s&&!a){const l=t.match(this.interpolator.nestingRegexp);if(l&&l.length>0)return{key:t,namespaces:o};const u=t.split(r);(r!==i||r===i&&this.options.ns.indexOf(u[0])>-1)&&(o=u.shift()),t=u.join(i)}return typeof o=="string"&&(o=[o]),{key:t,namespaces:o}}translate(t,n,r){if(typeof n!="object"&&this.options.overloadTranslationOptionHandler&&(n=this.options.overloadTranslationOptionHandler(arguments)),typeof n=="object"&&(n={...n}),n||(n={}),t==null)return"";Array.isArray(t)||(t=[String(t)]);const i=n.returnDetails!==void 0?n.returnDetails:this.options.returnDetails,o=n.keySeparator!==void 0?n.keySeparator:this.options.keySeparator,{key:s,namespaces:a}=this.extractFromKey(t[t.length-1],n),l=a[a.length-1],u=n.lng||this.language,c=n.appendNamespaceToCIMode||this.options.appendNamespaceToCIMode;if(u&&u.toLowerCase()==="cimode"){if(c){const b=n.nsSeparator||this.options.nsSeparator;return i?{res:`${l}${b}${s}`,usedKey:s,exactUsedKey:s,usedLng:u,usedNS:l}:`${l}${b}${s}`}return i?{res:s,usedKey:s,exactUsedKey:s,usedLng:u,usedNS:l}:s}const d=this.resolve(t,n);let f=d&&d.res;const h=d&&d.usedKey||s,p=d&&d.exactUsedKey||s,m=Object.prototype.toString.apply(f),S=["[object Number]","[object Function]","[object RegExp]"],v=n.joinArrays!==void 0?n.joinArrays:this.options.joinArrays,y=!this.i18nFormat||this.i18nFormat.handleAsObject;if(y&&f&&(typeof f!="string"&&typeof f!="boolean"&&typeof f!="number")&&S.indexOf(m)<0&&!(typeof v=="string"&&m==="[object Array]")){if(!n.returnObjects&&!this.options.returnObjects){this.options.returnedObjectHandler||this.logger.warn("accessing an object - but returnObjects options is not enabled!");const b=this.options.returnedObjectHandler?this.options.returnedObjectHandler(h,f,{...n,ns:a}):`key '${s} (${this.language})' returned an object instead of string.`;return i?(d.res=b,d):b}if(o){const b=m==="[object Array]",_=b?[]:{},w=b?p:h;for(const x in f)if(Object.prototype.hasOwnProperty.call(f,x)){const C=`${w}${o}${x}`;_[x]=this.translate(C,{...n,joinArrays:!1,ns:a}),_[x]===C&&(_[x]=f[x])}f=_}}else if(y&&typeof v=="string"&&m==="[object Array]")f=f.join(v),f&&(f=this.extendTranslation(f,t,n,r));else{let b=!1,_=!1;const w=n.count!==void 0&&typeof n.count!="string",x=d0.hasDefaultValue(n),C=w?this.pluralResolver.getSuffix(u,n.count,n):"",k=n.ordinal&&w?this.pluralResolver.getSuffix(u,n.count,{ordinal:!1}):"",P=n[`defaultValue${C}`]||n[`defaultValue${k}`]||n.defaultValue;!this.isValidLookup(f)&&x&&(b=!0,f=P),this.isValidLookup(f)||(_=!0,f=s);const $=(n.missingKeyNoValueFallbackToKey||this.options.missingKeyNoValueFallbackToKey)&&_?void 0:f,N=x&&P!==f&&this.options.updateMissing;if(_||b||N){if(this.logger.log(N?"updateKey":"missingKey",u,l,s,N?P:f),o){const M=this.resolve(s,{...n,keySeparator:!1});M&&M.res&&this.logger.warn("Seems the loaded translations were in flat JSON format instead of nested. Either set keySeparator: false on init or make sure your translations are published in nested format.")}let T=[];const O=this.languageUtils.getFallbackCodes(this.options.fallbackLng,n.lng||this.language);if(this.options.saveMissingTo==="fallback"&&O&&O[0])for(let M=0;M{const L=x&&D!==f?D:$;this.options.missingKeyHandler?this.options.missingKeyHandler(M,l,R,L,N,n):this.backendConnector&&this.backendConnector.saveMissing&&this.backendConnector.saveMissing(M,l,R,L,N,n),this.emit("missingKey",M,l,R,f)};this.options.saveMissing&&(this.options.saveMissingPlurals&&w?T.forEach(M=>{this.pluralResolver.getSuffixes(M,n).forEach(R=>{I([M],s+R,n[`defaultValue${R}`]||P)})}):I(T,s,P))}f=this.extendTranslation(f,t,n,d,r),_&&f===s&&this.options.appendNamespaceToMissingKey&&(f=`${l}:${s}`),(_||b)&&this.options.parseMissingKeyHandler&&(this.options.compatibilityAPI!=="v1"?f=this.options.parseMissingKeyHandler(this.options.appendNamespaceToMissingKey?`${l}:${s}`:s,b?f:void 0):f=this.options.parseMissingKeyHandler(f))}return i?(d.res=f,d):f}extendTranslation(t,n,r,i,o){var s=this;if(this.i18nFormat&&this.i18nFormat.parse)t=this.i18nFormat.parse(t,{...this.options.interpolation.defaultVariables,...r},i.usedLng,i.usedNS,i.usedKey,{resolved:i});else if(!r.skipInterpolation){r.interpolation&&this.interpolator.init({...r,interpolation:{...this.options.interpolation,...r.interpolation}});const u=typeof t=="string"&&(r&&r.interpolation&&r.interpolation.skipOnVariables!==void 0?r.interpolation.skipOnVariables:this.options.interpolation.skipOnVariables);let c;if(u){const f=t.match(this.interpolator.nestingRegexp);c=f&&f.length}let d=r.replace&&typeof r.replace!="string"?r.replace:r;if(this.options.interpolation.defaultVariables&&(d={...this.options.interpolation.defaultVariables,...d}),t=this.interpolator.interpolate(t,d,r.lng||this.language,r),u){const f=t.match(this.interpolator.nestingRegexp),h=f&&f.length;c1&&arguments[1]!==void 0?arguments[1]:{},r,i,o,s,a;return typeof t=="string"&&(t=[t]),t.forEach(l=>{if(this.isValidLookup(r))return;const u=this.extractFromKey(l,n),c=u.key;i=c;let d=u.namespaces;this.options.fallbackNS&&(d=d.concat(this.options.fallbackNS));const f=n.count!==void 0&&typeof n.count!="string",h=f&&!n.ordinal&&n.count===0&&this.pluralResolver.shouldUseIntlApi(),p=n.context!==void 0&&(typeof n.context=="string"||typeof n.context=="number")&&n.context!=="",m=n.lngs?n.lngs:this.languageUtils.toResolveHierarchy(n.lng||this.language,n.fallbackLng);d.forEach(S=>{this.isValidLookup(r)||(a=S,!w8[`${m[0]}-${S}`]&&this.utils&&this.utils.hasLoadedNamespace&&!this.utils.hasLoadedNamespace(a)&&(w8[`${m[0]}-${S}`]=!0,this.logger.warn(`key "${i}" for languages "${m.join(", ")}" won't get resolved as namespace "${a}" was not yet loaded`,"This means something IS WRONG in your setup. You access the t function before i18next.init / i18next.loadNamespace / i18next.changeLanguage was done. Wait for the callback or Promise to resolve before accessing it!!!")),m.forEach(v=>{if(this.isValidLookup(r))return;s=v;const y=[c];if(this.i18nFormat&&this.i18nFormat.addLookupKeys)this.i18nFormat.addLookupKeys(y,c,v,S,n);else{let b;f&&(b=this.pluralResolver.getSuffix(v,n.count,n));const _=`${this.options.pluralSeparator}zero`,w=`${this.options.pluralSeparator}ordinal${this.options.pluralSeparator}`;if(f&&(y.push(c+b),n.ordinal&&b.indexOf(w)===0&&y.push(c+b.replace(w,this.options.pluralSeparator)),h&&y.push(c+_)),p){const x=`${c}${this.options.contextSeparator}${n.context}`;y.push(x),f&&(y.push(x+b),n.ordinal&&b.indexOf(w)===0&&y.push(x+b.replace(w,this.options.pluralSeparator)),h&&y.push(x+_))}}let g;for(;g=y.pop();)this.isValidLookup(r)||(o=g,r=this.getResource(v,S,g,n))}))})}),{res:r,usedKey:i,exactUsedKey:o,usedLng:s,usedNS:a}}isValidLookup(t){return t!==void 0&&!(!this.options.returnNull&&t===null)&&!(!this.options.returnEmptyString&&t==="")}getResource(t,n,r){let i=arguments.length>3&&arguments[3]!==void 0?arguments[3]:{};return this.i18nFormat&&this.i18nFormat.getResource?this.i18nFormat.getResource(t,n,r,i):this.resourceStore.getResource(t,n,r,i)}static hasDefaultValue(t){const n="defaultValue";for(const r in t)if(Object.prototype.hasOwnProperty.call(t,r)&&n===r.substring(0,n.length)&&t[r]!==void 0)return!0;return!1}}function C_(e){return e.charAt(0).toUpperCase()+e.slice(1)}class x8{constructor(t){this.options=t,this.supportedLngs=this.options.supportedLngs||!1,this.logger=fo.create("languageUtils")}getScriptPartFromCode(t){if(t=c0(t),!t||t.indexOf("-")<0)return null;const n=t.split("-");return n.length===2||(n.pop(),n[n.length-1].toLowerCase()==="x")?null:this.formatLanguageCode(n.join("-"))}getLanguagePartFromCode(t){if(t=c0(t),!t||t.indexOf("-")<0)return t;const n=t.split("-");return this.formatLanguageCode(n[0])}formatLanguageCode(t){if(typeof t=="string"&&t.indexOf("-")>-1){const n=["hans","hant","latn","cyrl","cans","mong","arab"];let r=t.split("-");return this.options.lowerCaseLng?r=r.map(i=>i.toLowerCase()):r.length===2?(r[0]=r[0].toLowerCase(),r[1]=r[1].toUpperCase(),n.indexOf(r[1].toLowerCase())>-1&&(r[1]=C_(r[1].toLowerCase()))):r.length===3&&(r[0]=r[0].toLowerCase(),r[1].length===2&&(r[1]=r[1].toUpperCase()),r[0]!=="sgn"&&r[2].length===2&&(r[2]=r[2].toUpperCase()),n.indexOf(r[1].toLowerCase())>-1&&(r[1]=C_(r[1].toLowerCase())),n.indexOf(r[2].toLowerCase())>-1&&(r[2]=C_(r[2].toLowerCase()))),r.join("-")}return this.options.cleanCode||this.options.lowerCaseLng?t.toLowerCase():t}isSupportedCode(t){return(this.options.load==="languageOnly"||this.options.nonExplicitSupportedLngs)&&(t=this.getLanguagePartFromCode(t)),!this.supportedLngs||!this.supportedLngs.length||this.supportedLngs.indexOf(t)>-1}getBestMatchFromCodes(t){if(!t)return null;let n;return t.forEach(r=>{if(n)return;const i=this.formatLanguageCode(r);(!this.options.supportedLngs||this.isSupportedCode(i))&&(n=i)}),!n&&this.options.supportedLngs&&t.forEach(r=>{if(n)return;const i=this.getLanguagePartFromCode(r);if(this.isSupportedCode(i))return n=i;n=this.options.supportedLngs.find(o=>{if(o===i)return o;if(!(o.indexOf("-")<0&&i.indexOf("-")<0)&&o.indexOf(i)===0)return o})}),n||(n=this.getFallbackCodes(this.options.fallbackLng)[0]),n}getFallbackCodes(t,n){if(!t)return[];if(typeof t=="function"&&(t=t(n)),typeof t=="string"&&(t=[t]),Object.prototype.toString.apply(t)==="[object Array]")return t;if(!n)return t.default||[];let r=t[n];return r||(r=t[this.getScriptPartFromCode(n)]),r||(r=t[this.formatLanguageCode(n)]),r||(r=t[this.getLanguagePartFromCode(n)]),r||(r=t.default),r||[]}toResolveHierarchy(t,n){const r=this.getFallbackCodes(n||this.options.fallbackLng||[],t),i=[],o=s=>{s&&(this.isSupportedCode(s)?i.push(s):this.logger.warn(`rejecting language code not found in supportedLngs: ${s}`))};return typeof t=="string"&&(t.indexOf("-")>-1||t.indexOf("_")>-1)?(this.options.load!=="languageOnly"&&o(this.formatLanguageCode(t)),this.options.load!=="languageOnly"&&this.options.load!=="currentOnly"&&o(this.getScriptPartFromCode(t)),this.options.load!=="currentOnly"&&o(this.getLanguagePartFromCode(t))):typeof t=="string"&&o(this.formatLanguageCode(t)),r.forEach(s=>{i.indexOf(s)<0&&o(this.formatLanguageCode(s))}),i}}let B1e=[{lngs:["ach","ak","am","arn","br","fil","gun","ln","mfe","mg","mi","oc","pt","pt-BR","tg","tl","ti","tr","uz","wa"],nr:[1,2],fc:1},{lngs:["af","an","ast","az","bg","bn","ca","da","de","dev","el","en","eo","es","et","eu","fi","fo","fur","fy","gl","gu","ha","hi","hu","hy","ia","it","kk","kn","ku","lb","mai","ml","mn","mr","nah","nap","nb","ne","nl","nn","no","nso","pa","pap","pms","ps","pt-PT","rm","sco","se","si","so","son","sq","sv","sw","ta","te","tk","ur","yo"],nr:[1,2],fc:2},{lngs:["ay","bo","cgg","fa","ht","id","ja","jbo","ka","km","ko","ky","lo","ms","sah","su","th","tt","ug","vi","wo","zh"],nr:[1],fc:3},{lngs:["be","bs","cnr","dz","hr","ru","sr","uk"],nr:[1,2,5],fc:4},{lngs:["ar"],nr:[0,1,2,3,11,100],fc:5},{lngs:["cs","sk"],nr:[1,2,5],fc:6},{lngs:["csb","pl"],nr:[1,2,5],fc:7},{lngs:["cy"],nr:[1,2,3,8],fc:8},{lngs:["fr"],nr:[1,2],fc:9},{lngs:["ga"],nr:[1,2,3,7,11],fc:10},{lngs:["gd"],nr:[1,2,3,20],fc:11},{lngs:["is"],nr:[1,2],fc:12},{lngs:["jv"],nr:[0,1],fc:13},{lngs:["kw"],nr:[1,2,3,4],fc:14},{lngs:["lt"],nr:[1,2,10],fc:15},{lngs:["lv"],nr:[1,2,0],fc:16},{lngs:["mk"],nr:[1,2],fc:17},{lngs:["mnk"],nr:[0,1,2],fc:18},{lngs:["mt"],nr:[1,2,11,20],fc:19},{lngs:["or"],nr:[2,1],fc:2},{lngs:["ro"],nr:[1,2,20],fc:20},{lngs:["sl"],nr:[5,1,2,3],fc:21},{lngs:["he","iw"],nr:[1,2,20,21],fc:22}],j1e={1:function(e){return+(e>1)},2:function(e){return+(e!=1)},3:function(e){return 0},4:function(e){return e%10==1&&e%100!=11?0:e%10>=2&&e%10<=4&&(e%100<10||e%100>=20)?1:2},5:function(e){return e==0?0:e==1?1:e==2?2:e%100>=3&&e%100<=10?3:e%100>=11?4:5},6:function(e){return e==1?0:e>=2&&e<=4?1:2},7:function(e){return e==1?0:e%10>=2&&e%10<=4&&(e%100<10||e%100>=20)?1:2},8:function(e){return e==1?0:e==2?1:e!=8&&e!=11?2:3},9:function(e){return+(e>=2)},10:function(e){return e==1?0:e==2?1:e<7?2:e<11?3:4},11:function(e){return e==1||e==11?0:e==2||e==12?1:e>2&&e<20?2:3},12:function(e){return+(e%10!=1||e%100==11)},13:function(e){return+(e!==0)},14:function(e){return e==1?0:e==2?1:e==3?2:3},15:function(e){return e%10==1&&e%100!=11?0:e%10>=2&&(e%100<10||e%100>=20)?1:2},16:function(e){return e%10==1&&e%100!=11?0:e!==0?1:2},17:function(e){return e==1||e%10==1&&e%100!=11?0:1},18:function(e){return e==0?0:e==1?1:2},19:function(e){return e==1?0:e==0||e%100>1&&e%100<11?1:e%100>10&&e%100<20?2:3},20:function(e){return e==1?0:e==0||e%100>0&&e%100<20?1:2},21:function(e){return e%100==1?1:e%100==2?2:e%100==3||e%100==4?3:0},22:function(e){return e==1?0:e==2?1:(e<0||e>10)&&e%10==0?2:3}};const V1e=["v1","v2","v3"],z1e=["v4"],C8={zero:0,one:1,two:2,few:3,many:4,other:5};function U1e(){const e={};return B1e.forEach(t=>{t.lngs.forEach(n=>{e[n]={numbers:t.nr,plurals:j1e[t.fc]}})}),e}class G1e{constructor(t){let n=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};this.languageUtils=t,this.options=n,this.logger=fo.create("pluralResolver"),(!this.options.compatibilityJSON||z1e.includes(this.options.compatibilityJSON))&&(typeof Intl>"u"||!Intl.PluralRules)&&(this.options.compatibilityJSON="v3",this.logger.error("Your environment seems not to be Intl API compatible, use an Intl.PluralRules polyfill. Will fallback to the compatibilityJSON v3 format handling.")),this.rules=U1e()}addRule(t,n){this.rules[t]=n}getRule(t){let n=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};if(this.shouldUseIntlApi())try{return new Intl.PluralRules(c0(t),{type:n.ordinal?"ordinal":"cardinal"})}catch{return}return this.rules[t]||this.rules[this.languageUtils.getLanguagePartFromCode(t)]}needsPlural(t){let n=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};const r=this.getRule(t,n);return this.shouldUseIntlApi()?r&&r.resolvedOptions().pluralCategories.length>1:r&&r.numbers.length>1}getPluralFormsOfKey(t,n){let r=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{};return this.getSuffixes(t,r).map(i=>`${n}${i}`)}getSuffixes(t){let n=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};const r=this.getRule(t,n);return r?this.shouldUseIntlApi()?r.resolvedOptions().pluralCategories.sort((i,o)=>C8[i]-C8[o]).map(i=>`${this.options.prepend}${n.ordinal?`ordinal${this.options.prepend}`:""}${i}`):r.numbers.map(i=>this.getSuffix(t,i,n)):[]}getSuffix(t,n){let r=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{};const i=this.getRule(t,r);return i?this.shouldUseIntlApi()?`${this.options.prepend}${r.ordinal?`ordinal${this.options.prepend}`:""}${i.select(n)}`:this.getSuffixRetroCompatible(i,n):(this.logger.warn(`no plural rule found for: ${t}`),"")}getSuffixRetroCompatible(t,n){const r=t.noAbs?t.plurals(n):t.plurals(Math.abs(n));let i=t.numbers[r];this.options.simplifyPluralSuffix&&t.numbers.length===2&&t.numbers[0]===1&&(i===2?i="plural":i===1&&(i=""));const o=()=>this.options.prepend&&i.toString()?this.options.prepend+i.toString():i.toString();return this.options.compatibilityJSON==="v1"?i===1?"":typeof i=="number"?`_plural_${i.toString()}`:o():this.options.compatibilityJSON==="v2"||this.options.simplifyPluralSuffix&&t.numbers.length===2&&t.numbers[0]===1?o():this.options.prepend&&r.toString()?this.options.prepend+r.toString():r.toString()}shouldUseIntlApi(){return!V1e.includes(this.options.compatibilityJSON)}}function T8(e,t,n){let r=arguments.length>3&&arguments[3]!==void 0?arguments[3]:".",i=arguments.length>4&&arguments[4]!==void 0?arguments[4]:!0,o=N1e(e,t,n);return!o&&i&&typeof n=="string"&&(o=u0(e,n,r),o===void 0&&(o=u0(t,n,r))),o}class H1e{constructor(){let t=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};this.logger=fo.create("interpolator"),this.options=t,this.format=t.interpolation&&t.interpolation.format||(n=>n),this.init(t)}init(){let t=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};t.interpolation||(t.interpolation={escapeValue:!0});const n=t.interpolation;this.escape=n.escape!==void 0?n.escape:L1e,this.escapeValue=n.escapeValue!==void 0?n.escapeValue:!0,this.useRawValueToEscape=n.useRawValueToEscape!==void 0?n.useRawValueToEscape:!1,this.prefix=n.prefix?fu(n.prefix):n.prefixEscaped||"{{",this.suffix=n.suffix?fu(n.suffix):n.suffixEscaped||"}}",this.formatSeparator=n.formatSeparator?n.formatSeparator:n.formatSeparator||",",this.unescapePrefix=n.unescapeSuffix?"":n.unescapePrefix||"-",this.unescapeSuffix=this.unescapePrefix?"":n.unescapeSuffix||"",this.nestingPrefix=n.nestingPrefix?fu(n.nestingPrefix):n.nestingPrefixEscaped||fu("$t("),this.nestingSuffix=n.nestingSuffix?fu(n.nestingSuffix):n.nestingSuffixEscaped||fu(")"),this.nestingOptionsSeparator=n.nestingOptionsSeparator?n.nestingOptionsSeparator:n.nestingOptionsSeparator||",",this.maxReplaces=n.maxReplaces?n.maxReplaces:1e3,this.alwaysFormat=n.alwaysFormat!==void 0?n.alwaysFormat:!1,this.resetRegExp()}reset(){this.options&&this.init(this.options)}resetRegExp(){const t=`${this.prefix}(.+?)${this.suffix}`;this.regexp=new RegExp(t,"g");const n=`${this.prefix}${this.unescapePrefix}(.+?)${this.unescapeSuffix}${this.suffix}`;this.regexpUnescape=new RegExp(n,"g");const r=`${this.nestingPrefix}(.+?)${this.nestingSuffix}`;this.nestingRegexp=new RegExp(r,"g")}interpolate(t,n,r,i){let o,s,a;const l=this.options&&this.options.interpolation&&this.options.interpolation.defaultVariables||{};function u(p){return p.replace(/\$/g,"$$$$")}const c=p=>{if(p.indexOf(this.formatSeparator)<0){const y=T8(n,l,p,this.options.keySeparator,this.options.ignoreJSONStructure);return this.alwaysFormat?this.format(y,void 0,r,{...i,...n,interpolationkey:p}):y}const m=p.split(this.formatSeparator),S=m.shift().trim(),v=m.join(this.formatSeparator).trim();return this.format(T8(n,l,S,this.options.keySeparator,this.options.ignoreJSONStructure),v,r,{...i,...n,interpolationkey:S})};this.resetRegExp();const d=i&&i.missingInterpolationHandler||this.options.missingInterpolationHandler,f=i&&i.interpolation&&i.interpolation.skipOnVariables!==void 0?i.interpolation.skipOnVariables:this.options.interpolation.skipOnVariables;return[{regex:this.regexpUnescape,safeValue:p=>u(p)},{regex:this.regexp,safeValue:p=>this.escapeValue?u(this.escape(p)):u(p)}].forEach(p=>{for(a=0;o=p.regex.exec(t);){const m=o[1].trim();if(s=c(m),s===void 0)if(typeof d=="function"){const v=d(t,o,i);s=typeof v=="string"?v:""}else if(i&&Object.prototype.hasOwnProperty.call(i,m))s="";else if(f){s=o[0];continue}else this.logger.warn(`missed to pass in variable ${m} for interpolating ${t}`),s="";else typeof s!="string"&&!this.useRawValueToEscape&&(s=b8(s));const S=p.safeValue(s);if(t=t.replace(o[0],S),f?(p.regex.lastIndex+=s.length,p.regex.lastIndex-=o[0].length):p.regex.lastIndex=0,a++,a>=this.maxReplaces)break}}),t}nest(t,n){let r=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{},i,o,s;function a(l,u){const c=this.nestingOptionsSeparator;if(l.indexOf(c)<0)return l;const d=l.split(new RegExp(`${c}[ ]*{`));let f=`{${d[1]}`;l=d[0],f=this.interpolate(f,s);const h=f.match(/'/g),p=f.match(/"/g);(h&&h.length%2===0&&!p||p.length%2!==0)&&(f=f.replace(/'/g,'"'));try{s=JSON.parse(f),u&&(s={...u,...s})}catch(m){return this.logger.warn(`failed parsing options string in nesting for key ${l}`,m),`${l}${c}${f}`}return delete s.defaultValue,l}for(;i=this.nestingRegexp.exec(t);){let l=[];s={...r},s=s.replace&&typeof s.replace!="string"?s.replace:s,s.applyPostProcessor=!1,delete s.defaultValue;let u=!1;if(i[0].indexOf(this.formatSeparator)!==-1&&!/{.*}/.test(i[1])){const c=i[1].split(this.formatSeparator).map(d=>d.trim());i[1]=c.shift(),l=c,u=!0}if(o=n(a.call(this,i[1].trim(),s),s),o&&i[0]===t&&typeof o!="string")return o;typeof o!="string"&&(o=b8(o)),o||(this.logger.warn(`missed to resolve ${i[1]} for nesting ${t}`),o=""),u&&(o=l.reduce((c,d)=>this.format(c,d,r.lng,{...r,interpolationkey:i[1].trim()}),o.trim())),t=t.replace(i[0],o),this.regexp.lastIndex=0}return t}}function q1e(e){let t=e.toLowerCase().trim();const n={};if(e.indexOf("(")>-1){const r=e.split("(");t=r[0].toLowerCase().trim();const i=r[1].substring(0,r[1].length-1);t==="currency"&&i.indexOf(":")<0?n.currency||(n.currency=i.trim()):t==="relativetime"&&i.indexOf(":")<0?n.range||(n.range=i.trim()):i.split(";").forEach(s=>{if(!s)return;const[a,...l]=s.split(":"),u=l.join(":").trim().replace(/^'+|'+$/g,"");n[a.trim()]||(n[a.trim()]=u),u==="false"&&(n[a.trim()]=!1),u==="true"&&(n[a.trim()]=!0),isNaN(u)||(n[a.trim()]=parseInt(u,10))})}return{formatName:t,formatOptions:n}}function hu(e){const t={};return function(r,i,o){const s=i+JSON.stringify(o);let a=t[s];return a||(a=e(c0(i),o),t[s]=a),a(r)}}class W1e{constructor(){let t=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};this.logger=fo.create("formatter"),this.options=t,this.formats={number:hu((n,r)=>{const i=new Intl.NumberFormat(n,{...r});return o=>i.format(o)}),currency:hu((n,r)=>{const i=new Intl.NumberFormat(n,{...r,style:"currency"});return o=>i.format(o)}),datetime:hu((n,r)=>{const i=new Intl.DateTimeFormat(n,{...r});return o=>i.format(o)}),relativetime:hu((n,r)=>{const i=new Intl.RelativeTimeFormat(n,{...r});return o=>i.format(o,r.range||"day")}),list:hu((n,r)=>{const i=new Intl.ListFormat(n,{...r});return o=>i.format(o)})},this.init(t)}init(t){const r=(arguments.length>1&&arguments[1]!==void 0?arguments[1]:{interpolation:{}}).interpolation;this.formatSeparator=r.formatSeparator?r.formatSeparator:r.formatSeparator||","}add(t,n){this.formats[t.toLowerCase().trim()]=n}addCached(t,n){this.formats[t.toLowerCase().trim()]=hu(n)}format(t,n,r){let i=arguments.length>3&&arguments[3]!==void 0?arguments[3]:{};return n.split(this.formatSeparator).reduce((a,l)=>{const{formatName:u,formatOptions:c}=q1e(l);if(this.formats[u]){let d=a;try{const f=i&&i.formatParams&&i.formatParams[i.interpolationkey]||{},h=f.locale||f.lng||i.locale||i.lng||r;d=this.formats[u](a,h,{...c,...i,...f})}catch(f){this.logger.warn(f)}return d}else this.logger.warn(`there was no format function for ${u}`);return a},t)}}function K1e(e,t){e.pending[t]!==void 0&&(delete e.pending[t],e.pendingCount--)}class Y1e extends T1{constructor(t,n,r){let i=arguments.length>3&&arguments[3]!==void 0?arguments[3]:{};super(),this.backend=t,this.store=n,this.services=r,this.languageUtils=r.languageUtils,this.options=i,this.logger=fo.create("backendConnector"),this.waitingReads=[],this.maxParallelReads=i.maxParallelReads||10,this.readingCalls=0,this.maxRetries=i.maxRetries>=0?i.maxRetries:5,this.retryTimeout=i.retryTimeout>=1?i.retryTimeout:350,this.state={},this.queue=[],this.backend&&this.backend.init&&this.backend.init(r,i.backend,i)}queueLoad(t,n,r,i){const o={},s={},a={},l={};return t.forEach(u=>{let c=!0;n.forEach(d=>{const f=`${u}|${d}`;!r.reload&&this.store.hasResourceBundle(u,d)?this.state[f]=2:this.state[f]<0||(this.state[f]===1?s[f]===void 0&&(s[f]=!0):(this.state[f]=1,c=!1,s[f]===void 0&&(s[f]=!0),o[f]===void 0&&(o[f]=!0),l[d]===void 0&&(l[d]=!0)))}),c||(a[u]=!0)}),(Object.keys(o).length||Object.keys(s).length)&&this.queue.push({pending:s,pendingCount:Object.keys(s).length,loaded:{},errors:[],callback:i}),{toLoad:Object.keys(o),pending:Object.keys(s),toLoadLanguages:Object.keys(a),toLoadNamespaces:Object.keys(l)}}loaded(t,n,r){const i=t.split("|"),o=i[0],s=i[1];n&&this.emit("failedLoading",o,s,n),r&&this.store.addResourceBundle(o,s,r),this.state[t]=n?-1:2;const a={};this.queue.forEach(l=>{M1e(l.loaded,[o],s),K1e(l,t),n&&l.errors.push(n),l.pendingCount===0&&!l.done&&(Object.keys(l.loaded).forEach(u=>{a[u]||(a[u]={});const c=l.loaded[u];c.length&&c.forEach(d=>{a[u][d]===void 0&&(a[u][d]=!0)})}),l.done=!0,l.errors.length?l.callback(l.errors):l.callback())}),this.emit("loaded",a),this.queue=this.queue.filter(l=>!l.done)}read(t,n,r){let i=arguments.length>3&&arguments[3]!==void 0?arguments[3]:0,o=arguments.length>4&&arguments[4]!==void 0?arguments[4]:this.retryTimeout,s=arguments.length>5?arguments[5]:void 0;if(!t.length)return s(null,{});if(this.readingCalls>=this.maxParallelReads){this.waitingReads.push({lng:t,ns:n,fcName:r,tried:i,wait:o,callback:s});return}this.readingCalls++;const a=(u,c)=>{if(this.readingCalls--,this.waitingReads.length>0){const d=this.waitingReads.shift();this.read(d.lng,d.ns,d.fcName,d.tried,d.wait,d.callback)}if(u&&c&&i{this.read.call(this,t,n,r,i+1,o*2,s)},o);return}s(u,c)},l=this.backend[r].bind(this.backend);if(l.length===2){try{const u=l(t,n);u&&typeof u.then=="function"?u.then(c=>a(null,c)).catch(a):a(null,u)}catch(u){a(u)}return}return l(t,n,a)}prepareLoading(t,n){let r=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{},i=arguments.length>3?arguments[3]:void 0;if(!this.backend)return this.logger.warn("No backend was added via i18next.use. Will not load resources."),i&&i();typeof t=="string"&&(t=this.languageUtils.toResolveHierarchy(t)),typeof n=="string"&&(n=[n]);const o=this.queueLoad(t,n,r,i);if(!o.toLoad.length)return o.pending.length||i(),null;o.toLoad.forEach(s=>{this.loadOne(s)})}load(t,n,r){this.prepareLoading(t,n,{},r)}reload(t,n,r){this.prepareLoading(t,n,{reload:!0},r)}loadOne(t){let n=arguments.length>1&&arguments[1]!==void 0?arguments[1]:"";const r=t.split("|"),i=r[0],o=r[1];this.read(i,o,"read",void 0,void 0,(s,a)=>{s&&this.logger.warn(`${n}loading namespace ${o} for language ${i} failed`,s),!s&&a&&this.logger.log(`${n}loaded namespace ${o} for language ${i}`,a),this.loaded(t,s,a)})}saveMissing(t,n,r,i,o){let s=arguments.length>5&&arguments[5]!==void 0?arguments[5]:{},a=arguments.length>6&&arguments[6]!==void 0?arguments[6]:()=>{};if(this.services.utils&&this.services.utils.hasLoadedNamespace&&!this.services.utils.hasLoadedNamespace(n)){this.logger.warn(`did not save key "${r}" as the namespace "${n}" was not yet loaded`,"This means something IS WRONG in your setup. You access the t function before i18next.init / i18next.loadNamespace / i18next.changeLanguage was done. Wait for the callback or Promise to resolve before accessing it!!!");return}if(!(r==null||r==="")){if(this.backend&&this.backend.create){const l={...s,isUpdate:o},u=this.backend.create.bind(this.backend);if(u.length<6)try{let c;u.length===5?c=u(t,n,r,i,l):c=u(t,n,r,i),c&&typeof c.then=="function"?c.then(d=>a(null,d)).catch(a):a(null,c)}catch(c){a(c)}else u(t,n,r,i,a,l)}!t||!t[0]||this.store.addResource(t[0],n,r,i)}}}function E8(){return{debug:!1,initImmediate:!0,ns:["translation"],defaultNS:["translation"],fallbackLng:["dev"],fallbackNS:!1,supportedLngs:!1,nonExplicitSupportedLngs:!1,load:"all",preload:!1,simplifyPluralSuffix:!0,keySeparator:".",nsSeparator:":",pluralSeparator:"_",contextSeparator:"_",partialBundledLanguages:!1,saveMissing:!1,updateMissing:!1,saveMissingTo:"fallback",saveMissingPlurals:!0,missingKeyHandler:!1,missingInterpolationHandler:!1,postProcess:!1,postProcessPassResolved:!1,returnNull:!1,returnEmptyString:!0,returnObjects:!1,joinArrays:!1,returnedObjectHandler:!1,parseMissingKeyHandler:!1,appendNamespaceToMissingKey:!1,appendNamespaceToCIMode:!1,overloadTranslationOptionHandler:function(t){let n={};if(typeof t[1]=="object"&&(n=t[1]),typeof t[1]=="string"&&(n.defaultValue=t[1]),typeof t[2]=="string"&&(n.tDescription=t[2]),typeof t[2]=="object"||typeof t[3]=="object"){const r=t[3]||t[2];Object.keys(r).forEach(i=>{n[i]=r[i]})}return n},interpolation:{escapeValue:!0,format:(e,t,n,r)=>e,prefix:"{{",suffix:"}}",formatSeparator:",",unescapePrefix:"-",nestingPrefix:"$t(",nestingSuffix:")",nestingOptionsSeparator:",",maxReplaces:1e3,skipOnVariables:!0}}}function P8(e){return typeof e.ns=="string"&&(e.ns=[e.ns]),typeof e.fallbackLng=="string"&&(e.fallbackLng=[e.fallbackLng]),typeof e.fallbackNS=="string"&&(e.fallbackNS=[e.fallbackNS]),e.supportedLngs&&e.supportedLngs.indexOf("cimode")<0&&(e.supportedLngs=e.supportedLngs.concat(["cimode"])),e}function Dg(){}function X1e(e){Object.getOwnPropertyNames(Object.getPrototypeOf(e)).forEach(n=>{typeof e[n]=="function"&&(e[n]=e[n].bind(e))})}class Dh extends T1{constructor(){let t=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},n=arguments.length>1?arguments[1]:void 0;if(super(),this.options=P8(t),this.services={},this.logger=fo,this.modules={external:[]},X1e(this),n&&!this.isInitialized&&!t.isClone){if(!this.options.initImmediate)return this.init(t,n),this;setTimeout(()=>{this.init(t,n)},0)}}init(){var t=this;let n=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},r=arguments.length>1?arguments[1]:void 0;typeof n=="function"&&(r=n,n={}),!n.defaultNS&&n.defaultNS!==!1&&n.ns&&(typeof n.ns=="string"?n.defaultNS=n.ns:n.ns.indexOf("translation")<0&&(n.defaultNS=n.ns[0]));const i=E8();this.options={...i,...this.options,...P8(n)},this.options.compatibilityAPI!=="v1"&&(this.options.interpolation={...i.interpolation,...this.options.interpolation}),n.keySeparator!==void 0&&(this.options.userDefinedKeySeparator=n.keySeparator),n.nsSeparator!==void 0&&(this.options.userDefinedNsSeparator=n.nsSeparator);function o(c){return c?typeof c=="function"?new c:c:null}if(!this.options.isClone){this.modules.logger?fo.init(o(this.modules.logger),this.options):fo.init(null,this.options);let c;this.modules.formatter?c=this.modules.formatter:typeof Intl<"u"&&(c=W1e);const d=new x8(this.options);this.store=new _8(this.options.resources,this.options);const f=this.services;f.logger=fo,f.resourceStore=this.store,f.languageUtils=d,f.pluralResolver=new G1e(d,{prepend:this.options.pluralSeparator,compatibilityJSON:this.options.compatibilityJSON,simplifyPluralSuffix:this.options.simplifyPluralSuffix}),c&&(!this.options.interpolation.format||this.options.interpolation.format===i.interpolation.format)&&(f.formatter=o(c),f.formatter.init(f,this.options),this.options.interpolation.format=f.formatter.format.bind(f.formatter)),f.interpolator=new H1e(this.options),f.utils={hasLoadedNamespace:this.hasLoadedNamespace.bind(this)},f.backendConnector=new Y1e(o(this.modules.backend),f.resourceStore,f,this.options),f.backendConnector.on("*",function(h){for(var p=arguments.length,m=new Array(p>1?p-1:0),S=1;S1?p-1:0),S=1;S{h.init&&h.init(this)})}if(this.format=this.options.interpolation.format,r||(r=Dg),this.options.fallbackLng&&!this.services.languageDetector&&!this.options.lng){const c=this.services.languageUtils.getFallbackCodes(this.options.fallbackLng);c.length>0&&c[0]!=="dev"&&(this.options.lng=c[0])}!this.services.languageDetector&&!this.options.lng&&this.logger.warn("init: no languageDetector is used and no lng is defined"),["getResource","hasResourceBundle","getResourceBundle","getDataByLanguage"].forEach(c=>{this[c]=function(){return t.store[c](...arguments)}}),["addResource","addResources","addResourceBundle","removeResourceBundle"].forEach(c=>{this[c]=function(){return t.store[c](...arguments),t}});const l=Md(),u=()=>{const c=(d,f)=>{this.isInitialized&&!this.initializedStoreOnce&&this.logger.warn("init: i18next is already initialized. You should call init just once!"),this.isInitialized=!0,this.options.isClone||this.logger.log("initialized",this.options),this.emit("initialized",this.options),l.resolve(f),r(d,f)};if(this.languages&&this.options.compatibilityAPI!=="v1"&&!this.isInitialized)return c(null,this.t.bind(this));this.changeLanguage(this.options.lng,c)};return this.options.resources||!this.options.initImmediate?u():setTimeout(u,0),l}loadResources(t){let r=arguments.length>1&&arguments[1]!==void 0?arguments[1]:Dg;const i=typeof t=="string"?t:this.language;if(typeof t=="function"&&(r=t),!this.options.resources||this.options.partialBundledLanguages){if(i&&i.toLowerCase()==="cimode")return r();const o=[],s=a=>{if(!a)return;this.services.languageUtils.toResolveHierarchy(a).forEach(u=>{o.indexOf(u)<0&&o.push(u)})};i?s(i):this.services.languageUtils.getFallbackCodes(this.options.fallbackLng).forEach(l=>s(l)),this.options.preload&&this.options.preload.forEach(a=>s(a)),this.services.backendConnector.load(o,this.options.ns,a=>{!a&&!this.resolvedLanguage&&this.language&&this.setResolvedLanguage(this.language),r(a)})}else r(null)}reloadResources(t,n,r){const i=Md();return t||(t=this.languages),n||(n=this.options.ns),r||(r=Dg),this.services.backendConnector.reload(t,n,o=>{i.resolve(),r(o)}),i}use(t){if(!t)throw new Error("You are passing an undefined module! Please check the object you are passing to i18next.use()");if(!t.type)throw new Error("You are passing a wrong module! Please check the object you are passing to i18next.use()");return t.type==="backend"&&(this.modules.backend=t),(t.type==="logger"||t.log&&t.warn&&t.error)&&(this.modules.logger=t),t.type==="languageDetector"&&(this.modules.languageDetector=t),t.type==="i18nFormat"&&(this.modules.i18nFormat=t),t.type==="postProcessor"&&FF.addPostProcessor(t),t.type==="formatter"&&(this.modules.formatter=t),t.type==="3rdParty"&&this.modules.external.push(t),this}setResolvedLanguage(t){if(!(!t||!this.languages)&&!(["cimode","dev"].indexOf(t)>-1))for(let n=0;n-1)&&this.store.hasLanguageSomeTranslations(r)){this.resolvedLanguage=r;break}}}changeLanguage(t,n){var r=this;this.isLanguageChangingTo=t;const i=Md();this.emit("languageChanging",t);const o=l=>{this.language=l,this.languages=this.services.languageUtils.toResolveHierarchy(l),this.resolvedLanguage=void 0,this.setResolvedLanguage(l)},s=(l,u)=>{u?(o(u),this.translator.changeLanguage(u),this.isLanguageChangingTo=void 0,this.emit("languageChanged",u),this.logger.log("languageChanged",u)):this.isLanguageChangingTo=void 0,i.resolve(function(){return r.t(...arguments)}),n&&n(l,function(){return r.t(...arguments)})},a=l=>{!t&&!l&&this.services.languageDetector&&(l=[]);const u=typeof l=="string"?l:this.services.languageUtils.getBestMatchFromCodes(l);u&&(this.language||o(u),this.translator.language||this.translator.changeLanguage(u),this.services.languageDetector&&this.services.languageDetector.cacheUserLanguage&&this.services.languageDetector.cacheUserLanguage(u)),this.loadResources(u,c=>{s(c,u)})};return!t&&this.services.languageDetector&&!this.services.languageDetector.async?a(this.services.languageDetector.detect()):!t&&this.services.languageDetector&&this.services.languageDetector.async?this.services.languageDetector.detect.length===0?this.services.languageDetector.detect().then(a):this.services.languageDetector.detect(a):a(t),i}getFixedT(t,n,r){var i=this;const o=function(s,a){let l;if(typeof a!="object"){for(var u=arguments.length,c=new Array(u>2?u-2:0),d=2;d`${l.keyPrefix}${f}${p}`):h=l.keyPrefix?`${l.keyPrefix}${f}${s}`:s,i.t(h,l)};return typeof t=="string"?o.lng=t:o.lngs=t,o.ns=n,o.keyPrefix=r,o}t(){return this.translator&&this.translator.translate(...arguments)}exists(){return this.translator&&this.translator.exists(...arguments)}setDefaultNamespace(t){this.options.defaultNS=t}hasLoadedNamespace(t){let n=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};if(!this.isInitialized)return this.logger.warn("hasLoadedNamespace: i18next was not initialized",this.languages),!1;if(!this.languages||!this.languages.length)return this.logger.warn("hasLoadedNamespace: i18n.languages were undefined or empty",this.languages),!1;const r=n.lng||this.resolvedLanguage||this.languages[0],i=this.options?this.options.fallbackLng:!1,o=this.languages[this.languages.length-1];if(r.toLowerCase()==="cimode")return!0;const s=(a,l)=>{const u=this.services.backendConnector.state[`${a}|${l}`];return u===-1||u===2};if(n.precheck){const a=n.precheck(this,s);if(a!==void 0)return a}return!!(this.hasResourceBundle(r,t)||!this.services.backendConnector.backend||this.options.resources&&!this.options.partialBundledLanguages||s(r,t)&&(!i||s(o,t)))}loadNamespaces(t,n){const r=Md();return this.options.ns?(typeof t=="string"&&(t=[t]),t.forEach(i=>{this.options.ns.indexOf(i)<0&&this.options.ns.push(i)}),this.loadResources(i=>{r.resolve(),n&&n(i)}),r):(n&&n(),Promise.resolve())}loadLanguages(t,n){const r=Md();typeof t=="string"&&(t=[t]);const i=this.options.preload||[],o=t.filter(s=>i.indexOf(s)<0);return o.length?(this.options.preload=i.concat(o),this.loadResources(s=>{r.resolve(),n&&n(s)}),r):(n&&n(),Promise.resolve())}dir(t){if(t||(t=this.resolvedLanguage||(this.languages&&this.languages.length>0?this.languages[0]:this.language)),!t)return"rtl";const n=["ar","shu","sqr","ssh","xaa","yhd","yud","aao","abh","abv","acm","acq","acw","acx","acy","adf","ads","aeb","aec","afb","ajp","apc","apd","arb","arq","ars","ary","arz","auz","avl","ayh","ayl","ayn","ayp","bbz","pga","he","iw","ps","pbt","pbu","pst","prp","prd","ug","ur","ydd","yds","yih","ji","yi","hbo","men","xmn","fa","jpr","peo","pes","prs","dv","sam","ckb"],r=this.services&&this.services.languageUtils||new x8(E8());return n.indexOf(r.getLanguagePartFromCode(t))>-1||t.toLowerCase().indexOf("-arab")>1?"rtl":"ltr"}static createInstance(){let t=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},n=arguments.length>1?arguments[1]:void 0;return new Dh(t,n)}cloneInstance(){let t=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},n=arguments.length>1&&arguments[1]!==void 0?arguments[1]:Dg;const r=t.forkResourceStore;r&&delete t.forkResourceStore;const i={...this.options,...t,isClone:!0},o=new Dh(i);return(t.debug!==void 0||t.prefix!==void 0)&&(o.logger=o.logger.clone(t)),["store","services","language"].forEach(a=>{o[a]=this[a]}),o.services={...this.services},o.services.utils={hasLoadedNamespace:o.hasLoadedNamespace.bind(o)},r&&(o.store=new _8(this.store.data,i),o.services.resourceStore=o.store),o.translator=new d0(o.services,i),o.translator.on("*",function(a){for(var l=arguments.length,u=new Array(l>1?l-1:0),c=1;ctypeof e=="string"?{title:e,status:"info",isClosable:!0,duration:2500}:{status:"info",isClosable:!0,duration:2500,...e},jke=()=>{const e=Zc(),t=Qf(qce),n=wse();return E.useEffect(()=>{t.forEach(r=>{n(r)}),t.length>0&&e(Q1e())},[e,n,t]),null},Vke=()=>{const e=Zc();return E.useCallback(n=>e(qt(ho(n))),[e])},BF={isConnected:!1,isProcessing:!1,shouldDisplayGuides:!0,isGFPGANAvailable:!0,isESRGANAvailable:!0,shouldConfirmOnDelete:!0,currentStep:0,totalSteps:0,currentIteration:0,totalIterations:0,currentStatusHasSteps:!1,isCancelable:!0,enableImageDebugging:!1,toastQueue:[],progressImage:null,shouldAntialiasProgressImage:!1,sessionId:null,cancelType:"immediate",isCancelScheduled:!1,subscribedNodeIds:[],wereModelsReceived:!1,wasSchemaParsed:!1,consoleLogLevel:"debug",shouldLogToConsole:!0,statusTranslationKey:"common.statusDisconnected",canceledSession:"",isPersisted:!1,language:"en",isUploading:!1},jF=Vt({name:"system",initialState:BF,reducers:{setIsProcessing:(e,t)=>{e.isProcessing=t.payload},setCurrentStatus:(e,t)=>{e.statusTranslationKey=t.payload},setShouldConfirmOnDelete:(e,t)=>{e.shouldConfirmOnDelete=t.payload},setShouldDisplayGuides:(e,t)=>{e.shouldDisplayGuides=t.payload},setIsCancelable:(e,t)=>{e.isCancelable=t.payload},setEnableImageDebugging:(e,t)=>{e.enableImageDebugging=t.payload},addToast:(e,t)=>{e.toastQueue.push(t.payload)},clearToastQueue:e=>{e.toastQueue=[]},cancelScheduled:e=>{e.isCancelScheduled=!0},scheduledCancelAborted:e=>{e.isCancelScheduled=!1},cancelTypeChanged:(e,t)=>{e.cancelType=t.payload},subscribedNodeIdsSet:(e,t)=>{e.subscribedNodeIds=t.payload},consoleLogLevelChanged:(e,t)=>{e.consoleLogLevel=t.payload},shouldLogToConsoleChanged:(e,t)=>{e.shouldLogToConsole=t.payload},shouldAntialiasProgressImageChanged:(e,t)=>{e.shouldAntialiasProgressImage=t.payload},isPersistedChanged:(e,t)=>{e.isPersisted=t.payload},languageChanged:(e,t)=>{e.language=t.payload},progressImageSet(e,t){e.progressImage=t.payload}},extraReducers(e){e.addCase(VL,(t,n)=>{t.sessionId=n.payload.sessionId,t.boardIdToAddTo=n.payload.boardId,t.canceledSession=""}),e.addCase(UL,t=>{t.sessionId=null,t.boardIdToAddTo=void 0}),e.addCase(FL,t=>{t.isConnected=!0,t.isCancelable=!0,t.isProcessing=!1,t.currentStatusHasSteps=!1,t.currentStep=0,t.totalSteps=0,t.currentIteration=0,t.totalIterations=0,t.statusTranslationKey="common.statusConnected"}),e.addCase(jL,t=>{t.isConnected=!1,t.isProcessing=!1,t.isCancelable=!0,t.currentStatusHasSteps=!1,t.currentStep=0,t.totalSteps=0,t.statusTranslationKey="common.statusDisconnected"}),e.addCase(HL,t=>{t.isCancelable=!0,t.isProcessing=!0,t.currentStatusHasSteps=!1,t.currentStep=0,t.totalSteps=0,t.statusTranslationKey="common.statusGenerating"}),e.addCase(QL,(t,n)=>{const{step:r,total_steps:i,progress_image:o}=n.payload.data;t.isProcessing=!0,t.isCancelable=!0,t.currentStatusHasSteps=!0,t.currentStep=r+1,t.totalSteps=i,t.progressImage=o??null,t.statusTranslationKey="common.statusGenerating"}),e.addCase(qL,(t,n)=>{const{data:r}=n.payload;t.currentStatusHasSteps=!1,t.currentStep=0,t.totalSteps=0,t.statusTranslationKey="common.statusProcessingComplete",t.canceledSession===r.graph_execution_state_id&&(t.isProcessing=!1,t.isCancelable=!0)}),e.addCase(_3,t=>{t.isProcessing=!1,t.isCancelable=!0,t.currentStatusHasSteps=!1,t.currentStep=0,t.totalSteps=0,t.statusTranslationKey="common.statusError",t.progressImage=null,t.toastQueue.push(ho({title:ol("toast.serverError"),status:"error"}))}),e.addCase(YL,t=>{t.isProcessing=!1,t.isCancelable=!1,t.isCancelScheduled=!1,t.currentStep=0,t.totalSteps=0,t.statusTranslationKey="common.statusConnected",t.progressImage=null}),e.addCase(Op,t=>{t.isProcessing=!0,t.isCancelable=!0,t.currentStatusHasSteps=!1,t.statusTranslationKey="common.statusPreparing"}),e.addCase(zl.fulfilled,(t,n)=>{t.canceledSession=n.meta.arg.session_id,t.isProcessing=!1,t.isCancelable=!1,t.isCancelScheduled=!1,t.currentStep=0,t.totalSteps=0,t.statusTranslationKey="common.statusConnected",t.progressImage=null,t.toastQueue.push(ho({title:ol("toast.canceled"),status:"warning"}))}),e.addCase(B3,t=>{t.wasSchemaParsed=!0}),e.addCase(Br.pending,t=>{t.isUploading=!0}),e.addCase(Br.rejected,t=>{t.isUploading=!1}),e.addCase(Br.fulfilled,t=>{t.isUploading=!1}),e.addMatcher(lL,(t,n)=>{t.isProcessing=!1,t.isCancelable=!1,t.isCancelScheduled=!1,t.currentStep=0,t.totalSteps=0,t.statusTranslationKey="common.statusConnected",t.progressImage=null,t.toastQueue.push(ho({title:ol("toast.serverError"),status:"error"}))})}}),{setIsProcessing:zke,setShouldConfirmOnDelete:Uke,setCurrentStatus:Gke,setShouldDisplayGuides:Hke,setIsCancelable:qke,setEnableImageDebugging:Wke,addToast:qt,clearToastQueue:Q1e,cancelScheduled:Kke,scheduledCancelAborted:Yke,cancelTypeChanged:Xke,subscribedNodeIdsSet:Qke,consoleLogLevelChanged:Zke,shouldLogToConsoleChanged:Jke,isPersistedChanged:e8e,shouldAntialiasProgressImageChanged:t8e,languageChanged:n8e,progressImageSet:Z1e}=jF.actions,J1e=jF.reducer,ebe={searchFolder:null,advancedAddScanModel:null},VF=Vt({name:"modelmanager",initialState:ebe,reducers:{setSearchFolder:(e,t)=>{e.searchFolder=t.payload},setAdvancedAddScanModel:(e,t)=>{e.advancedAddScanModel=t.payload}}}),{setSearchFolder:r8e,setAdvancedAddScanModel:i8e}=VF.actions,tbe=VF.reducer,k8=ve.child({namespace:"canvas"}),nbe=()=>{fe({actionCreator:yhe,effect:async(e,{dispatch:t,getState:n})=>{const r=n(),{sessionId:i,isProcessing:o}=r.system,s=e.payload;if(o){if(!s){k8.debug("No canvas session, skipping cancel");return}if(s!==i){k8.debug({data:{canvasSessionId:s,session_id:i}},"Canvas session does not match global session, skipping cancel");return}t(zl({session_id:i}))}}})},zF=Eo.injectEndpoints({endpoints:e=>({getAppVersion:e.query({query:()=>({url:"app/version",method:"GET"}),keepUnusedDataFor:864e5}),getAppConfig:e.query({query:()=>({url:"app/config",method:"GET"}),keepUnusedDataFor:864e5})})}),{useGetAppVersionQuery:o8e,useGetAppConfigQuery:s8e}=zF,rbe=()=>{fe({matcher:zF.endpoints.getAppConfig.matchFulfilled,effect:async(e,{getState:t,dispatch:n})=>{const{infill_methods:r}=e.payload,i=t().generation.infillMethod;r.includes(i)||n(jce(r[0]))}})},ibe=ge("app/appStarted"),obe=()=>{fe({actionCreator:ibe,effect:async(e,{getState:t,dispatch:n,unsubscribe:r,cancelActiveListeners:i})=>{i(),r(),await n(ua({categories:g1,is_intermediate:!1,offset:0,limit:wk})),await n(ua({categories:m1,is_intermediate:!1,offset:0,limit:wk})),n(Cpe(!1))}})};ve.child({namespace:"boards"});const sbe=()=>{fe({actionCreator:xk,effect:(e,{getState:t,dispatch:n})=>{var c;const r=e.payload,i=t(),o=TL(i);if(r==="all"){n(hl(((c=o[0])==null?void 0:c.image_name)??null));return}if(r==="batch"){n(hl(i.gallery.batchImageNames[0]??null));return}const s=v1(i),a=i.gallery.galleryView==="images"?g1:m1,{data:l}=Th.endpoints.listAllBoards.select()(i),u=l==null?void 0:l.find(d=>d.board_id===r);if(!u){n(xk("all"));return}n(hl(u.cover_image_name??null)),s.length{fe({actionCreator:UF,effect:async(e,{dispatch:t,getState:n,condition:r})=>{const{board:i,imagesUsage:o}=e.payload,{board_id:s}=i,a=n(),l=a.gallery.selection[a.gallery.selection.length-1],u=l?Qa(a,l):void 0;u&&u.board_id===s&&t(hl(null)),o.isCanvasImage&&t(fL()),o.isControlNetImage&&t(n$()),o.isInitialImage&&t(OD()),o.isNodesImage&&t(NF());const c=TL(a).reduce((p,m)=>(m.board_id===s&&p.push(m.image_name),p),[]);t(xpe(c)),t(Th.endpoints.deleteBoardAndImages.initiate(s));const d=Th.endpoints.deleteBoardAndImages.select(s)(a),{isSuccess:f}=d;await r(()=>!!f,3e4)&&t(Eo.util.invalidateTags([{type:"Board",id:s},{type:"Image",id:bn}]))}})},lbe=ge("canvas/canvasSavedToGallery"),ube=ge("canvas/canvasCopiedToClipboard"),cbe=ge("canvas/canvasDownloadedAsImage"),dbe=ge("canvas/canvasMerged"),fbe=ge("canvas/stagingAreaImageSaved");let GF=null,HF=null;const u8e=e=>{GF=e},E1=()=>GF,c8e=e=>{HF=e},hbe=()=>HF,pbe=async e=>new Promise((t,n)=>{e.toBlob(r=>{if(r){t(r);return}n("Unable to create Blob")})}),f0=async(e,t)=>await pbe(e.toCanvas(t)),V3=async e=>{const t=E1();if(!t)return;const{shouldCropToBoundingBoxOnSave:n,boundingBoxCoordinates:r,boundingBoxDimensions:i}=e.canvas,o=t.clone();o.scale({x:1,y:1});const s=o.getAbsolutePosition(),a=n?{x:r.x+s.x,y:r.y+s.y,width:i.width,height:i.height}:o.getClientRect();return f0(o,a)},gbe=e=>{navigator.clipboard.write([new ClipboardItem({[e.type]:e})])},mbe=ve.child({namespace:"canvasCopiedToClipboardListener"}),ybe=()=>{fe({actionCreator:ube,effect:async(e,{dispatch:t,getState:n})=>{const r=n(),i=await V3(r);if(!i){mbe.error("Problem getting base layer blob"),t(qt({title:"Problem Copying Canvas",description:"Unable to export base layer",status:"error"}));return}gbe(i),t(qt({title:"Canvas Copied to Clipboard",status:"success"}))}})},vbe=(e,t)=>{const n=URL.createObjectURL(e),r=document.createElement("a");r.href=n,r.download=t,document.body.appendChild(r),r.click(),document.body.removeChild(r),r.remove()},bbe=ve.child({namespace:"canvasSavedToGalleryListener"}),Sbe=()=>{fe({actionCreator:cbe,effect:async(e,{dispatch:t,getState:n})=>{const r=n(),i=await V3(r);if(!i){bbe.error("Problem getting base layer blob"),t(qt({title:"Problem Downloading Canvas",description:"Unable to export base layer",status:"error"}));return}vbe(i,"canvas.png"),t(qt({title:"Canvas Downloaded",status:"success"}))}})},_be=async()=>{const e=E1();if(!e)return;const t=e.clone();return t.scale({x:1,y:1}),f0(t,t.getClientRect())},A8=ve.child({namespace:"canvasCopiedToClipboardListener"}),wbe=()=>{fe({actionCreator:dbe,effect:async(e,{dispatch:t,getState:n,take:r})=>{const i=await _be();if(!i){A8.error("Problem getting base layer blob"),t(qt({title:"Problem Merging Canvas",description:"Unable to export base layer",status:"error"}));return}const o=E1();if(!o){A8.error("Problem getting canvas base layer"),t(qt({title:"Problem Merging Canvas",description:"Unable to export base layer",status:"error"}));return}const s=o.getClientRect({relativeTo:o.getParent()}),a=t(Br({file:new File([i],"mergedCanvas.png",{type:"image/png"}),image_category:"general",is_intermediate:!0,postUploadAction:{type:"TOAST_CANVAS_MERGED"}})),[{payload:l}]=await r(c=>Br.fulfilled.match(c)&&c.meta.requestId===a.requestId),{image_name:u}=l;t(vhe({kind:"image",layer:"base",imageName:u,...s})),t(qt({title:"Canvas Merged",status:"success"}))}})},xbe=ve.child({namespace:"canvasSavedToGalleryListener"}),Cbe=()=>{fe({actionCreator:lbe,effect:async(e,{dispatch:t,getState:n,take:r})=>{const i=n(),o=await V3(i);if(!o){xbe.error("Problem getting base layer blob"),t(qt({title:"Problem Saving Canvas",description:"Unable to export base layer",status:"error"}));return}const s=t(Br({file:new File([o],"savedCanvas.png",{type:"image/png"}),image_category:"general",is_intermediate:!1,postUploadAction:{type:"TOAST_CANVAS_SAVED_TO_GALLERY"}})),[{payload:a}]=await r(l=>Br.fulfilled.match(l)&&l.meta.requestId===s.requestId);t(y1(a))}})},Tbe=ve.child({namespace:"controlNet"}),Ebe=(e,t,n)=>{if(!(zpe.match(e)||Ak.match(e)||x3.match(e)||Upe.match(e)||Ok.match(e))||Ok.match(e)&&n.controlNet.controlNets[e.payload.controlNetId].shouldAutoConfig===!0)return!1;const{controlImage:i,processorType:o,shouldAutoConfig:s}=t.controlNet.controlNets[e.payload.controlNetId];if(Ak.match(e)&&!s)return!1;const a=o!=="none",l=t.system.isProcessing;return a&&!l&&!!i},Pbe=()=>{fe({predicate:Ebe,effect:async(e,{dispatch:t,getState:n,cancelActiveListeners:r,delay:i})=>{const{controlNetId:o}=e.payload;r(),Tbe.trace({data:e.payload},"ControlNet auto-process triggered"),await i(300),t(w3({controlNetId:o}))}})},Ul=ge("system/sessionReadyToInvoke"),kbe=e=>Pn(e)&&"image_name"in e&&Hs(e==null?void 0:e.image_name)&&"thumbnail_url"in e&&Hs(e==null?void 0:e.thumbnail_url)&&"image_url"in e&&Hs(e==null?void 0:e.image_url)&&"image_origin"in e&&Hs(e==null?void 0:e.image_origin)&&"created_at"in e&&Hs(e==null?void 0:e.created_at),qF=e=>(e==null?void 0:e.type)==="image_output",Abe=e=>Hs(e)&&["internal","external"].includes(e),d8e=e=>Pn(e)&&Hs(Y2(e,"image_name"))&&Abe(Y2(e,"image_origin")),O8=ve.child({namespace:"controlNet"}),Obe=()=>{fe({actionCreator:w3,effect:async(e,{dispatch:t,getState:n,take:r,unsubscribe:i,subscribe:o})=>{const{controlNetId:s}=e.payload,a=n().controlNet.controlNets[s];if(!a.controlImage){O8.error("Unable to process ControlNet image");return}const l={nodes:{[a.processorNode.id]:{...a.processorNode,is_intermediate:!0,image:{image_name:a.controlImage}}}},u=t(Un({graph:l})),[c]=await r(h=>Un.fulfilled.match(h)&&h.meta.requestId===u.requestId),d=c.payload.id;t(Ul());const[f]=await r(h=>S3.match(h)&&h.payload.data.graph_execution_state_id===d);if(qF(f.payload.data.result)){const{image_name:h}=f.payload.data.result.image,[p]=await r(S=>Eh.fulfilled.match(S)&&S.payload.image_name===h),m=p.payload;O8.debug({data:{arg:e.payload,processedControlImage:m}},"ControlNet image processed"),t(Vpe({controlNetId:s,processedControlImage:m.image_name}))}}})},si=Eo.injectEndpoints({endpoints:e=>({listBoardImages:e.query({query:({board_id:t,offset:n,limit:r})=>({url:`board_images/${t}`,method:"GET"}),providesTags:(t,n,r)=>{const i=[{type:"BoardImage",id:`${r.board_id}_${bn}`}];return t&&i.push(...t.items.map(({board_id:o,image_name:s})=>({type:"BoardImage",id:`${o}_${s}`}))),i}}),addImageToBoard:e.mutation({query:({board_id:t,image_name:n})=>({url:"board_images/",method:"POST",body:{board_id:t,image_name:n}}),invalidatesTags:(t,n,r)=>[{type:"BoardImage"},{type:"Board",id:r.board_id}]}),removeImageFromBoard:e.mutation({query:({board_id:t,image_name:n})=>({url:"board_images/",method:"DELETE",body:{board_id:t,image_name:n}}),invalidatesTags:(t,n,r)=>[{type:"BoardImage"},{type:"Board",id:r.board_id}]})})}),{useAddImageToBoardMutation:Rbe,useRemoveImageFromBoardMutation:f8e,useListBoardImagesQuery:h8e}=si,WF=ve.child({namespace:"boards"}),Ibe=()=>{fe({matcher:si.endpoints.addImageToBoard.matchFulfilled,effect:(e,{getState:t,dispatch:n})=>{const{board_id:r,image_name:i}=e.meta.arg.originalArgs;WF.debug({data:{board_id:r,image_name:i}},"Image added to board")}})},Mbe=()=>{fe({matcher:si.endpoints.addImageToBoard.matchRejected,effect:(e,{getState:t,dispatch:n})=>{const{board_id:r,image_name:i}=e.meta.arg.originalArgs;WF.debug({data:{board_id:r,image_name:i}},"Problem adding image to board")}})},KF=ve.child({namespace:"image"}),Nbe=()=>{fe({actionCreator:l$,effect:async(e,{dispatch:t,getState:n,condition:r})=>{const{imageDTO:i,imageUsage:o}=e.payload;t(a$(!1));const{image_name:s}=i,a=n();if(a.gallery.selection[a.gallery.selection.length-1]===s){const d=kpe(a,s);t(hl(d||null))}o.isCanvasImage&&t(fL()),o.isControlNetImage&&t(n$()),o.isInitialImage&&t(OD()),o.isNodesImage&&t(NF()),t(wpe(s));const{requestId:u}=t(Lc({image_name:s}));await r(d=>Lc.fulfilled.match(d)&&d.meta.requestId===u,3e4)&&t(Eo.util.invalidateTags([{type:"Board",id:i.board_id}]))}})},Dbe=()=>{fe({actionCreator:Lc.pending,effect:(e,{dispatch:t,getState:n})=>{}})},Lbe=()=>{fe({actionCreator:Lc.fulfilled,effect:(e,{dispatch:t,getState:n})=>{KF.debug({data:{image:e.meta.arg}},"Image deleted")}})},$be=()=>{fe({actionCreator:Lc.rejected,effect:(e,{dispatch:t,getState:n})=>{KF.debug({data:{image:e.meta.arg}},"Unable to delete image")}})},Fbe=ve.child({namespace:"dnd"}),YF=ge("dnd/dndDropped"),Bbe=()=>{fe({actionCreator:YF,effect:async(e,{dispatch:t,getState:n,take:r})=>{const{activeData:i,overData:o}=e.payload;if(n(),Fbe.debug({data:{activeData:i,overData:o}},"Image or selection dropped"),o.actionType==="SET_CURRENT_IMAGE"&&i.payloadType==="IMAGE_DTO"&&i.payload.imageDTO){t(hl(i.payload.imageDTO.image_name));return}if(o.actionType==="SET_INITIAL_IMAGE"&&i.payloadType==="IMAGE_DTO"&&i.payload.imageDTO){t(Sh(i.payload.imageDTO));return}if(o.actionType==="ADD_TO_BATCH"&&i.payloadType==="IMAGE_DTO"&&i.payload.imageDTO){t(Kw([i.payload.imageDTO.image_name]));return}if(o.actionType==="ADD_TO_BATCH"&&i.payloadType==="IMAGE_NAMES"){t(Kw(i.payload.image_names));return}if(o.actionType==="SET_CONTROLNET_IMAGE"&&i.payloadType==="IMAGE_DTO"&&i.payload.imageDTO){const{controlNetId:s}=o.context;t(x3({controlImage:i.payload.imageDTO.image_name,controlNetId:s}));return}if(o.actionType==="SET_CANVAS_INITIAL_IMAGE"&&i.payloadType==="IMAGE_DTO"&&i.payload.imageDTO){t(hL(i.payload.imageDTO));return}if(o.actionType==="SET_NODES_IMAGE"&&i.payloadType==="IMAGE_DTO"&&i.payload.imageDTO){const{fieldName:s,nodeId:a}=o.context;t(hx({nodeId:a,fieldName:s,value:i.payload.imageDTO}));return}if(o.actionType==="SET_MULTI_NODES_IMAGE"&&i.payloadType==="IMAGE_DTO"&&i.payload.imageDTO){const{fieldName:s,nodeId:a}=o.context;t(hx({nodeId:a,fieldName:s,value:[i.payload.imageDTO]}));return}if(o.actionType==="SET_MULTI_NODES_IMAGE"&&i.payloadType==="IMAGE_NAMES"){const{fieldName:s,nodeId:a}=o.context;t(P1e({nodeId:a,fieldName:s,value:i.payload.image_names.map(l=>({image_name:l}))}));return}if(o.actionType==="MOVE_BOARD"&&i.payloadType==="IMAGE_DTO"&&i.payload.imageDTO&&o.context.boardId){const{image_name:s}=i.payload.imageDTO,{boardId:a}=o.context;t(si.endpoints.addImageToBoard.initiate({image_name:s,board_id:a}));return}if(o.actionType==="MOVE_BOARD"&&i.payloadType==="IMAGE_DTO"&&i.payload.imageDTO&&o.context.boardId===null){const{image_name:s,board_id:a}=i.payload.imageDTO;a&&t(si.endpoints.removeImageFromBoard.initiate({image_name:s,board_id:a}));return}if(o.actionType==="MOVE_BOARD"&&i.payloadType==="IMAGE_NAMES"&&o.context.boardId){console.log("adding gallery selection to board");const s=o.context.boardId;t(si.endpoints.addManyBoardImages.initiate({board_id:s,image_names:i.payload.image_names}));return}if(o.actionType==="MOVE_BOARD"&&i.payloadType==="IMAGE_NAMES"&&o.context.boardId===null){console.log("removing gallery selection to board"),t(si.endpoints.deleteManyBoardImages.initiate({image_names:i.payload.image_names}));return}if(o.actionType==="MOVE_BOARD"&&i.payloadType==="IMAGE_NAMES"&&o.context.boardId){const s=o.context.boardId;t(si.endpoints.addManyBoardImages.initiate({board_id:s,image_names:i.payload.image_names}));return}if(o.actionType==="MOVE_BOARD"&&i.payloadType==="IMAGE_NAMES"&&o.context.boardId===null){t(si.endpoints.deleteManyBoardImages.initiate({image_names:i.payload.image_names}));return}}})},px=ve.child({namespace:"image"}),jbe=()=>{fe({actionCreator:Eh.fulfilled,effect:(e,{getState:t,dispatch:n})=>{const r=e.payload,i=t();if(r.session_id===i.canvas.layerState.stagingArea.sessionId&&i.canvas.shouldAutoSave)n(io({image_name:r.image_name,is_intermediate:r.is_intermediate}));else if(r.is_intermediate){px.trace({data:{image:r}},"Image metadata received (intermediate), skipping");return}px.debug({data:{image:r}},"Image metadata received"),n(y1(r))}})},Vbe=()=>{fe({actionCreator:Eh.rejected,effect:(e,{getState:t,dispatch:n})=>{px.debug({data:{image:e.meta.arg}},"Problem receiving image metadata")}})},XF=ve.child({namespace:"boards"}),zbe=()=>{fe({matcher:si.endpoints.removeImageFromBoard.matchFulfilled,effect:(e,{getState:t,dispatch:n})=>{const{board_id:r,image_name:i}=e.meta.arg.originalArgs;XF.debug({data:{board_id:r,image_name:i}},"Image added to board")}})},Ube=()=>{fe({matcher:si.endpoints.removeImageFromBoard.matchRejected,effect:(e,{getState:t,dispatch:n})=>{const{board_id:r,image_name:i}=e.meta.arg.originalArgs;XF.debug({data:{board_id:r,image_name:i}},"Problem adding image to board")}})};ve.child({namespace:"image"});const Gbe=()=>{fe({actionCreator:Qpe,effect:async(e,{dispatch:t,getState:n,condition:r})=>{const i=e.payload,o=n(),{shouldConfirmOnDelete:s}=o.system,a=Jpe(n());if(!a)return;const l=a.isCanvasImage||a.isInitialImage||a.isControlNetImage||a.isNodesImage;if(s||l){t(a$(!0));return}t(l$({imageDTO:i,imageUsage:a}))}})},QF=ve.child({namespace:"image"}),Hbe=()=>{fe({actionCreator:io.fulfilled,effect:(e,{dispatch:t,getState:n})=>{QF.debug({oldImage:e.meta.arg,updatedImage:e.payload},"Image updated")}})},qbe=()=>{fe({actionCreator:io.rejected,effect:(e,{dispatch:t})=>{QF.debug({oldImage:e.meta.arg},"Image update failed")}})},ZF=ve.child({namespace:"image"}),Wbe=()=>{fe({actionCreator:Br.fulfilled,effect:(e,{dispatch:t,getState:n})=>{const r=e.payload;if(ZF.debug({arg:"",image:r},"Image uploaded"),e.payload.is_intermediate)return;t(y1(r));const{postUploadAction:i}=e.meta.arg;if((i==null?void 0:i.type)==="TOAST_CANVAS_SAVED_TO_GALLERY"){t(qt({title:"Canvas Saved to Gallery",status:"success"}));return}if((i==null?void 0:i.type)==="TOAST_CANVAS_MERGED"){t(qt({title:"Canvas Merged",status:"success"}));return}if((i==null?void 0:i.type)==="SET_CANVAS_INITIAL_IMAGE"){t(hL(r));return}if((i==null?void 0:i.type)==="SET_CONTROLNET_IMAGE"){const{controlNetId:o}=i;t(x3({controlNetId:o,controlImage:r.image_name}));return}if((i==null?void 0:i.type)==="SET_INITIAL_IMAGE"){t(Sh(r));return}if((i==null?void 0:i.type)==="SET_NODES_IMAGE"){const{nodeId:o,fieldName:s}=i;t(hx({nodeId:o,fieldName:s,value:r}));return}if((i==null?void 0:i.type)==="TOAST_UPLOADED"){t(qt({title:"Image Uploaded",status:"success"}));return}if((i==null?void 0:i.type)==="ADD_TO_BATCH"){t(Kw([r.image_name]));return}}})},Kbe=()=>{fe({actionCreator:Br.rejected,effect:(e,{dispatch:t})=>{const{formData:n,...r}=e.meta.arg,i={arg:{...r,formData:{file:""}}};ZF.error({data:i},"Image upload failed"),t(qt({title:"Image Upload Failed",description:e.error.message,status:"error"}))}})},JF=ve.child({namespace:"image"}),Ybe=()=>{fe({actionCreator:v3.fulfilled,effect:(e,{getState:t,dispatch:n})=>{const r=e.payload;JF.debug({data:{image:r}},"Image URLs received");const{image_name:i,image_url:o,thumbnail_url:s}=r;n(_pe({id:i,changes:{image_url:o,thumbnail_url:s}}))}})},Xbe=()=>{fe({actionCreator:v3.rejected,effect:(e,{getState:t,dispatch:n})=>{JF.debug({data:{image:e.meta.arg}},"Problem getting image URLs")}})},Qbe=ge("generation/initialImageSelected"),Zbe=ge("generation/modelSelected"),Jbe=()=>{fe({actionCreator:Qbe,effect:(e,{getState:t,dispatch:n})=>{if(!e.payload){n(qt(ho({title:ol("toast.imageNotLoadedDesc"),status:"error"})));return}if(kbe(e.payload)){n(Sh(e.payload)),n(qt(ho(ol("toast.sentToImageToImage"))));return}const r=e.payload,i=Qa(t(),r);if(!i){n(qt(ho({title:ol("toast.imageNotLoadedDesc"),status:"error"})));return}n(Sh(i)),n(qt(ho(ol("toast.sentToImageToImage"))))}})},eSe=ve.child({module:"models"}),tSe=()=>{fe({actionCreator:Zbe,effect:(e,{getState:t,dispatch:n})=>{var a;const r=t(),i=Yv.safeParse(e.payload);if(!i.success){eSe.error({error:i.error.format()},"Failed to parse main model");return}const o=i.data,{base_model:s}=o;if(((a=r.generation.model)==null?void 0:a.base_model)!==s){let l=0;_l(r.lora.loras,(d,f)=>{d.base_model!==s&&(n(c$(f)),l+=1)});const{vae:u}=r.generation;u&&u.base_model!==s&&(n(RD(null)),l+=1);const{controlNets:c}=r.controlNet;_l(c,(d,f)=>{var h;((h=d.model)==null?void 0:h.base_model)!==s&&(n(t$({controlNetId:f})),l+=1)}),l>0&&n(qt(ho({title:`Base model changed, cleared ${l} incompatible submodel${l===1?"":"s"}`,status:"warning"})))}n(wm(o))}})},R8=Nl({sortComparer:(e,t)=>e.model_name.localeCompare(t.model_name)}),I8=Nl({sortComparer:(e,t)=>e.model_name.localeCompare(t.model_name)}),M8=Nl({sortComparer:(e,t)=>e.model_name.localeCompare(t.model_name)}),N8=Nl({sortComparer:(e,t)=>e.model_name.localeCompare(t.model_name)}),D8=Nl({sortComparer:(e,t)=>e.model_name.localeCompare(t.model_name)}),nSe=({base_model:e,model_type:t,model_name:n})=>`${e}/${t}/${n}`,Nd=e=>{const t=[];return e.forEach(n=>{const r={...Yn(n),id:nSe(n)};t.push(r)}),t},oo=Eo.injectEndpoints({endpoints:e=>({getMainModels:e.query({query:()=>({url:"models/",params:{model_type:"main"}}),providesTags:(t,n,r)=>{const i=[{type:"MainModel",id:bn}];return t&&i.push(...t.ids.map(o=>({type:"MainModel",id:o}))),i},transformResponse:(t,n,r)=>{const i=Nd(t.models);return R8.setAll(R8.getInitialState(),i)}}),updateMainModels:e.mutation({query:({base_model:t,model_name:n,body:r})=>({url:`models/${t}/main/${n}`,method:"PATCH",body:r}),invalidatesTags:[{type:"MainModel",id:bn}]}),importMainModels:e.mutation({query:({body:t})=>({url:"models/import",method:"POST",body:t}),invalidatesTags:[{type:"MainModel",id:bn}]}),addMainModels:e.mutation({query:({body:t})=>({url:"models/add",method:"POST",body:t}),invalidatesTags:[{type:"MainModel",id:bn}]}),deleteMainModels:e.mutation({query:({base_model:t,model_name:n})=>({url:`models/${t}/main/${n}`,method:"DELETE"}),invalidatesTags:[{type:"MainModel",id:bn}]}),convertMainModels:e.mutation({query:({base_model:t,model_name:n,params:r})=>({url:`models/convert/${t}/main/${n}`,method:"PUT",params:r}),invalidatesTags:[{type:"MainModel",id:bn}]}),mergeMainModels:e.mutation({query:({base_model:t,body:n})=>({url:`models/merge/${t}`,method:"PUT",body:n}),invalidatesTags:[{type:"MainModel",id:bn}]}),getLoRAModels:e.query({query:()=>({url:"models/",params:{model_type:"lora"}}),providesTags:(t,n,r)=>{const i=[{type:"LoRAModel",id:bn}];return t&&i.push(...t.ids.map(o=>({type:"LoRAModel",id:o}))),i},transformResponse:(t,n,r)=>{const i=Nd(t.models);return I8.setAll(I8.getInitialState(),i)}}),getControlNetModels:e.query({query:()=>({url:"models/",params:{model_type:"controlnet"}}),providesTags:(t,n,r)=>{const i=[{type:"ControlNetModel",id:bn}];return t&&i.push(...t.ids.map(o=>({type:"ControlNetModel",id:o}))),i},transformResponse:(t,n,r)=>{const i=Nd(t.models);return M8.setAll(M8.getInitialState(),i)}}),getVaeModels:e.query({query:()=>({url:"models/",params:{model_type:"vae"}}),providesTags:(t,n,r)=>{const i=[{type:"VaeModel",id:bn}];return t&&i.push(...t.ids.map(o=>({type:"VaeModel",id:o}))),i},transformResponse:(t,n,r)=>{const i=Nd(t.models);return D8.setAll(D8.getInitialState(),i)}}),getTextualInversionModels:e.query({query:()=>({url:"models/",params:{model_type:"embedding"}}),providesTags:(t,n,r)=>{const i=[{type:"TextualInversionModel",id:bn}];return t&&i.push(...t.ids.map(o=>({type:"TextualInversionModel",id:o}))),i},transformResponse:(t,n,r)=>{const i=Nd(t.models);return N8.setAll(N8.getInitialState(),i)}}),getModelsInFolder:e.query({query:t=>({url:`/models/search?${DL.stringify(t,{})}`}),providesTags:(t,n,r)=>{const i=[{type:"ScannedModels",id:bn}];return t&&i.push(...t.map(o=>({type:"ScannedModels",id:o}))),i}}),getCheckpointConfigs:e.query({query:()=>({url:"/models/ckpt_confs"})})})}),{useGetMainModelsQuery:p8e,useGetControlNetModelsQuery:g8e,useGetLoRAModelsQuery:m8e,useGetTextualInversionModelsQuery:y8e,useGetVaeModelsQuery:v8e,useUpdateMainModelsMutation:b8e,useDeleteMainModelsMutation:S8e,useImportMainModelsMutation:_8e,useAddMainModelsMutation:w8e,useConvertMainModelsMutation:x8e,useMergeMainModelsMutation:C8e,useGetModelsInFolderQuery:T8e,useGetCheckpointConfigsQuery:E8e}=oo,L8=ve.child({module:"models"}),rSe=()=>{fe({matcher:oo.endpoints.getMainModels.matchFulfilled,effect:async(e,{getState:t,dispatch:n})=>{const r=t().generation.model;if(Xs(e.payload.entities,l=>(l==null?void 0:l.model_name)===(r==null?void 0:r.model_name)&&(l==null?void 0:l.base_model)===(r==null?void 0:r.base_model)))return;const o=e.payload.ids[0],s=e.payload.entities[o];if(!s){n(wm(null));return}const a=Yv.safeParse(s);if(!a.success){L8.error({error:a.error.format()},"Failed to parse main model");return}n(wm(a.data))}}),fe({matcher:oo.endpoints.getVaeModels.matchFulfilled,effect:async(e,{getState:t,dispatch:n})=>{const r=t().generation.vae;if(r===null||Xs(e.payload.entities,l=>(l==null?void 0:l.model_name)===(r==null?void 0:r.model_name)&&(l==null?void 0:l.base_model)===(r==null?void 0:r.base_model)))return;const o=e.payload.ids[0],s=e.payload.entities[o];if(!s){n(wm(null));return}const a=$ce.safeParse(s);if(!a.success){L8.error({error:a.error.format()},"Failed to parse VAE model");return}n(RD(a.data))}}),fe({matcher:oo.endpoints.getLoRAModels.matchFulfilled,effect:async(e,{getState:t,dispatch:n})=>{const r=t().lora.loras;_l(r,(i,o)=>{Xs(e.payload.entities,a=>(a==null?void 0:a.model_name)===(i==null?void 0:i.model_name)&&(a==null?void 0:a.base_model)===(i==null?void 0:i.base_model))||n(c$(o))})}}),fe({matcher:oo.endpoints.getControlNetModels.matchFulfilled,effect:async(e,{getState:t,dispatch:n})=>{const r=t().controlNet.controlNets;_l(r,(i,o)=>{Xs(e.payload.entities,a=>{var l,u;return(a==null?void 0:a.model_name)===((l=i==null?void 0:i.model)==null?void 0:l.model_name)&&(a==null?void 0:a.base_model)===((u=i==null?void 0:i.model)==null?void 0:u.base_model)})||n(t$({controlNetId:o}))})}})},gx=e=>!("$ref"in e),iSe=e=>!("$ref"in e),P8e=500,oSe={integer:"integer",float:"float",number:"float",string:"string",boolean:"boolean",enum:"enum",ImageField:"image",image_collection:"image_collection",LatentsField:"latents",ConditioningField:"conditioning",UNetField:"unet",ClipField:"clip",VaeField:"vae",model:"model",vae_model:"vae_model",lora_model:"lora_model",controlnet_model:"controlnet_model",ControlNetModelField:"controlnet_model",array:"array",item:"item",ColorField:"color",ControlField:"control",control:"control",cfg_scale:"float",control_weight:"float"},sSe=500,Zt=e=>`var(--invokeai-colors-${e}-${sSe})`,k8e={integer:{color:"red",colorCssVar:Zt("red"),title:"Integer",description:"Integers are whole numbers, without a decimal point."},float:{color:"orange",colorCssVar:Zt("orange"),title:"Float",description:"Floats are numbers with a decimal point."},string:{color:"yellow",colorCssVar:Zt("yellow"),title:"String",description:"Strings are text."},boolean:{color:"green",colorCssVar:Zt("green"),title:"Boolean",description:"Booleans are true or false."},enum:{color:"blue",colorCssVar:Zt("blue"),title:"Enum",description:"Enums are values that may be one of a number of options."},image:{color:"purple",colorCssVar:Zt("purple"),title:"Image",description:"Images may be passed between nodes."},image_collection:{color:"purple",colorCssVar:Zt("purple"),title:"Image Collection",description:"A collection of images."},latents:{color:"pink",colorCssVar:Zt("pink"),title:"Latents",description:"Latents may be passed between nodes."},conditioning:{color:"cyan",colorCssVar:Zt("cyan"),title:"Conditioning",description:"Conditioning may be passed between nodes."},unet:{color:"red",colorCssVar:Zt("red"),title:"UNet",description:"UNet submodel."},clip:{color:"green",colorCssVar:Zt("green"),title:"Clip",description:"Tokenizer and text_encoder submodels."},vae:{color:"blue",colorCssVar:Zt("blue"),title:"Vae",description:"Vae submodel."},control:{color:"cyan",colorCssVar:Zt("cyan"),title:"Control",description:"Control info passed between nodes."},model:{color:"teal",colorCssVar:Zt("teal"),title:"Model",description:"Models are models."},vae_model:{color:"teal",colorCssVar:Zt("teal"),title:"VAE",description:"Models are models."},lora_model:{color:"teal",colorCssVar:Zt("teal"),title:"LoRA",description:"Models are models."},controlnet_model:{color:"teal",colorCssVar:Zt("teal"),title:"ControlNet",description:"Models are models."},array:{color:"gray",colorCssVar:Zt("gray"),title:"Array",description:"TODO: Array type description."},item:{color:"gray",colorCssVar:Zt("gray"),title:"Collection Item",description:"TODO: Collection Item type description."},color:{color:"gray",colorCssVar:Zt("gray"),title:"Color",description:"A RGBA color."}},T_=e=>e.$ref.split("/").slice(-1)[0],aSe=({schemaObject:e,baseField:t})=>{const n={...t,type:"integer",inputRequirement:"always",inputKind:"any",default:e.default??0};return e.multipleOf!==void 0&&(n.multipleOf=e.multipleOf),e.maximum!==void 0&&(n.maximum=e.maximum),e.exclusiveMaximum!==void 0&&(n.exclusiveMaximum=e.exclusiveMaximum),e.minimum!==void 0&&(n.minimum=e.minimum),e.exclusiveMinimum!==void 0&&(n.exclusiveMinimum=e.exclusiveMinimum),n},lSe=({schemaObject:e,baseField:t})=>{const n={...t,type:"float",inputRequirement:"always",inputKind:"any",default:e.default??0};return e.multipleOf!==void 0&&(n.multipleOf=e.multipleOf),e.maximum!==void 0&&(n.maximum=e.maximum),e.exclusiveMaximum!==void 0&&(n.exclusiveMaximum=e.exclusiveMaximum),e.minimum!==void 0&&(n.minimum=e.minimum),e.exclusiveMinimum!==void 0&&(n.exclusiveMinimum=e.exclusiveMinimum),n},uSe=({schemaObject:e,baseField:t})=>{const n={...t,type:"string",inputRequirement:"always",inputKind:"any",default:e.default??""};return e.minLength!==void 0&&(n.minLength=e.minLength),e.maxLength!==void 0&&(n.maxLength=e.maxLength),e.pattern!==void 0&&(n.pattern=e.pattern),n},cSe=({schemaObject:e,baseField:t})=>({...t,type:"boolean",inputRequirement:"always",inputKind:"any",default:e.default??!1}),dSe=({schemaObject:e,baseField:t})=>({...t,type:"model",inputRequirement:"always",inputKind:"direct",default:e.default??void 0}),fSe=({schemaObject:e,baseField:t})=>({...t,type:"vae_model",inputRequirement:"always",inputKind:"direct",default:e.default??void 0}),hSe=({schemaObject:e,baseField:t})=>({...t,type:"lora_model",inputRequirement:"always",inputKind:"direct",default:e.default??void 0}),pSe=({schemaObject:e,baseField:t})=>({...t,type:"controlnet_model",inputRequirement:"always",inputKind:"direct",default:e.default??void 0}),gSe=({schemaObject:e,baseField:t})=>({...t,type:"image",inputRequirement:"always",inputKind:"any",default:e.default??void 0}),mSe=({schemaObject:e,baseField:t})=>({...t,type:"image_collection",inputRequirement:"always",inputKind:"any",default:e.default??void 0}),ySe=({schemaObject:e,baseField:t})=>({...t,type:"latents",inputRequirement:"always",inputKind:"connection",default:e.default??void 0}),vSe=({schemaObject:e,baseField:t})=>({...t,type:"conditioning",inputRequirement:"always",inputKind:"connection",default:e.default??void 0}),bSe=({schemaObject:e,baseField:t})=>({...t,type:"unet",inputRequirement:"always",inputKind:"connection",default:e.default??void 0}),SSe=({schemaObject:e,baseField:t})=>({...t,type:"clip",inputRequirement:"always",inputKind:"connection",default:e.default??void 0}),_Se=({schemaObject:e,baseField:t})=>({...t,type:"vae",inputRequirement:"always",inputKind:"connection",default:e.default??void 0}),wSe=({schemaObject:e,baseField:t})=>({...t,type:"control",inputRequirement:"always",inputKind:"connection",default:e.default??void 0}),xSe=({schemaObject:e,baseField:t})=>{const n=e.enum??[];return{...t,type:"enum",enumType:e.type??"string",options:n,inputRequirement:"always",inputKind:"direct",default:e.default??n[0]}},$8=({baseField:e})=>({...e,type:"array",inputRequirement:"always",inputKind:"direct",default:[]}),F8=({baseField:e})=>({...e,type:"item",inputRequirement:"always",inputKind:"direct",default:void 0}),CSe=({schemaObject:e,baseField:t})=>({...t,type:"color",inputRequirement:"always",inputKind:"direct",default:e.default??{r:127,g:127,b:127,a:255}}),eB=(e,t,n)=>{let r="";n&&t in n?r=n[t]:e.type?e.enum?r="enum":e.type&&(r=e.type):e.allOf?r=T_(e.allOf[0]):e.anyOf?r=T_(e.anyOf[0]):e.oneOf&&(r=T_(e.oneOf[0]));const i=oSe[r];if(!i)throw`Field type "${r}" is unknown!`;return i},TSe=(e,t,n)=>{const r=eB(e,t,n),i={name:t,title:e.title??"",description:e.description??""};if(["image"].includes(r))return gSe({schemaObject:e,baseField:i});if(["image_collection"].includes(r))return mSe({schemaObject:e,baseField:i});if(["latents"].includes(r))return ySe({schemaObject:e,baseField:i});if(["conditioning"].includes(r))return vSe({schemaObject:e,baseField:i});if(["unet"].includes(r))return bSe({schemaObject:e,baseField:i});if(["clip"].includes(r))return SSe({schemaObject:e,baseField:i});if(["vae"].includes(r))return _Se({schemaObject:e,baseField:i});if(["control"].includes(r))return wSe({schemaObject:e,baseField:i});if(["model"].includes(r))return dSe({schemaObject:e,baseField:i});if(["vae_model"].includes(r))return fSe({schemaObject:e,baseField:i});if(["lora_model"].includes(r))return hSe({schemaObject:e,baseField:i});if(["controlnet_model"].includes(r))return pSe({schemaObject:e,baseField:i});if(["enum"].includes(r))return xSe({schemaObject:e,baseField:i});if(["integer"].includes(r))return aSe({schemaObject:e,baseField:i});if(["number","float"].includes(r))return lSe({schemaObject:e,baseField:i});if(["string"].includes(r))return uSe({schemaObject:e,baseField:i});if(["boolean"].includes(r))return cSe({schemaObject:e,baseField:i});if(["array"].includes(r))return $8({schemaObject:e,baseField:i});if(["item"].includes(r))return F8({schemaObject:e,baseField:i});if(["color"].includes(r))return CSe({schemaObject:e,baseField:i});if(["array"].includes(r))return $8({schemaObject:e,baseField:i});if(["item"].includes(r))return F8({schemaObject:e,baseField:i})},ESe=(e,t,n)=>{const r=e.$ref.split("/").slice(-1)[0],i=t.components.schemas[r];return gx(i)?Tv(i.properties,(s,a,l)=>{if(!["type","id"].includes(l)&&!["object"].includes(a.type)&&gx(a)){const u=eB(a,l,n);s[l]={name:l,title:a.title??"",description:a.description??"",type:u}}return s},{}):{}},PSe=["id","type","is_intermediate","metadata"],kSe=["Graph","InvocationMeta","MetadataAccumulatorInvocation"],ASe=e=>h7(e.components.schemas,(r,i)=>i.includes("Invocation")&&!i.includes("InvocationOutput")&&!kSe.some(o=>i.includes(o))).reduce((r,i)=>{var o,s,a;if(iSe(i)){const l=i.properties.type.default,u=((o=i.ui)==null?void 0:o.title)??i.title.replace("Invocation",""),c=(s=i.ui)==null?void 0:s.type_hints,d={};if(l==="collect"){const m=i.properties.item;d.item={type:"item",name:"item",description:m.description??"",title:"Collection Item",inputKind:"connection",inputRequirement:"always",default:void 0}}else if(l==="iterate"){const m=i.properties.collection;d.collection={type:"array",name:"collection",title:m.title??"",default:[],description:m.description??"",inputRequirement:"always",inputKind:"connection"}}else Tv(i.properties,(m,S,v)=>{if(!PSe.includes(v)&&gx(S)){const y=TSe(S,v,c);y&&(m[v]=y)}return m},d);const f=i.output;let h;if(l==="iterate"){const m=e.components.schemas.IterateInvocationOutput;h={item:{name:"item",title:m.title??"",description:m.description??"",type:"array"}}}else h=ESe(f,e,c);const p={title:u,type:l,tags:((a=i.ui)==null?void 0:a.tags)??[],description:i.description??"",inputs:d,outputs:h};Object.assign(r,{[l]:p})}return r},{}),E_=ve.child({namespace:"schema"}),OSe=()=>{fe({actionCreator:Nh.fulfilled,effect:(e,{dispatch:t,getState:n})=>{const r=e.payload;E_.info({data:{schemaJSON:r}},"Dereferenced OpenAPI schema");const i=ASe(r);E_.info({data:{nodeTemplates:i}},`Built ${p5(i)} node templates`),t(B3(i))}}),fe({actionCreator:Nh.rejected,effect:(e,{dispatch:t,getState:n})=>{E_.error("Problem dereferencing OpenAPI Schema")}})},RSe=[EvalError,RangeError,ReferenceError,SyntaxError,TypeError,URIError,globalThis.DOMException,globalThis.AssertionError,globalThis.SystemError].filter(Boolean).map(e=>[e.name,e]),ISe=new Map(RSe),MSe=[{property:"name",enumerable:!1},{property:"message",enumerable:!1},{property:"stack",enumerable:!1},{property:"code",enumerable:!0},{property:"cause",enumerable:!1}],mx=Symbol(".toJSON was called"),NSe=e=>{e[mx]=!0;const t=e.toJSON();return delete e[mx],t},DSe=e=>ISe.get(e)??Error,tB=({from:e,seen:t,to:n,forceEnumerable:r,maxDepth:i,depth:o,useToJSON:s,serialize:a})=>{if(!n)if(Array.isArray(e))n=[];else if(!a&&B8(e)){const u=DSe(e.name);n=new u}else n={};if(t.push(e),o>=i)return n;if(s&&typeof e.toJSON=="function"&&e[mx]!==!0)return NSe(e);const l=u=>tB({from:u,seen:[...t],forceEnumerable:r,maxDepth:i,depth:o,useToJSON:s,serialize:a});for(const[u,c]of Object.entries(e)){if(typeof Buffer=="function"&&Buffer.isBuffer(c)){n[u]="[object Buffer]";continue}if(c!==null&&typeof c=="object"&&typeof c.pipe=="function"){n[u]="[object Stream]";continue}if(typeof c!="function"){if(!c||typeof c!="object"){n[u]=c;continue}if(!t.includes(e[u])){o++,n[u]=l(e[u]);continue}n[u]="[Circular]"}}for(const{property:u,enumerable:c}of MSe)typeof e[u]<"u"&&e[u]!==null&&Object.defineProperty(n,u,{value:B8(e[u])?l(e[u]):e[u],enumerable:r?!0:c,configurable:!0,writable:!0});return n};function P1(e,t={}){const{maxDepth:n=Number.POSITIVE_INFINITY,useToJSON:r=!0}=t;return typeof e=="object"&&e!==null?tB({from:e,seen:[],forceEnumerable:!0,maxDepth:n,depth:0,useToJSON:r,serialize:!0}):typeof e=="function"?`[Function: ${e.name??"anonymous"}]`:e}function B8(e){return!!e&&typeof e=="object"&&"name"in e&&"message"in e&&"stack"in e}const nB=Eo.injectEndpoints({endpoints:e=>({getImageDTO:e.query({query:t=>({url:`images/${t}`}),providesTags:(t,n,r)=>{const i=[{type:"Image",id:r}];return t!=null&&t.board_id&&i.push({type:"Board",id:t.board_id}),i},keepUnusedDataFor:86400}),getImageMetadata:e.query({query:t=>({url:`images/${t}/metadata`}),providesTags:(t,n,r)=>[{type:"ImageMetadata",id:r}],keepUnusedDataFor:86400})})}),{useGetImageDTOQuery:A8e,useGetImageMetadataQuery:O8e}=nB,rB=ve.child({namespace:"gallery"}),LSe=()=>{fe({actionCreator:ua.fulfilled,effect:(e,{getState:t,dispatch:n})=>{const{items:r}=e.payload;rB.debug({data:{payload:e.payload}},`Received ${r.length} images`),r.forEach(i=>{n(nB.util.upsertQueryData("getImageDTO",i.image_name,i))})}})},$Se=()=>{fe({actionCreator:ua.rejected,effect:(e,{getState:t,dispatch:n})=>{e.payload&&rB.debug({data:{error:P1(e.payload)}},"Problem receiving images")}})},iB=ve.child({namespace:"session"}),FSe=()=>{fe({actionCreator:zl.pending,effect:(e,{getState:t,dispatch:n})=>{}})},BSe=()=>{fe({actionCreator:zl.fulfilled,effect:(e,{getState:t,dispatch:n})=>{const{session_id:r}=e.meta.arg;iB.debug({data:{session_id:r}},`Session canceled (${r})`)}})},jSe=()=>{fe({actionCreator:zl.rejected,effect:(e,{getState:t,dispatch:n})=>{if(e.payload){const{arg:r,error:i}=e.payload;iB.error({data:{arg:r,error:P1(i)}},"Problem canceling session")}}})},oB=ve.child({namespace:"session"}),VSe=()=>{fe({actionCreator:Un.pending,effect:(e,{getState:t,dispatch:n})=>{}})},zSe=()=>{fe({actionCreator:Un.fulfilled,effect:(e,{getState:t,dispatch:n})=>{const r=e.payload;oB.debug({data:{session:r}},`Session created (${r.id})`)}})},USe=()=>{fe({actionCreator:Un.rejected,effect:(e,{getState:t,dispatch:n})=>{if(e.payload){const{arg:r,error:i}=e.payload,o=JSON.stringify(i);oB.error({data:{arg:r,error:P1(i)}},`Problem creating session: ${o}`)}}})},sB=ve.child({namespace:"session"}),GSe=()=>{fe({actionCreator:Ep.pending,effect:(e,{getState:t,dispatch:n})=>{}})},HSe=()=>{fe({actionCreator:Ep.fulfilled,effect:(e,{getState:t,dispatch:n})=>{const{session_id:r}=e.meta.arg;sB.debug({data:{session_id:r}},`Session invoked (${r})`)}})},qSe=()=>{fe({actionCreator:Ep.rejected,effect:(e,{getState:t,dispatch:n})=>{if(e.payload){const{arg:r,error:i}=e.payload,o=JSON.stringify(i);sB.error({data:{arg:r,error:P1(i)}},`Problem invoking session: ${o}`)}}})},WSe=ve.child({namespace:"session"}),KSe=()=>{fe({actionCreator:Ul,effect:(e,{getState:t,dispatch:n})=>{const{sessionId:r}=t().system;r&&(WSe.debug({session_id:r},`Session ready to invoke (${r})})`),n(Ep({session_id:r})))}})},YSe=ve.child({namespace:"socketio"}),XSe=()=>{fe({actionCreator:$L,effect:(e,{dispatch:t,getState:n})=>{const{timestamp:r}=e.payload;YSe.debug({timestamp:r},"Connected");const{nodes:i,config:o}=n(),{disabledTabs:s}=o;!i.schema&&!s.includes("nodes")&&t(Nh()),t(FL(e.payload)),t(oo.endpoints.getMainModels.initiate()),t(oo.endpoints.getControlNetModels.initiate()),t(oo.endpoints.getLoRAModels.initiate()),t(oo.endpoints.getTextualInversionModels.initiate()),t(oo.endpoints.getVaeModels.initiate())}})},QSe=ve.child({namespace:"socketio"}),ZSe=()=>{fe({actionCreator:BL,effect:(e,{dispatch:t,getState:n})=>{QSe.debug(e.payload,"Disconnected"),t(jL(e.payload))}})},j8=ve.child({namespace:"socketio"}),JSe=()=>{fe({actionCreator:XL,effect:(e,{dispatch:t,getState:n})=>{if(n().system.canceledSession===e.payload.data.graph_execution_state_id){j8.trace(e.payload,"Ignored generator progress for canceled session");return}j8.trace(e.payload,`Generator progress (${e.payload.data.node.type})`),t(QL(e.payload))}})},e_e=ve.child({namespace:"socketio"}),t_e=()=>{fe({actionCreator:KL,effect:(e,{dispatch:t,getState:n})=>{e_e.debug(e.payload,`Session invocation complete (${e.payload.data.graph_execution_state_id})`),t(YL(e.payload))}})},n_e=ve.child({namespace:"socketio"}),r_e=["dataURL_image"],i_e=()=>{fe({actionCreator:S3,effect:async(e,{dispatch:t,getState:n,take:r})=>{n_e.debug({data:e.payload},`Invocation complete (${e.payload.data.node.type})`);const i=e.payload.data.graph_execution_state_id,{cancelType:o,isCancelScheduled:s,boardIdToAddTo:a}=n().system;o==="scheduled"&&s&&t(zl({session_id:i}));const{data:l}=e.payload,{result:u,node:c,graph_execution_state_id:d}=l;if(qF(u)&&!r_e.includes(c.type)){const{image_name:f}=u.image;t(Eh({image_name:f}));const[{payload:h}]=await r(Eh.fulfilled.match);d===n().canvas.layerState.stagingArea.sessionId&&t(mhe(h)),a&&!h.is_intermediate&&t(si.endpoints.addImageToBoard.initiate({board_id:a,image_name:f})),t(Z1e(null))}t(qL(e.payload))}})},o_e=ve.child({namespace:"socketio"}),s_e=()=>{fe({actionCreator:WL,effect:(e,{dispatch:t,getState:n})=>{o_e.error(e.payload,`Invocation error (${e.payload.data.node.type}): ${e.payload.data.error}`),t(_3(e.payload))}})},V8=ve.child({namespace:"socketio"}),a_e=()=>{fe({actionCreator:GL,effect:(e,{dispatch:t,getState:n})=>{if(n().system.canceledSession===e.payload.data.graph_execution_state_id){V8.trace(e.payload,"Ignored invocation started for canceled session");return}V8.debug(e.payload,`Invocation started (${e.payload.data.node.type})`),t(HL(e.payload))}})},l_e=ve.child({namespace:"socketio"}),u_e=()=>{fe({actionCreator:b3,effect:(e,{dispatch:t,getState:n})=>{l_e.debug(e.payload,`Subscribed (${e.payload.sessionId}))`),t(VL(e.payload))}})},c_e=ve.child({namespace:"socketio"}),d_e=()=>{fe({actionCreator:zL,effect:(e,{dispatch:t,getState:n})=>{c_e.debug(e.payload,`Unsubscribed (${e.payload.sessionId})`),t(UL(e.payload))}})},f_e=ve.child({namespace:"canvas"}),h_e=()=>{fe({actionCreator:fbe,effect:async(e,{dispatch:t,getState:n,take:r})=>{const{imageName:i}=e.payload;t(io({image_name:i,is_intermediate:!1}));const[o]=await r(s=>(io.fulfilled.match(s)||io.rejected.match(s))&&s.meta.arg.image_name===i);if(io.rejected.match(o)){f_e.error({data:{arg:o.meta.arg}},"Image saving failed"),t(qt({title:"Image Saving Failed",description:o.error.message,status:"error"}));return}io.fulfilled.match(o)&&(t(y1(o.payload)),t(qt({title:"Image Saved",status:"success"})))}})},Lt="positive_conditioning",Wt="negative_conditioning",wn="text_to_latents",jn="latents_to_image",Nt="noise",Qi="rand_int",Xo="range_of_size",br="iterate",wt="main_model_loader",Dd="vae_loader",p_e="lora_loader",ft="clip_skip",ur="image_to_latents",tn="latents_to_latents",so="resize_image",Ds="inpaint",Lg="control_net_collect",P_="dynamic_prompt",fn="metadata_accumulator",z8="esrgan",z3="text_to_image_graph",h0="image_to_image_graph",aB="inpaint_graph",Rp=(e,t,n)=>{const{loras:r}=e.lora,i=p5(r),o=t.nodes[fn];i>0&&(t.edges=t.edges.filter(l=>!(l.source.node_id===wt&&["unet"].includes(l.source.field))),t.edges=t.edges.filter(l=>!(l.source.node_id===ft&&["clip"].includes(l.source.field))));let s="",a=0;_l(r,l=>{const{model_name:u,base_model:c,weight:d}=l,f=`${p_e}_${u.replace(".","_")}`,h={type:"lora_loader",id:f,lora:{model_name:u,base_model:c},weight:d};o&&o.loras.push({lora:{model_name:u,base_model:c},weight:d}),t.nodes[f]=h,a===0?(t.edges.push({source:{node_id:wt,field:"unet"},destination:{node_id:f,field:"unet"}}),t.edges.push({source:{node_id:ft,field:"clip"},destination:{node_id:f,field:"clip"}})):(t.edges.push({source:{node_id:s,field:"unet"},destination:{node_id:f,field:"unet"}}),t.edges.push({source:{node_id:s,field:"clip"},destination:{node_id:f,field:"clip"}})),a===i-1&&(t.edges.push({source:{node_id:f,field:"unet"},destination:{node_id:n,field:"unet"}}),t.edges.push({source:{node_id:f,field:"clip"},destination:{node_id:Lt,field:"clip"}}),t.edges.push({source:{node_id:f,field:"clip"},destination:{node_id:Wt,field:"clip"}})),s=f,a+=1})},Ip=(e,t)=>{const{vae:n}=e.generation,r=!n,i=t.nodes[fn];r||(t.nodes[Dd]={type:"vae_loader",id:Dd,vae_model:n}),(t.id===z3||t.id===h0)&&t.edges.push({source:{node_id:r?wt:Dd,field:"vae"},destination:{node_id:jn,field:"vae"}}),t.id===h0&&t.edges.push({source:{node_id:r?wt:Dd,field:"vae"},destination:{node_id:ur,field:"vae"}}),t.id===aB&&t.edges.push({source:{node_id:r?wt:Dd,field:"vae"},destination:{node_id:Ds,field:"vae"}}),n&&i&&(i.vae=n)},g_e=ve.child({namespace:"nodes"}),m_e=(e,t,n)=>{const{positivePrompt:r,negativePrompt:i,model:o,cfgScale:s,scheduler:a,steps:l,img2imgStrength:u,shouldFitToWidthHeight:c,iterations:d,seed:f,shouldRandomizeSeed:h,seamSize:p,seamBlur:m,seamSteps:S,seamStrength:v,tileSize:y,infillMethod:g,clipSkip:b}=e.generation;if(!o)throw g_e.error("No model found in state"),new Error("No model found in state");const{width:_,height:w}=e.canvas.boundingBoxDimensions,{scaledBoundingBoxDimensions:x,boundingBoxScaleMethod:C}=e.canvas,k={id:aB,nodes:{[Ds]:{type:"inpaint",id:Ds,steps:l,width:_,height:w,cfg_scale:s,scheduler:a,image:{image_name:t.image_name},strength:u,fit:c,mask:{image_name:n.image_name},seam_size:p,seam_blur:m,seam_strength:v,seam_steps:S,tile_size:g==="tile"?y:void 0,infill_method:g,inpaint_width:C!=="none"?x.width:void 0,inpaint_height:C!=="none"?x.height:void 0},[Lt]:{type:"compel",id:Lt,prompt:r},[Wt]:{type:"compel",id:Wt,prompt:i},[wt]:{type:"main_model_loader",id:wt,model:o},[ft]:{type:"clip_skip",id:ft,skipped_layers:b},[Xo]:{type:"range_of_size",id:Xo,size:d,step:1},[br]:{type:"iterate",id:br}},edges:[{source:{node_id:wt,field:"unet"},destination:{node_id:Ds,field:"unet"}},{source:{node_id:wt,field:"clip"},destination:{node_id:ft,field:"clip"}},{source:{node_id:ft,field:"clip"},destination:{node_id:Lt,field:"clip"}},{source:{node_id:ft,field:"clip"},destination:{node_id:Wt,field:"clip"}},{source:{node_id:Wt,field:"conditioning"},destination:{node_id:Ds,field:"negative_conditioning"}},{source:{node_id:Lt,field:"conditioning"},destination:{node_id:Ds,field:"positive_conditioning"}},{source:{node_id:Xo,field:"collection"},destination:{node_id:br,field:"collection"}},{source:{node_id:br,field:"item"},destination:{node_id:Ds,field:"seed"}}]};if(Rp(e,k,Ds),Ip(e,k),h){const P={id:Qi,type:"rand_int"};k.nodes[Qi]=P,k.edges.push({source:{node_id:Qi,field:"a"},destination:{node_id:Xo,field:"start"}})}else k.nodes[Xo].start=f;return k},y_e=e=>h7(e,n=>n.isEnabled&&(!!n.processedControlImage||n.processorType==="none"&&!!n.controlImage)),k1=(e,t,n)=>{const{isEnabled:r,controlNets:i}=e.controlNet,o=y_e(i),s=t.nodes[fn];if(r&&o.length&&o.length){const a={id:Lg,type:"collect"};t.nodes[Lg]=a,t.edges.push({source:{node_id:Lg,field:"collection"},destination:{node_id:n,field:"control"}}),o.forEach(l=>{const{controlNetId:u,controlImage:c,processedControlImage:d,beginStepPct:f,endStepPct:h,controlMode:p,model:m,processorType:S,weight:v}=l,y={id:`control_net_${u}`,type:"controlnet",begin_step_percent:f,end_step_percent:h,control_mode:p,control_model:m,control_weight:v};if(d&&S!=="none")y.image={image_name:d};else if(c)y.image={image_name:c};else return;if(t.nodes[y.id]=y,s){const g=h5(y,["id","type"]);s.controlnets.push(g)}t.edges.push({source:{node_id:y.id,field:"control"},destination:{node_id:Lg,field:"item"}})})}},A1=(e,t)=>{const{positivePrompt:n,iterations:r,seed:i,shouldRandomizeSeed:o}=e.generation,{combinatorial:s,isEnabled:a,maxPrompts:l}=e.dynamicPrompts,u=t.nodes[fn];if(a){LZ(t.nodes[Lt],"prompt");const c={id:P_,type:"dynamic_prompt",max_prompts:s?l:r,combinatorial:s,prompt:n},d={id:br,type:"iterate"};if(t.nodes[P_]=c,t.nodes[br]=d,t.edges.push({source:{node_id:P_,field:"prompt_collection"},destination:{node_id:br,field:"collection"}},{source:{node_id:br,field:"item"},destination:{node_id:Lt,field:"prompt"}}),u&&t.edges.push({source:{node_id:br,field:"item"},destination:{node_id:fn,field:"positive_prompt"}}),o){const f={id:Qi,type:"rand_int"};t.nodes[Qi]=f,t.edges.push({source:{node_id:Qi,field:"a"},destination:{node_id:Nt,field:"seed"}}),u&&t.edges.push({source:{node_id:Qi,field:"a"},destination:{node_id:fn,field:"seed"}})}else t.nodes[Nt].seed=i,u&&(u.seed=i)}else{u&&(u.positive_prompt=n);const c={id:Xo,type:"range_of_size",size:r,step:1},d={id:br,type:"iterate"};if(t.nodes[br]=d,t.nodes[Xo]=c,t.edges.push({source:{node_id:Xo,field:"collection"},destination:{node_id:br,field:"collection"}}),t.edges.push({source:{node_id:br,field:"item"},destination:{node_id:Nt,field:"seed"}}),u&&t.edges.push({source:{node_id:br,field:"item"},destination:{node_id:fn,field:"seed"}}),o){const f={id:Qi,type:"rand_int"};t.nodes[Qi]=f,t.edges.push({source:{node_id:Qi,field:"a"},destination:{node_id:Xo,field:"start"}})}else c.start=i}},v_e=ve.child({namespace:"nodes"}),b_e=(e,t)=>{const{positivePrompt:n,negativePrompt:r,model:i,cfgScale:o,scheduler:s,steps:a,img2imgStrength:l,clipSkip:u,shouldUseCpuNoise:c,shouldUseNoiseSettings:d}=e.generation,{width:f,height:h}=e.canvas.boundingBoxDimensions;if(!i)throw v_e.error("No model found in state"),new Error("No model found in state");const p=d?c:Vl.shouldUseCpuNoise,m={id:h0,nodes:{[Lt]:{type:"compel",id:Lt,prompt:n},[Wt]:{type:"compel",id:Wt,prompt:r},[Nt]:{type:"noise",id:Nt,use_cpu:p},[wt]:{type:"main_model_loader",id:wt,model:i},[ft]:{type:"clip_skip",id:ft,skipped_layers:u},[jn]:{type:"l2i",id:jn},[tn]:{type:"l2l",id:tn,cfg_scale:o,scheduler:s,steps:a,strength:l},[ur]:{type:"i2l",id:ur}},edges:[{source:{node_id:wt,field:"clip"},destination:{node_id:ft,field:"clip"}},{source:{node_id:ft,field:"clip"},destination:{node_id:Lt,field:"clip"}},{source:{node_id:ft,field:"clip"},destination:{node_id:Wt,field:"clip"}},{source:{node_id:tn,field:"latents"},destination:{node_id:jn,field:"latents"}},{source:{node_id:ur,field:"latents"},destination:{node_id:tn,field:"latents"}},{source:{node_id:Nt,field:"noise"},destination:{node_id:tn,field:"noise"}},{source:{node_id:wt,field:"unet"},destination:{node_id:tn,field:"unet"}},{source:{node_id:Wt,field:"conditioning"},destination:{node_id:tn,field:"negative_conditioning"}},{source:{node_id:Lt,field:"conditioning"},destination:{node_id:tn,field:"positive_conditioning"}}]};if(t.width!==f||t.height!==h){const S={id:so,type:"img_resize",image:{image_name:t.image_name},is_intermediate:!0,width:f,height:h};m.nodes[so]=S,m.edges.push({source:{node_id:so,field:"image"},destination:{node_id:ur,field:"image"}}),m.edges.push({source:{node_id:so,field:"width"},destination:{node_id:Nt,field:"width"}}),m.edges.push({source:{node_id:so,field:"height"},destination:{node_id:Nt,field:"height"}})}else m.nodes[ur].image={image_name:t.image_name},m.edges.push({source:{node_id:ur,field:"width"},destination:{node_id:Nt,field:"width"}}),m.edges.push({source:{node_id:ur,field:"height"},destination:{node_id:Nt,field:"height"}});return m.nodes[fn]={id:fn,type:"metadata_accumulator",generation_mode:"img2img",cfg_scale:o,height:h,width:f,positive_prompt:"",negative_prompt:r,model:i,seed:0,steps:a,rand_device:p?"cpu":"cuda",scheduler:s,vae:void 0,controlnets:[],loras:[],clip_skip:u,strength:l,init_image:t.image_name},m.edges.push({source:{node_id:fn,field:"metadata"},destination:{node_id:jn,field:"metadata"}}),Rp(e,m,tn),Ip(e,m),A1(e,m),k1(e,m,tn),m},S_e=ve.child({namespace:"nodes"}),__e=e=>{const{positivePrompt:t,negativePrompt:n,model:r,cfgScale:i,scheduler:o,steps:s,clipSkip:a,shouldUseCpuNoise:l,shouldUseNoiseSettings:u}=e.generation,{width:c,height:d}=e.canvas.boundingBoxDimensions;if(!r)throw S_e.error("No model found in state"),new Error("No model found in state");const f=u?l:Vl.shouldUseCpuNoise,h={id:z3,nodes:{[Lt]:{type:"compel",id:Lt,prompt:t},[Wt]:{type:"compel",id:Wt,prompt:n},[Nt]:{type:"noise",id:Nt,width:c,height:d,use_cpu:f},[wn]:{type:"t2l",id:wn,cfg_scale:i,scheduler:o,steps:s},[wt]:{type:"main_model_loader",id:wt,model:r},[ft]:{type:"clip_skip",id:ft,skipped_layers:a},[jn]:{type:"l2i",id:jn}},edges:[{source:{node_id:Wt,field:"conditioning"},destination:{node_id:wn,field:"negative_conditioning"}},{source:{node_id:Lt,field:"conditioning"},destination:{node_id:wn,field:"positive_conditioning"}},{source:{node_id:wt,field:"clip"},destination:{node_id:ft,field:"clip"}},{source:{node_id:ft,field:"clip"},destination:{node_id:Lt,field:"clip"}},{source:{node_id:ft,field:"clip"},destination:{node_id:Wt,field:"clip"}},{source:{node_id:wt,field:"unet"},destination:{node_id:wn,field:"unet"}},{source:{node_id:wn,field:"latents"},destination:{node_id:jn,field:"latents"}},{source:{node_id:Nt,field:"noise"},destination:{node_id:wn,field:"noise"}}]};return h.nodes[fn]={id:fn,type:"metadata_accumulator",generation_mode:"txt2img",cfg_scale:i,height:d,width:c,positive_prompt:"",negative_prompt:n,model:r,seed:0,steps:s,rand_device:f?"cpu":"cuda",scheduler:o,vae:void 0,controlnets:[],loras:[],clip_skip:a},h.edges.push({source:{node_id:fn,field:"metadata"},destination:{node_id:jn,field:"metadata"}}),Rp(e,h,wn),Ip(e,h),A1(e,h),k1(e,h,wn),h};ve.child({namespace:"nodes"});const w_e=(e,t,n,r)=>{let i;if(t==="txt2img")i=__e(e);else if(t==="img2img"){if(!n)throw new Error("Missing canvas init image");i=b_e(e,n)}else{if(!n||!r)throw new Error("Missing canvas init and mask images");i=m_e(e,n,r)}return _l(i.nodes,o=>{i.nodes[o.id].is_intermediate=!0}),i},lB=ge("nodes/textToImageGraphBuilt"),uB=ge("nodes/imageToImageGraphBuilt"),cB=ge("nodes/canvasGraphBuilt"),dB=ge("nodes/nodesGraphBuilt"),x_e=vs(lB,uB,cB,dB);var U3={exports:{}},O1={},fB={},De={};(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e._registerNode=e.Konva=e.glob=void 0;var t=Math.PI/180;function n(){return typeof window<"u"&&({}.toString.call(window)==="[object Window]"||{}.toString.call(window)==="[object global]")}e.glob=typeof Ne<"u"?Ne:typeof window<"u"?window:typeof WorkerGlobalScope<"u"?self:{},e.Konva={_global:e.glob,version:"9.2.0",isBrowser:n(),isUnminified:/param/.test((function(i){}).toString()),dblClickWindow:400,getAngle(i){return e.Konva.angleDeg?i*t:i},enableTrace:!1,pointerEventsEnabled:!0,autoDrawEnabled:!0,hitOnDragEnabled:!1,capturePointerEventsEnabled:!1,_mouseListenClick:!1,_touchListenClick:!1,_pointerListenClick:!1,_mouseInDblClickWindow:!1,_touchInDblClickWindow:!1,_pointerInDblClickWindow:!1,_mouseDblClickPointerId:null,_touchDblClickPointerId:null,_pointerDblClickPointerId:null,pixelRatio:typeof window<"u"&&window.devicePixelRatio||1,dragDistance:3,angleDeg:!0,showWarnings:!0,dragButtons:[0,1],isDragging(){return e.Konva.DD.isDragging},isDragReady(){return!!e.Konva.DD.node},releaseCanvasOnDestroy:!0,document:e.glob.document,_injectGlobal(i){e.glob.Konva=i}};const r=i=>{e.Konva[i.prototype.getClassName()]=i};e._registerNode=r,e.Konva._injectGlobal(e.Konva)})(De);var Bt={};(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.Util=e.Transform=void 0;const t=De;class n{constructor(b=[1,0,0,1,0,0]){this.dirty=!1,this.m=b&&b.slice()||[1,0,0,1,0,0]}reset(){this.m[0]=1,this.m[1]=0,this.m[2]=0,this.m[3]=1,this.m[4]=0,this.m[5]=0}copy(){return new n(this.m)}copyInto(b){b.m[0]=this.m[0],b.m[1]=this.m[1],b.m[2]=this.m[2],b.m[3]=this.m[3],b.m[4]=this.m[4],b.m[5]=this.m[5]}point(b){var _=this.m;return{x:_[0]*b.x+_[2]*b.y+_[4],y:_[1]*b.x+_[3]*b.y+_[5]}}translate(b,_){return this.m[4]+=this.m[0]*b+this.m[2]*_,this.m[5]+=this.m[1]*b+this.m[3]*_,this}scale(b,_){return this.m[0]*=b,this.m[1]*=b,this.m[2]*=_,this.m[3]*=_,this}rotate(b){var _=Math.cos(b),w=Math.sin(b),x=this.m[0]*_+this.m[2]*w,C=this.m[1]*_+this.m[3]*w,k=this.m[0]*-w+this.m[2]*_,P=this.m[1]*-w+this.m[3]*_;return this.m[0]=x,this.m[1]=C,this.m[2]=k,this.m[3]=P,this}getTranslation(){return{x:this.m[4],y:this.m[5]}}skew(b,_){var w=this.m[0]+this.m[2]*_,x=this.m[1]+this.m[3]*_,C=this.m[2]+this.m[0]*b,k=this.m[3]+this.m[1]*b;return this.m[0]=w,this.m[1]=x,this.m[2]=C,this.m[3]=k,this}multiply(b){var _=this.m[0]*b.m[0]+this.m[2]*b.m[1],w=this.m[1]*b.m[0]+this.m[3]*b.m[1],x=this.m[0]*b.m[2]+this.m[2]*b.m[3],C=this.m[1]*b.m[2]+this.m[3]*b.m[3],k=this.m[0]*b.m[4]+this.m[2]*b.m[5]+this.m[4],P=this.m[1]*b.m[4]+this.m[3]*b.m[5]+this.m[5];return this.m[0]=_,this.m[1]=w,this.m[2]=x,this.m[3]=C,this.m[4]=k,this.m[5]=P,this}invert(){var b=1/(this.m[0]*this.m[3]-this.m[1]*this.m[2]),_=this.m[3]*b,w=-this.m[1]*b,x=-this.m[2]*b,C=this.m[0]*b,k=b*(this.m[2]*this.m[5]-this.m[3]*this.m[4]),P=b*(this.m[1]*this.m[4]-this.m[0]*this.m[5]);return this.m[0]=_,this.m[1]=w,this.m[2]=x,this.m[3]=C,this.m[4]=k,this.m[5]=P,this}getMatrix(){return this.m}decompose(){var b=this.m[0],_=this.m[1],w=this.m[2],x=this.m[3],C=this.m[4],k=this.m[5],P=b*x-_*w;let A={x:C,y:k,rotation:0,scaleX:0,scaleY:0,skewX:0,skewY:0};if(b!=0||_!=0){var $=Math.sqrt(b*b+_*_);A.rotation=_>0?Math.acos(b/$):-Math.acos(b/$),A.scaleX=$,A.scaleY=P/$,A.skewX=(b*w+_*x)/P,A.skewY=0}else if(w!=0||x!=0){var N=Math.sqrt(w*w+x*x);A.rotation=Math.PI/2-(x>0?Math.acos(-w/N):-Math.acos(w/N)),A.scaleX=P/N,A.scaleY=N,A.skewX=0,A.skewY=(b*w+_*x)/P}return A.rotation=e.Util._getRotation(A.rotation),A}}e.Transform=n;var r="[object Array]",i="[object Number]",o="[object String]",s="[object Boolean]",a=Math.PI/180,l=180/Math.PI,u="#",c="",d="0",f="Konva warning: ",h="Konva error: ",p="rgb(",m={aliceblue:[240,248,255],antiquewhite:[250,235,215],aqua:[0,255,255],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],black:[0,0,0],blanchedalmond:[255,235,205],blue:[0,0,255],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,132,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,255,240],forestgreen:[34,139,34],fuchsia:[255,0,255],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],gray:[128,128,128],green:[0,128,0],greenyellow:[173,255,47],grey:[128,128,128],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],lime:[0,255,0],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],maroon:[128,0,0],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],navy:[0,0,128],oldlace:[253,245,230],olive:[128,128,0],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,203],powderblue:[176,224,230],purple:[128,0,128],rebeccapurple:[102,51,153],red:[255,0,0],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],silver:[192,192,192],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[119,128,144],slategrey:[119,128,144],snow:[255,255,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],teal:[0,128,128],thistle:[216,191,216],transparent:[255,255,255,0],tomato:[255,99,71],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],white:[255,255,255],whitesmoke:[245,245,245],yellow:[255,255,0],yellowgreen:[154,205,5]},S=/rgb\((\d{1,3}),(\d{1,3}),(\d{1,3})\)/,v=[];const y=typeof requestAnimationFrame<"u"&&requestAnimationFrame||function(g){setTimeout(g,60)};e.Util={_isElement(g){return!!(g&&g.nodeType==1)},_isFunction(g){return!!(g&&g.constructor&&g.call&&g.apply)},_isPlainObject(g){return!!g&&g.constructor===Object},_isArray(g){return Object.prototype.toString.call(g)===r},_isNumber(g){return Object.prototype.toString.call(g)===i&&!isNaN(g)&&isFinite(g)},_isString(g){return Object.prototype.toString.call(g)===o},_isBoolean(g){return Object.prototype.toString.call(g)===s},isObject(g){return g instanceof Object},isValidSelector(g){if(typeof g!="string")return!1;var b=g[0];return b==="#"||b==="."||b===b.toUpperCase()},_sign(g){return g===0||g>0?1:-1},requestAnimFrame(g){v.push(g),v.length===1&&y(function(){const b=v;v=[],b.forEach(function(_){_()})})},createCanvasElement(){var g=document.createElement("canvas");try{g.style=g.style||{}}catch{}return g},createImageElement(){return document.createElement("img")},_isInDocument(g){for(;g=g.parentNode;)if(g==document)return!0;return!1},_urlToImage(g,b){var _=e.Util.createImageElement();_.onload=function(){b(_)},_.src=g},_rgbToHex(g,b,_){return((1<<24)+(g<<16)+(b<<8)+_).toString(16).slice(1)},_hexToRgb(g){g=g.replace(u,c);var b=parseInt(g,16);return{r:b>>16&255,g:b>>8&255,b:b&255}},getRandomColor(){for(var g=(Math.random()*16777215<<0).toString(16);g.length<6;)g=d+g;return u+g},getRGB(g){var b;return g in m?(b=m[g],{r:b[0],g:b[1],b:b[2]}):g[0]===u?this._hexToRgb(g.substring(1)):g.substr(0,4)===p?(b=S.exec(g.replace(/ /g,"")),{r:parseInt(b[1],10),g:parseInt(b[2],10),b:parseInt(b[3],10)}):{r:0,g:0,b:0}},colorToRGBA(g){return g=g||"black",e.Util._namedColorToRBA(g)||e.Util._hex3ColorToRGBA(g)||e.Util._hex4ColorToRGBA(g)||e.Util._hex6ColorToRGBA(g)||e.Util._hex8ColorToRGBA(g)||e.Util._rgbColorToRGBA(g)||e.Util._rgbaColorToRGBA(g)||e.Util._hslColorToRGBA(g)},_namedColorToRBA(g){var b=m[g.toLowerCase()];return b?{r:b[0],g:b[1],b:b[2],a:1}:null},_rgbColorToRGBA(g){if(g.indexOf("rgb(")===0){g=g.match(/rgb\(([^)]+)\)/)[1];var b=g.split(/ *, */).map(Number);return{r:b[0],g:b[1],b:b[2],a:1}}},_rgbaColorToRGBA(g){if(g.indexOf("rgba(")===0){g=g.match(/rgba\(([^)]+)\)/)[1];var b=g.split(/ *, */).map((_,w)=>_.slice(-1)==="%"?w===3?parseInt(_)/100:parseInt(_)/100*255:Number(_));return{r:b[0],g:b[1],b:b[2],a:b[3]}}},_hex8ColorToRGBA(g){if(g[0]==="#"&&g.length===9)return{r:parseInt(g.slice(1,3),16),g:parseInt(g.slice(3,5),16),b:parseInt(g.slice(5,7),16),a:parseInt(g.slice(7,9),16)/255}},_hex6ColorToRGBA(g){if(g[0]==="#"&&g.length===7)return{r:parseInt(g.slice(1,3),16),g:parseInt(g.slice(3,5),16),b:parseInt(g.slice(5,7),16),a:1}},_hex4ColorToRGBA(g){if(g[0]==="#"&&g.length===5)return{r:parseInt(g[1]+g[1],16),g:parseInt(g[2]+g[2],16),b:parseInt(g[3]+g[3],16),a:parseInt(g[4]+g[4],16)/255}},_hex3ColorToRGBA(g){if(g[0]==="#"&&g.length===4)return{r:parseInt(g[1]+g[1],16),g:parseInt(g[2]+g[2],16),b:parseInt(g[3]+g[3],16),a:1}},_hslColorToRGBA(g){if(/hsl\((\d+),\s*([\d.]+)%,\s*([\d.]+)%\)/g.test(g)){const[b,..._]=/hsl\((\d+),\s*([\d.]+)%,\s*([\d.]+)%\)/g.exec(g),w=Number(_[0])/360,x=Number(_[1])/100,C=Number(_[2])/100;let k,P,A;if(x===0)return A=C*255,{r:Math.round(A),g:Math.round(A),b:Math.round(A),a:1};C<.5?k=C*(1+x):k=C+x-C*x;const $=2*C-k,N=[0,0,0];for(let T=0;T<3;T++)P=w+1/3*-(T-1),P<0&&P++,P>1&&P--,6*P<1?A=$+(k-$)*6*P:2*P<1?A=k:3*P<2?A=$+(k-$)*(2/3-P)*6:A=$,N[T]=A*255;return{r:Math.round(N[0]),g:Math.round(N[1]),b:Math.round(N[2]),a:1}}},haveIntersection(g,b){return!(b.x>g.x+g.width||b.x+b.widthg.y+g.height||b.y+b.height1?(k=_,P=w,A=(_-x)*(_-x)+(w-C)*(w-C)):(k=g+N*(_-g),P=b+N*(w-b),A=(k-x)*(k-x)+(P-C)*(P-C))}return[k,P,A]},_getProjectionToLine(g,b,_){var w=e.Util.cloneObject(g),x=Number.MAX_VALUE;return b.forEach(function(C,k){if(!(!_&&k===b.length-1)){var P=b[(k+1)%b.length],A=e.Util._getProjectionToSegment(C.x,C.y,P.x,P.y,g.x,g.y),$=A[0],N=A[1],T=A[2];Tb.length){var k=b;b=g,g=k}for(w=0;w{b.width=0,b.height=0})},drawRoundedRectPath(g,b,_,w){let x=0,C=0,k=0,P=0;typeof w=="number"?x=C=k=P=Math.min(w,b/2,_/2):(x=Math.min(w[0]||0,b/2,_/2),C=Math.min(w[1]||0,b/2,_/2),P=Math.min(w[2]||0,b/2,_/2),k=Math.min(w[3]||0,b/2,_/2)),g.moveTo(x,0),g.lineTo(b-C,0),g.arc(b-C,C,C,Math.PI*3/2,0,!1),g.lineTo(b,_-P),g.arc(b-P,_-P,P,0,Math.PI/2,!1),g.lineTo(k,_),g.arc(k,_-k,k,Math.PI/2,Math.PI,!1),g.lineTo(0,x),g.arc(x,x,x,Math.PI,Math.PI*3/2,!1)}}})(Bt);var At={},Re={},he={};Object.defineProperty(he,"__esModule",{value:!0});he.getComponentValidator=he.getBooleanValidator=he.getNumberArrayValidator=he.getFunctionValidator=he.getStringOrGradientValidator=he.getStringValidator=he.getNumberOrAutoValidator=he.getNumberOrArrayOfNumbersValidator=he.getNumberValidator=he.alphaComponent=he.RGBComponent=void 0;const ws=De,zt=Bt;function xs(e){return zt.Util._isString(e)?'"'+e+'"':Object.prototype.toString.call(e)==="[object Number]"||zt.Util._isBoolean(e)?e:Object.prototype.toString.call(e)}function C_e(e){return e>255?255:e<0?0:Math.round(e)}he.RGBComponent=C_e;function T_e(e){return e>1?1:e<1e-4?1e-4:e}he.alphaComponent=T_e;function E_e(){if(ws.Konva.isUnminified)return function(e,t){return zt.Util._isNumber(e)||zt.Util.warn(xs(e)+' is a not valid value for "'+t+'" attribute. The value should be a number.'),e}}he.getNumberValidator=E_e;function P_e(e){if(ws.Konva.isUnminified)return function(t,n){let r=zt.Util._isNumber(t),i=zt.Util._isArray(t)&&t.length==e;return!r&&!i&&zt.Util.warn(xs(t)+' is a not valid value for "'+n+'" attribute. The value should be a number or Array('+e+")"),t}}he.getNumberOrArrayOfNumbersValidator=P_e;function k_e(){if(ws.Konva.isUnminified)return function(e,t){var n=zt.Util._isNumber(e),r=e==="auto";return n||r||zt.Util.warn(xs(e)+' is a not valid value for "'+t+'" attribute. The value should be a number or "auto".'),e}}he.getNumberOrAutoValidator=k_e;function A_e(){if(ws.Konva.isUnminified)return function(e,t){return zt.Util._isString(e)||zt.Util.warn(xs(e)+' is a not valid value for "'+t+'" attribute. The value should be a string.'),e}}he.getStringValidator=A_e;function O_e(){if(ws.Konva.isUnminified)return function(e,t){const n=zt.Util._isString(e),r=Object.prototype.toString.call(e)==="[object CanvasGradient]"||e&&e.addColorStop;return n||r||zt.Util.warn(xs(e)+' is a not valid value for "'+t+'" attribute. The value should be a string or a native gradient.'),e}}he.getStringOrGradientValidator=O_e;function R_e(){if(ws.Konva.isUnminified)return function(e,t){return zt.Util._isFunction(e)||zt.Util.warn(xs(e)+' is a not valid value for "'+t+'" attribute. The value should be a function.'),e}}he.getFunctionValidator=R_e;function I_e(){if(ws.Konva.isUnminified)return function(e,t){const n=Int8Array?Object.getPrototypeOf(Int8Array):null;return n&&e instanceof n||(zt.Util._isArray(e)?e.forEach(function(r){zt.Util._isNumber(r)||zt.Util.warn('"'+t+'" attribute has non numeric element '+r+". Make sure that all elements are numbers.")}):zt.Util.warn(xs(e)+' is a not valid value for "'+t+'" attribute. The value should be a array of numbers.')),e}}he.getNumberArrayValidator=I_e;function M_e(){if(ws.Konva.isUnminified)return function(e,t){var n=e===!0||e===!1;return n||zt.Util.warn(xs(e)+' is a not valid value for "'+t+'" attribute. The value should be a boolean.'),e}}he.getBooleanValidator=M_e;function N_e(e){if(ws.Konva.isUnminified)return function(t,n){return t==null||zt.Util.isObject(t)||zt.Util.warn(xs(t)+' is a not valid value for "'+n+'" attribute. The value should be an object with properties '+e),t}}he.getComponentValidator=N_e;(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.Factory=void 0;const t=Bt,n=he;var r="get",i="set";e.Factory={addGetterSetter(o,s,a,l,u){e.Factory.addGetter(o,s,a),e.Factory.addSetter(o,s,l,u),e.Factory.addOverloadedGetterSetter(o,s)},addGetter(o,s,a){var l=r+t.Util._capitalize(s);o.prototype[l]=o.prototype[l]||function(){var u=this.attrs[s];return u===void 0?a:u}},addSetter(o,s,a,l){var u=i+t.Util._capitalize(s);o.prototype[u]||e.Factory.overWriteSetter(o,s,a,l)},overWriteSetter(o,s,a,l){var u=i+t.Util._capitalize(s);o.prototype[u]=function(c){return a&&c!==void 0&&c!==null&&(c=a.call(this,c,s)),this._setAttr(s,c),l&&l.call(this),this}},addComponentsGetterSetter(o,s,a,l,u){var c=a.length,d=t.Util._capitalize,f=r+d(s),h=i+d(s),p,m;o.prototype[f]=function(){var v={};for(p=0;p{this._setAttr(s+d(b),void 0)}),this._fireChangeEvent(s,y,v),u&&u.call(this),this},e.Factory.addOverloadedGetterSetter(o,s)},addOverloadedGetterSetter(o,s){var a=t.Util._capitalize(s),l=i+a,u=r+a;o.prototype[s]=function(){return arguments.length?(this[l](arguments[0]),this):this[u]()}},addDeprecatedGetterSetter(o,s,a,l){t.Util.error("Adding deprecated "+s);var u=r+t.Util._capitalize(s),c=s+" property is deprecated and will be removed soon. Look at Konva change log for more information.";o.prototype[u]=function(){t.Util.error(c);var d=this.attrs[s];return d===void 0?a:d},e.Factory.addSetter(o,s,l,function(){t.Util.error(c)}),e.Factory.addOverloadedGetterSetter(o,s)},backCompat(o,s){t.Util.each(s,function(a,l){var u=o.prototype[l],c=r+t.Util._capitalize(a),d=i+t.Util._capitalize(a);function f(){u.apply(this,arguments),t.Util.error('"'+a+'" method is deprecated and will be removed soon. Use ""'+l+'" instead.')}o.prototype[a]=f,o.prototype[c]=f,o.prototype[d]=f})},afterSetFilter(){this._filterUpToDate=!1}}})(Re);var $i={},ss={};Object.defineProperty(ss,"__esModule",{value:!0});ss.HitContext=ss.SceneContext=ss.Context=void 0;const hB=Bt,D_e=De;function L_e(e){var t=[],n=e.length,r=hB.Util,i,o;for(i=0;itypeof c=="number"?Math.floor(c):c)),o+=$_e+u.join(U8)+F_e)):(o+=a.property,t||(o+=U_e+a.val)),o+=V_e;return o}clearTrace(){this.traceArr=[]}_trace(t){var n=this.traceArr,r;n.push(t),r=n.length,r>=H_e&&n.shift()}reset(){var t=this.getCanvas().getPixelRatio();this.setTransform(1*t,0,0,1*t,0,0)}getCanvas(){return this.canvas}clear(t){var n=this.getCanvas();t?this.clearRect(t.x||0,t.y||0,t.width||0,t.height||0):this.clearRect(0,0,n.getWidth()/n.pixelRatio,n.getHeight()/n.pixelRatio)}_applyLineCap(t){const n=t.attrs.lineCap;n&&this.setAttr("lineCap",n)}_applyOpacity(t){var n=t.getAbsoluteOpacity();n!==1&&this.setAttr("globalAlpha",n)}_applyLineJoin(t){const n=t.attrs.lineJoin;n&&this.setAttr("lineJoin",n)}setAttr(t,n){this._context[t]=n}arc(t,n,r,i,o,s){this._context.arc(t,n,r,i,o,s)}arcTo(t,n,r,i,o){this._context.arcTo(t,n,r,i,o)}beginPath(){this._context.beginPath()}bezierCurveTo(t,n,r,i,o,s){this._context.bezierCurveTo(t,n,r,i,o,s)}clearRect(t,n,r,i){this._context.clearRect(t,n,r,i)}clip(...t){this._context.clip.apply(this._context,t)}closePath(){this._context.closePath()}createImageData(t,n){var r=arguments;if(r.length===2)return this._context.createImageData(t,n);if(r.length===1)return this._context.createImageData(t)}createLinearGradient(t,n,r,i){return this._context.createLinearGradient(t,n,r,i)}createPattern(t,n){return this._context.createPattern(t,n)}createRadialGradient(t,n,r,i,o,s){return this._context.createRadialGradient(t,n,r,i,o,s)}drawImage(t,n,r,i,o,s,a,l,u){var c=arguments,d=this._context;c.length===3?d.drawImage(t,n,r):c.length===5?d.drawImage(t,n,r,i,o):c.length===9&&d.drawImage(t,n,r,i,o,s,a,l,u)}ellipse(t,n,r,i,o,s,a,l){this._context.ellipse(t,n,r,i,o,s,a,l)}isPointInPath(t,n,r,i){return r?this._context.isPointInPath(r,t,n,i):this._context.isPointInPath(t,n,i)}fill(...t){this._context.fill.apply(this._context,t)}fillRect(t,n,r,i){this._context.fillRect(t,n,r,i)}strokeRect(t,n,r,i){this._context.strokeRect(t,n,r,i)}fillText(t,n,r,i){i?this._context.fillText(t,n,r,i):this._context.fillText(t,n,r)}measureText(t){return this._context.measureText(t)}getImageData(t,n,r,i){return this._context.getImageData(t,n,r,i)}lineTo(t,n){this._context.lineTo(t,n)}moveTo(t,n){this._context.moveTo(t,n)}rect(t,n,r,i){this._context.rect(t,n,r,i)}putImageData(t,n,r){this._context.putImageData(t,n,r)}quadraticCurveTo(t,n,r,i){this._context.quadraticCurveTo(t,n,r,i)}restore(){this._context.restore()}rotate(t){this._context.rotate(t)}save(){this._context.save()}scale(t,n){this._context.scale(t,n)}setLineDash(t){this._context.setLineDash?this._context.setLineDash(t):"mozDash"in this._context?this._context.mozDash=t:"webkitLineDash"in this._context&&(this._context.webkitLineDash=t)}getLineDash(){return this._context.getLineDash()}setTransform(t,n,r,i,o,s){this._context.setTransform(t,n,r,i,o,s)}stroke(t){t?this._context.stroke(t):this._context.stroke()}strokeText(t,n,r,i){this._context.strokeText(t,n,r,i)}transform(t,n,r,i,o,s){this._context.transform(t,n,r,i,o,s)}translate(t,n){this._context.translate(t,n)}_enableTrace(){var t=this,n=G8.length,r=this.setAttr,i,o,s=function(a){var l=t[a],u;t[a]=function(){return o=L_e(Array.prototype.slice.call(arguments,0)),u=l.apply(t,arguments),t._trace({method:a,args:o}),u}};for(i=0;i{i.dragStatus==="dragging"&&(r=!0)}),r},justDragged:!1,get node(){var r;return e.DD._dragElements.forEach(i=>{r=i.node}),r},_dragElements:new Map,_drag(r){const i=[];e.DD._dragElements.forEach((o,s)=>{const{node:a}=o,l=a.getStage();l.setPointersPositions(r),o.pointerId===void 0&&(o.pointerId=n.Util._getFirstPointerId(r));const u=l._changedPointerPositions.find(f=>f.id===o.pointerId);if(u){if(o.dragStatus!=="dragging"){var c=a.dragDistance(),d=Math.max(Math.abs(u.x-o.startPointerPos.x),Math.abs(u.y-o.startPointerPos.y));if(d{o.fire("dragmove",{type:"dragmove",target:o,evt:r},!0)})},_endDragBefore(r){const i=[];e.DD._dragElements.forEach(o=>{const{node:s}=o,a=s.getStage();if(r&&a.setPointersPositions(r),!a._changedPointerPositions.find(c=>c.id===o.pointerId))return;(o.dragStatus==="dragging"||o.dragStatus==="stopped")&&(e.DD.justDragged=!0,t.Konva._mouseListenClick=!1,t.Konva._touchListenClick=!1,t.Konva._pointerListenClick=!1,o.dragStatus="stopped");const u=o.node.getLayer()||o.node instanceof t.Konva.Stage&&o.node;u&&i.indexOf(u)===-1&&i.push(u)}),i.forEach(o=>{o.draw()})},_endDragAfter(r){e.DD._dragElements.forEach((i,o)=>{i.dragStatus==="stopped"&&i.node.fire("dragend",{type:"dragend",target:i.node,evt:r},!0),i.dragStatus!=="dragging"&&e.DD._dragElements.delete(o)})}},t.Konva.isBrowser&&(window.addEventListener("mouseup",e.DD._endDragBefore,!0),window.addEventListener("touchend",e.DD._endDragBefore,!0),window.addEventListener("mousemove",e.DD._drag),window.addEventListener("touchmove",e.DD._drag),window.addEventListener("mouseup",e.DD._endDragAfter,!1),window.addEventListener("touchend",e.DD._endDragAfter,!1))})(M1);Object.defineProperty(At,"__esModule",{value:!0});At.Node=void 0;const Be=Bt,Mp=Re,Fg=$i,za=De,ei=M1,Yt=he;var Om="absoluteOpacity",Bg="allEventListeners",qo="absoluteTransform",H8="absoluteScale",Ua="canvas",J_e="Change",e2e="children",t2e="konva",yx="listening",q8="mouseenter",W8="mouseleave",K8="set",Y8="Shape",Rm=" ",X8="stage",Ls="transform",n2e="Stage",vx="visible",r2e=["xChange.konva","yChange.konva","scaleXChange.konva","scaleYChange.konva","skewXChange.konva","skewYChange.konva","rotationChange.konva","offsetXChange.konva","offsetYChange.konva","transformsEnabledChange.konva"].join(Rm);let i2e=1,Ee=class bx{constructor(t){this._id=i2e++,this.eventListeners={},this.attrs={},this.index=0,this._allEventListeners=null,this.parent=null,this._cache=new Map,this._attachedDepsListeners=new Map,this._lastPos=null,this._batchingTransformChange=!1,this._needClearTransformCache=!1,this._filterUpToDate=!1,this._isUnderCache=!1,this._dragEventId=null,this._shouldFireChangeEvents=!1,this.setAttrs(t),this._shouldFireChangeEvents=!0}hasChildren(){return!1}_clearCache(t){(t===Ls||t===qo)&&this._cache.get(t)?this._cache.get(t).dirty=!0:t?this._cache.delete(t):this._cache.clear()}_getCache(t,n){var r=this._cache.get(t),i=t===Ls||t===qo,o=r===void 0||i&&r.dirty===!0;return o&&(r=n.call(this),this._cache.set(t,r)),r}_calculate(t,n,r){if(!this._attachedDepsListeners.get(t)){const i=n.map(o=>o+"Change.konva").join(Rm);this.on(i,()=>{this._clearCache(t)}),this._attachedDepsListeners.set(t,!0)}return this._getCache(t,r)}_getCanvasCache(){return this._cache.get(Ua)}_clearSelfAndDescendantCache(t){this._clearCache(t),t===qo&&this.fire("absoluteTransformChange")}clearCache(){if(this._cache.has(Ua)){const{scene:t,filter:n,hit:r}=this._cache.get(Ua);Be.Util.releaseCanvas(t,n,r),this._cache.delete(Ua)}return this._clearSelfAndDescendantCache(),this._requestDraw(),this}cache(t){var n=t||{},r={};(n.x===void 0||n.y===void 0||n.width===void 0||n.height===void 0)&&(r=this.getClientRect({skipTransform:!0,relativeTo:this.getParent()}));var i=Math.ceil(n.width||r.width),o=Math.ceil(n.height||r.height),s=n.pixelRatio,a=n.x===void 0?Math.floor(r.x):n.x,l=n.y===void 0?Math.floor(r.y):n.y,u=n.offset||0,c=n.drawBorder||!1,d=n.hitCanvasPixelRatio||1;if(!i||!o){Be.Util.error("Can not cache the node. Width or height of the node equals 0. Caching is skipped.");return}i+=u*2+1,o+=u*2+1,a-=u,l-=u;var f=new Fg.SceneCanvas({pixelRatio:s,width:i,height:o}),h=new Fg.SceneCanvas({pixelRatio:s,width:0,height:0,willReadFrequently:!0}),p=new Fg.HitCanvas({pixelRatio:d,width:i,height:o}),m=f.getContext(),S=p.getContext();return p.isCache=!0,f.isCache=!0,this._cache.delete(Ua),this._filterUpToDate=!1,n.imageSmoothingEnabled===!1&&(f.getContext()._context.imageSmoothingEnabled=!1,h.getContext()._context.imageSmoothingEnabled=!1),m.save(),S.save(),m.translate(-a,-l),S.translate(-a,-l),this._isUnderCache=!0,this._clearSelfAndDescendantCache(Om),this._clearSelfAndDescendantCache(H8),this.drawScene(f,this),this.drawHit(p,this),this._isUnderCache=!1,m.restore(),S.restore(),c&&(m.save(),m.beginPath(),m.rect(0,0,i,o),m.closePath(),m.setAttr("strokeStyle","red"),m.setAttr("lineWidth",5),m.stroke(),m.restore()),this._cache.set(Ua,{scene:f,filter:h,hit:p,x:a,y:l}),this._requestDraw(),this}isCached(){return this._cache.has(Ua)}getClientRect(t){throw new Error('abstract "getClientRect" method call')}_transformedRect(t,n){var r=[{x:t.x,y:t.y},{x:t.x+t.width,y:t.y},{x:t.x+t.width,y:t.y+t.height},{x:t.x,y:t.y+t.height}],i,o,s,a,l=this.getAbsoluteTransform(n);return r.forEach(function(u){var c=l.point(u);i===void 0&&(i=s=c.x,o=a=c.y),i=Math.min(i,c.x),o=Math.min(o,c.y),s=Math.max(s,c.x),a=Math.max(a,c.y)}),{x:i,y:o,width:s-i,height:a-o}}_drawCachedSceneCanvas(t){t.save(),t._applyOpacity(this),t._applyGlobalCompositeOperation(this);const n=this._getCanvasCache();t.translate(n.x,n.y);var r=this._getCachedSceneCanvas(),i=r.pixelRatio;t.drawImage(r._canvas,0,0,r.width/i,r.height/i),t.restore()}_drawCachedHitCanvas(t){var n=this._getCanvasCache(),r=n.hit;t.save(),t.translate(n.x,n.y),t.drawImage(r._canvas,0,0,r.width/r.pixelRatio,r.height/r.pixelRatio),t.restore()}_getCachedSceneCanvas(){var t=this.filters(),n=this._getCanvasCache(),r=n.scene,i=n.filter,o=i.getContext(),s,a,l,u;if(t){if(!this._filterUpToDate){var c=r.pixelRatio;i.setSize(r.width/r.pixelRatio,r.height/r.pixelRatio);try{for(s=t.length,o.clear(),o.drawImage(r._canvas,0,0,r.getWidth()/c,r.getHeight()/c),a=o.getImageData(0,0,i.getWidth(),i.getHeight()),l=0;l{var n,r;if(!t)return this;for(n in t)n!==e2e&&(r=K8+Be.Util._capitalize(n),Be.Util._isFunction(this[r])?this[r](t[n]):this._setAttr(n,t[n]))}),this}isListening(){return this._getCache(yx,this._isListening)}_isListening(t){if(!this.listening())return!1;const r=this.getParent();return r&&r!==t&&this!==t?r._isListening(t):!0}isVisible(){return this._getCache(vx,this._isVisible)}_isVisible(t){if(!this.visible())return!1;const r=this.getParent();return r&&r!==t&&this!==t?r._isVisible(t):!0}shouldDrawHit(t,n=!1){if(t)return this._isVisible(t)&&this._isListening(t);var r=this.getLayer(),i=!1;ei.DD._dragElements.forEach(s=>{s.dragStatus==="dragging"&&(s.node.nodeType==="Stage"||s.node.getLayer()===r)&&(i=!0)});var o=!n&&!za.Konva.hitOnDragEnabled&&i;return this.isListening()&&this.isVisible()&&!o}show(){return this.visible(!0),this}hide(){return this.visible(!1),this}getZIndex(){return this.index||0}getAbsoluteZIndex(){var t=this.getDepth(),n=this,r=0,i,o,s,a;function l(u){for(i=[],o=u.length,s=0;s0&&i[0].getDepth()<=t&&l(i)}return n.nodeType!==n2e&&l(n.getStage().getChildren()),r}getDepth(){for(var t=0,n=this.parent;n;)t++,n=n.parent;return t}_batchTransformChanges(t){this._batchingTransformChange=!0,t(),this._batchingTransformChange=!1,this._needClearTransformCache&&(this._clearCache(Ls),this._clearSelfAndDescendantCache(qo)),this._needClearTransformCache=!1}setPosition(t){return this._batchTransformChanges(()=>{this.x(t.x),this.y(t.y)}),this}getPosition(){return{x:this.x(),y:this.y()}}getRelativePointerPosition(){if(!this.getStage())return null;var t=this.getStage().getPointerPosition();if(!t)return null;var n=this.getAbsoluteTransform().copy();return n.invert(),n.point(t)}getAbsolutePosition(t){let n=!1,r=this.parent;for(;r;){if(r.isCached()){n=!0;break}r=r.parent}n&&!t&&(t=!0);var i=this.getAbsoluteTransform(t).getMatrix(),o=new Be.Transform,s=this.offset();return o.m=i.slice(),o.translate(s.x,s.y),o.getTranslation()}setAbsolutePosition(t){var n=this._clearTransform();this.attrs.x=n.x,this.attrs.y=n.y,delete n.x,delete n.y,this._clearCache(Ls);var r=this._getAbsoluteTransform().copy();return r.invert(),r.translate(t.x,t.y),t={x:this.attrs.x+r.getTranslation().x,y:this.attrs.y+r.getTranslation().y},this._setTransform(n),this.setPosition({x:t.x,y:t.y}),this._clearCache(Ls),this._clearSelfAndDescendantCache(qo),this}_setTransform(t){var n;for(n in t)this.attrs[n]=t[n]}_clearTransform(){var t={x:this.x(),y:this.y(),rotation:this.rotation(),scaleX:this.scaleX(),scaleY:this.scaleY(),offsetX:this.offsetX(),offsetY:this.offsetY(),skewX:this.skewX(),skewY:this.skewY()};return this.attrs.x=0,this.attrs.y=0,this.attrs.rotation=0,this.attrs.scaleX=1,this.attrs.scaleY=1,this.attrs.offsetX=0,this.attrs.offsetY=0,this.attrs.skewX=0,this.attrs.skewY=0,t}move(t){var n=t.x,r=t.y,i=this.x(),o=this.y();return n!==void 0&&(i+=n),r!==void 0&&(o+=r),this.setPosition({x:i,y:o}),this}_eachAncestorReverse(t,n){var r=[],i=this.getParent(),o,s;if(!(n&&n._id===this._id)){for(r.unshift(this);i&&(!n||i._id!==n._id);)r.unshift(i),i=i.parent;for(o=r.length,s=0;s0?(this.parent.children.splice(t,1),this.parent.children.splice(t-1,0,this),this.parent._setChildrenIndices(),!0):!1}moveToBottom(){if(!this.parent)return Be.Util.warn("Node has no parent. moveToBottom function is ignored."),!1;var t=this.index;return t>0?(this.parent.children.splice(t,1),this.parent.children.unshift(this),this.parent._setChildrenIndices(),!0):!1}setZIndex(t){if(!this.parent)return Be.Util.warn("Node has no parent. zIndex parameter is ignored."),this;(t<0||t>=this.parent.children.length)&&Be.Util.warn("Unexpected value "+t+" for zIndex property. zIndex is just index of a node in children of its parent. Expected value is from 0 to "+(this.parent.children.length-1)+".");var n=this.index;return this.parent.children.splice(n,1),this.parent.children.splice(t,0,this),this.parent._setChildrenIndices(),this}getAbsoluteOpacity(){return this._getCache(Om,this._getAbsoluteOpacity)}_getAbsoluteOpacity(){var t=this.opacity(),n=this.getParent();return n&&!n._isUnderCache&&(t*=n.getAbsoluteOpacity()),t}moveTo(t){return this.getParent()!==t&&(this._remove(),t.add(this)),this}toObject(){var t={},n=this.getAttrs(),r,i,o,s,a;t.attrs={};for(r in n)i=n[r],a=Be.Util.isObject(i)&&!Be.Util._isPlainObject(i)&&!Be.Util._isArray(i),!a&&(o=typeof this[r]=="function"&&this[r],delete n[r],s=o?o.call(this):null,n[r]=i,s!==i&&(t.attrs[r]=i));return t.className=this.getClassName(),Be.Util._prepareToStringify(t)}toJSON(){return JSON.stringify(this.toObject())}getParent(){return this.parent}findAncestors(t,n,r){var i=[];n&&this._isMatch(t)&&i.push(this);for(var o=this.parent;o;){if(o===r)return i;o._isMatch(t)&&i.push(o),o=o.parent}return i}isAncestorOf(t){return!1}findAncestor(t,n,r){return this.findAncestors(t,n,r)[0]}_isMatch(t){if(!t)return!1;if(typeof t=="function")return t(this);var n=t.replace(/ /g,"").split(","),r=n.length,i,o;for(i=0;i{try{const i=t==null?void 0:t.callback;i&&delete t.callback,Be.Util._urlToImage(this.toDataURL(t),function(o){n(o),i==null||i(o)})}catch(i){r(i)}})}toBlob(t){return new Promise((n,r)=>{try{const i=t==null?void 0:t.callback;i&&delete t.callback,this.toCanvas(t).toBlob(o=>{n(o),i==null||i(o)})}catch(i){r(i)}})}setSize(t){return this.width(t.width),this.height(t.height),this}getSize(){return{width:this.width(),height:this.height()}}getClassName(){return this.className||this.nodeType}getType(){return this.nodeType}getDragDistance(){return this.attrs.dragDistance!==void 0?this.attrs.dragDistance:this.parent?this.parent.getDragDistance():za.Konva.dragDistance}_off(t,n,r){var i=this.eventListeners[t],o,s,a;for(o=0;o=0;if(r&&!this.isDragging()){var i=!1;ei.DD._dragElements.forEach(o=>{this.isAncestorOf(o.node)&&(i=!0)}),i||this._createDragElement(t)}})}_dragChange(){if(this.attrs.draggable)this._listenDrag();else{this._dragCleanup();var t=this.getStage();if(!t)return;const n=ei.DD._dragElements.get(this._id),r=n&&n.dragStatus==="dragging",i=n&&n.dragStatus==="ready";r?this.stopDrag():i&&ei.DD._dragElements.delete(this._id)}}_dragCleanup(){this.off("mousedown.konva"),this.off("touchstart.konva")}isClientRectOnScreen(t={x:0,y:0}){const n=this.getStage();if(!n)return!1;const r={x:-t.x,y:-t.y,width:n.width()+2*t.x,height:n.height()+2*t.y};return Be.Util.haveIntersection(r,this.getClientRect())}static create(t,n){return Be.Util._isString(t)&&(t=JSON.parse(t)),this._createNode(t,n)}static _createNode(t,n){var r=bx.prototype.getClassName.call(t),i=t.children,o,s,a;n&&(t.attrs.container=n),za.Konva[r]||(Be.Util.warn('Can not find a node with class name "'+r+'". Fallback to "Shape".'),r="Shape");const l=za.Konva[r];if(o=new l(t.attrs),i)for(s=i.length,a=0;a0}removeChildren(){return this.getChildren().forEach(t=>{t.parent=null,t.index=0,t.remove()}),this.children=[],this._requestDraw(),this}destroyChildren(){return this.getChildren().forEach(t=>{t.parent=null,t.index=0,t.destroy()}),this.children=[],this._requestDraw(),this}add(...t){if(t.length===0)return this;if(t.length>1){for(var n=0;n0?n[0]:void 0}_generalFind(t,n){var r=[];return this._descendants(i=>{const o=i._isMatch(t);return o&&r.push(i),!!(o&&n)}),r}_descendants(t){let n=!1;const r=this.getChildren();for(const i of r){if(n=t(i),n)return!0;if(i.hasChildren()&&(n=i._descendants(t),n))return!0}return!1}toObject(){var t=k_.Node.prototype.toObject.call(this);return t.children=[],this.getChildren().forEach(n=>{t.children.push(n.toObject())}),t}isAncestorOf(t){for(var n=t.getParent();n;){if(n._id===this._id)return!0;n=n.getParent()}return!1}clone(t){var n=k_.Node.prototype.clone.call(this,t);return this.getChildren().forEach(function(r){n.add(r.clone())}),n}getAllIntersections(t){var n=[];return this.find("Shape").forEach(function(r){r.isVisible()&&r.intersects(t)&&n.push(r)}),n}_clearSelfAndDescendantCache(t){var n;super._clearSelfAndDescendantCache(t),!this.isCached()&&((n=this.children)===null||n===void 0||n.forEach(function(r){r._clearSelfAndDescendantCache(t)}))}_setChildrenIndices(){var t;(t=this.children)===null||t===void 0||t.forEach(function(n,r){n.index=r}),this._requestDraw()}drawScene(t,n){var r=this.getLayer(),i=t||r&&r.getCanvas(),o=i&&i.getContext(),s=this._getCanvasCache(),a=s&&s.scene,l=i&&i.isCache;if(!this.isVisible()&&!l)return this;if(a){o.save();var u=this.getAbsoluteTransform(n).getMatrix();o.transform(u[0],u[1],u[2],u[3],u[4],u[5]),this._drawCachedSceneCanvas(o),o.restore()}else this._drawChildren("drawScene",i,n);return this}drawHit(t,n){if(!this.shouldDrawHit(n))return this;var r=this.getLayer(),i=t||r&&r.hitCanvas,o=i&&i.getContext(),s=this._getCanvasCache(),a=s&&s.hit;if(a){o.save();var l=this.getAbsoluteTransform(n).getMatrix();o.transform(l[0],l[1],l[2],l[3],l[4],l[5]),this._drawCachedHitCanvas(o),o.restore()}else this._drawChildren("drawHit",i,n);return this}_drawChildren(t,n,r){var i,o=n&&n.getContext(),s=this.clipWidth(),a=this.clipHeight(),l=this.clipFunc(),u=s&&a||l;const c=r===this;if(u){o.save();var d=this.getAbsoluteTransform(r),f=d.getMatrix();o.transform(f[0],f[1],f[2],f[3],f[4],f[5]),o.beginPath();let S;if(l)S=l.call(this,o,this);else{var h=this.clipX(),p=this.clipY();o.rect(h,p,s,a)}o.clip.apply(o,S),f=d.copy().invert().getMatrix(),o.transform(f[0],f[1],f[2],f[3],f[4],f[5])}var m=!c&&this.globalCompositeOperation()!=="source-over"&&t==="drawScene";m&&(o.save(),o._applyGlobalCompositeOperation(this)),(i=this.children)===null||i===void 0||i.forEach(function(S){S[t](n,r)}),m&&o.restore(),u&&o.restore()}getClientRect(t){var n;t=t||{};var r=t.skipTransform,i=t.relativeTo,o,s,a,l,u={x:1/0,y:1/0,width:0,height:0},c=this;(n=this.children)===null||n===void 0||n.forEach(function(m){if(m.visible()){var S=m.getClientRect({relativeTo:c,skipShadow:t.skipShadow,skipStroke:t.skipStroke});S.width===0&&S.height===0||(o===void 0?(o=S.x,s=S.y,a=S.x+S.width,l=S.y+S.height):(o=Math.min(o,S.x),s=Math.min(s,S.y),a=Math.max(a,S.x+S.width),l=Math.max(l,S.y+S.height)))}});for(var d=this.find("Shape"),f=!1,h=0;hX.indexOf("pointer")>=0?"pointer":X.indexOf("touch")>=0?"touch":"mouse",z=X=>{const F=V(X);if(F==="pointer")return i.Konva.pointerEventsEnabled&&L.pointer;if(F==="touch")return L.touch;if(F==="mouse")return L.mouse};function U(X={}){return(X.clipFunc||X.clipWidth||X.clipHeight)&&t.Util.warn("Stage does not support clipping. Please use clip for Layers or Groups."),X}const K="Pointer position is missing and not registered by the stage. Looks like it is outside of the stage container. You can set it manually from event: stage.setPointersPositions(event);";e.stages=[];class W extends r.Container{constructor(F){super(U(F)),this._pointerPositions=[],this._changedPointerPositions=[],this._buildDOM(),this._bindContentEvents(),e.stages.push(this),this.on("widthChange.konva heightChange.konva",this._resizeDOM),this.on("visibleChange.konva",this._checkVisibility),this.on("clipWidthChange.konva clipHeightChange.konva clipFuncChange.konva",()=>{U(this.attrs)}),this._checkVisibility()}_validateAdd(F){const q=F.getType()==="Layer",Q=F.getType()==="FastLayer";q||Q||t.Util.throw("You may only add layers to the stage.")}_checkVisibility(){if(!this.content)return;const F=this.visible()?"":"none";this.content.style.display=F}setContainer(F){if(typeof F===c){if(F.charAt(0)==="."){var q=F.slice(1);F=document.getElementsByClassName(q)[0]}else{var Q;F.charAt(0)!=="#"?Q=F:Q=F.slice(1),F=document.getElementById(Q)}if(!F)throw"Can not find container in document with id "+Q}return this._setAttr("container",F),this.content&&(this.content.parentElement&&this.content.parentElement.removeChild(this.content),F.appendChild(this.content)),this}shouldDrawHit(){return!0}clear(){var F=this.children,q=F.length,Q;for(Q=0;Q-1&&e.stages.splice(q,1),t.Util.releaseCanvas(this.bufferCanvas._canvas,this.bufferHitCanvas._canvas),this}getPointerPosition(){const F=this._pointerPositions[0]||this._changedPointerPositions[0];return F?{x:F.x,y:F.y}:(t.Util.warn(K),null)}_getPointerById(F){return this._pointerPositions.find(q=>q.id===F)}getPointersPositions(){return this._pointerPositions}getStage(){return this}getContent(){return this.content}_toKonvaCanvas(F){F=F||{},F.x=F.x||0,F.y=F.y||0,F.width=F.width||this.width(),F.height=F.height||this.height();var q=new o.SceneCanvas({width:F.width,height:F.height,pixelRatio:F.pixelRatio||1}),Q=q.getContext()._context,J=this.children;return(F.x||F.y)&&Q.translate(-1*F.x,-1*F.y),J.forEach(function(ne){if(ne.isVisible()){var Z=ne._toKonvaCanvas(F);Q.drawImage(Z._canvas,F.x,F.y,Z.getWidth()/Z.getPixelRatio(),Z.getHeight()/Z.getPixelRatio())}}),q}getIntersection(F){if(!F)return null;var q=this.children,Q=q.length,J=Q-1,ne;for(ne=J;ne>=0;ne--){const Z=q[ne].getIntersection(F);if(Z)return Z}return null}_resizeDOM(){var F=this.width(),q=this.height();this.content&&(this.content.style.width=F+d,this.content.style.height=q+d),this.bufferCanvas.setSize(F,q),this.bufferHitCanvas.setSize(F,q),this.children.forEach(Q=>{Q.setSize({width:F,height:q}),Q.draw()})}add(F,...q){if(arguments.length>1){for(var Q=0;QR&&t.Util.warn("The stage has "+J+" layers. Recommended maximum number of layers is 3-5. Adding more layers into the stage may drop the performance. Rethink your tree structure, you can use Konva.Group."),F.setSize({width:this.width(),height:this.height()}),F.draw(),i.Konva.isBrowser&&this.content.appendChild(F.canvas._canvas),this}getParent(){return null}getLayer(){return null}hasPointerCapture(F){return l.hasPointerCapture(F,this)}setPointerCapture(F){l.setPointerCapture(F,this)}releaseCapture(F){l.releaseCapture(F,this)}getLayers(){return this.children}_bindContentEvents(){i.Konva.isBrowser&&D.forEach(([F,q])=>{this.content.addEventListener(F,Q=>{this[q](Q)},{passive:!1})})}_pointerenter(F){this.setPointersPositions(F);const q=z(F.type);this._fire(q.pointerenter,{evt:F,target:this,currentTarget:this})}_pointerover(F){this.setPointersPositions(F);const q=z(F.type);this._fire(q.pointerover,{evt:F,target:this,currentTarget:this})}_getTargetShape(F){let q=this[F+"targetShape"];return q&&!q.getStage()&&(q=null),q}_pointerleave(F){const q=z(F.type),Q=V(F.type);if(q){this.setPointersPositions(F);var J=this._getTargetShape(Q),ne=!s.DD.isDragging||i.Konva.hitOnDragEnabled;J&&ne?(J._fireAndBubble(q.pointerout,{evt:F}),J._fireAndBubble(q.pointerleave,{evt:F}),this._fire(q.pointerleave,{evt:F,target:this,currentTarget:this}),this[Q+"targetShape"]=null):ne&&(this._fire(q.pointerleave,{evt:F,target:this,currentTarget:this}),this._fire(q.pointerout,{evt:F,target:this,currentTarget:this})),this.pointerPos=void 0,this._pointerPositions=[]}}_pointerdown(F){const q=z(F.type),Q=V(F.type);if(q){this.setPointersPositions(F);var J=!1;this._changedPointerPositions.forEach(ne=>{var Z=this.getIntersection(ne);if(s.DD.justDragged=!1,i.Konva["_"+Q+"ListenClick"]=!0,!(Z&&Z.isListening()))return;i.Konva.capturePointerEventsEnabled&&Z.setPointerCapture(ne.id),this[Q+"ClickStartShape"]=Z,Z._fireAndBubble(q.pointerdown,{evt:F,pointerId:ne.id}),J=!0;const ae=F.type.indexOf("touch")>=0;Z.preventDefault()&&F.cancelable&&ae&&F.preventDefault()}),J||this._fire(q.pointerdown,{evt:F,target:this,currentTarget:this,pointerId:this._pointerPositions[0].id})}}_pointermove(F){const q=z(F.type),Q=V(F.type);if(!q)return;s.DD.isDragging&&s.DD.node.preventDefault()&&F.cancelable&&F.preventDefault(),this.setPointersPositions(F);var J=!s.DD.isDragging||i.Konva.hitOnDragEnabled;if(!J)return;var ne={};let Z=!1;var me=this._getTargetShape(Q);this._changedPointerPositions.forEach(ae=>{const oe=l.getCapturedShape(ae.id)||this.getIntersection(ae),Ce=ae.id,se={evt:F,pointerId:Ce};var qe=me!==oe;if(qe&&me&&(me._fireAndBubble(q.pointerout,Object.assign({},se),oe),me._fireAndBubble(q.pointerleave,Object.assign({},se),oe)),oe){if(ne[oe._id])return;ne[oe._id]=!0}oe&&oe.isListening()?(Z=!0,qe&&(oe._fireAndBubble(q.pointerover,Object.assign({},se),me),oe._fireAndBubble(q.pointerenter,Object.assign({},se),me),this[Q+"targetShape"]=oe),oe._fireAndBubble(q.pointermove,Object.assign({},se))):me&&(this._fire(q.pointerover,{evt:F,target:this,currentTarget:this,pointerId:Ce}),this[Q+"targetShape"]=null)}),Z||this._fire(q.pointermove,{evt:F,target:this,currentTarget:this,pointerId:this._changedPointerPositions[0].id})}_pointerup(F){const q=z(F.type),Q=V(F.type);if(!q)return;this.setPointersPositions(F);const J=this[Q+"ClickStartShape"],ne=this[Q+"ClickEndShape"];var Z={};let me=!1;this._changedPointerPositions.forEach(ae=>{const oe=l.getCapturedShape(ae.id)||this.getIntersection(ae);if(oe){if(oe.releaseCapture(ae.id),Z[oe._id])return;Z[oe._id]=!0}const Ce=ae.id,se={evt:F,pointerId:Ce};let qe=!1;i.Konva["_"+Q+"InDblClickWindow"]?(qe=!0,clearTimeout(this[Q+"DblTimeout"])):s.DD.justDragged||(i.Konva["_"+Q+"InDblClickWindow"]=!0,clearTimeout(this[Q+"DblTimeout"])),this[Q+"DblTimeout"]=setTimeout(function(){i.Konva["_"+Q+"InDblClickWindow"]=!1},i.Konva.dblClickWindow),oe&&oe.isListening()?(me=!0,this[Q+"ClickEndShape"]=oe,oe._fireAndBubble(q.pointerup,Object.assign({},se)),i.Konva["_"+Q+"ListenClick"]&&J&&J===oe&&(oe._fireAndBubble(q.pointerclick,Object.assign({},se)),qe&&ne&&ne===oe&&oe._fireAndBubble(q.pointerdblclick,Object.assign({},se)))):(this[Q+"ClickEndShape"]=null,i.Konva["_"+Q+"ListenClick"]&&this._fire(q.pointerclick,{evt:F,target:this,currentTarget:this,pointerId:Ce}),qe&&this._fire(q.pointerdblclick,{evt:F,target:this,currentTarget:this,pointerId:Ce}))}),me||this._fire(q.pointerup,{evt:F,target:this,currentTarget:this,pointerId:this._changedPointerPositions[0].id}),i.Konva["_"+Q+"ListenClick"]=!1,F.cancelable&&Q!=="touch"&&F.preventDefault()}_contextmenu(F){this.setPointersPositions(F);var q=this.getIntersection(this.getPointerPosition());q&&q.isListening()?q._fireAndBubble($,{evt:F}):this._fire($,{evt:F,target:this,currentTarget:this})}_wheel(F){this.setPointersPositions(F);var q=this.getIntersection(this.getPointerPosition());q&&q.isListening()?q._fireAndBubble(M,{evt:F}):this._fire(M,{evt:F,target:this,currentTarget:this})}_pointercancel(F){this.setPointersPositions(F);const q=l.getCapturedShape(F.pointerId)||this.getIntersection(this.getPointerPosition());q&&q._fireAndBubble(_,l.createEvent(F)),l.releaseCapture(F.pointerId)}_lostpointercapture(F){l.releaseCapture(F.pointerId)}setPointersPositions(F){var q=this._getContentPosition(),Q=null,J=null;F=F||window.event,F.touches!==void 0?(this._pointerPositions=[],this._changedPointerPositions=[],Array.prototype.forEach.call(F.touches,ne=>{this._pointerPositions.push({id:ne.identifier,x:(ne.clientX-q.left)/q.scaleX,y:(ne.clientY-q.top)/q.scaleY})}),Array.prototype.forEach.call(F.changedTouches||F.touches,ne=>{this._changedPointerPositions.push({id:ne.identifier,x:(ne.clientX-q.left)/q.scaleX,y:(ne.clientY-q.top)/q.scaleY})})):(Q=(F.clientX-q.left)/q.scaleX,J=(F.clientY-q.top)/q.scaleY,this.pointerPos={x:Q,y:J},this._pointerPositions=[{x:Q,y:J,id:t.Util._getFirstPointerId(F)}],this._changedPointerPositions=[{x:Q,y:J,id:t.Util._getFirstPointerId(F)}])}_setPointerPosition(F){t.Util.warn('Method _setPointerPosition is deprecated. Use "stage.setPointersPositions(event)" instead.'),this.setPointersPositions(F)}_getContentPosition(){if(!this.content||!this.content.getBoundingClientRect)return{top:0,left:0,scaleX:1,scaleY:1};var F=this.content.getBoundingClientRect();return{top:F.top,left:F.left,scaleX:F.width/this.content.clientWidth||1,scaleY:F.height/this.content.clientHeight||1}}_buildDOM(){if(this.bufferCanvas=new o.SceneCanvas({width:this.width(),height:this.height()}),this.bufferHitCanvas=new o.HitCanvas({pixelRatio:1,width:this.width(),height:this.height()}),!!i.Konva.isBrowser){var F=this.container();if(!F)throw"Stage has no container. A container is required.";F.innerHTML="",this.content=document.createElement("div"),this.content.style.position="relative",this.content.style.userSelect="none",this.content.className="konvajs-content",this.content.setAttribute("role","presentation"),F.appendChild(this.content),this._resizeDOM()}}cache(){return t.Util.warn("Cache function is not allowed for stage. You may use cache only for layers, groups and shapes."),this}clearCache(){return this}batchDraw(){return this.getChildren().forEach(function(F){F.batchDraw()}),this}}e.Stage=W,W.prototype.nodeType=u,(0,a._registerNode)(W),n.Factory.addGetterSetter(W,"container")})(mB);var Np={},gn={};(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.Shape=e.shapes=void 0;const t=De,n=Bt,r=Re,i=At,o=he,s=De,a=$r;var l="hasShadow",u="shadowRGBA",c="patternImage",d="linearGradient",f="radialGradient";let h;function p(){return h||(h=n.Util.createCanvasElement().getContext("2d"),h)}e.shapes={};function m(k){const P=this.attrs.fillRule;P?k.fill(P):k.fill()}function S(k){k.stroke()}function v(k){k.fill()}function y(k){k.stroke()}function g(){this._clearCache(l)}function b(){this._clearCache(u)}function _(){this._clearCache(c)}function w(){this._clearCache(d)}function x(){this._clearCache(f)}class C extends i.Node{constructor(P){super(P);let A;for(;A=n.Util.getRandomColor(),!(A&&!(A in e.shapes)););this.colorKey=A,e.shapes[A]=this}getContext(){return n.Util.warn("shape.getContext() method is deprecated. Please do not use it."),this.getLayer().getContext()}getCanvas(){return n.Util.warn("shape.getCanvas() method is deprecated. Please do not use it."),this.getLayer().getCanvas()}getSceneFunc(){return this.attrs.sceneFunc||this._sceneFunc}getHitFunc(){return this.attrs.hitFunc||this._hitFunc}hasShadow(){return this._getCache(l,this._hasShadow)}_hasShadow(){return this.shadowEnabled()&&this.shadowOpacity()!==0&&!!(this.shadowColor()||this.shadowBlur()||this.shadowOffsetX()||this.shadowOffsetY())}_getFillPattern(){return this._getCache(c,this.__getFillPattern)}__getFillPattern(){if(this.fillPatternImage()){var P=p();const A=P.createPattern(this.fillPatternImage(),this.fillPatternRepeat()||"repeat");if(A&&A.setTransform){const $=new n.Transform;$.translate(this.fillPatternX(),this.fillPatternY()),$.rotate(t.Konva.getAngle(this.fillPatternRotation())),$.scale(this.fillPatternScaleX(),this.fillPatternScaleY()),$.translate(-1*this.fillPatternOffsetX(),-1*this.fillPatternOffsetY());const N=$.getMatrix(),T=typeof DOMMatrix>"u"?{a:N[0],b:N[1],c:N[2],d:N[3],e:N[4],f:N[5]}:new DOMMatrix(N);A.setTransform(T)}return A}}_getLinearGradient(){return this._getCache(d,this.__getLinearGradient)}__getLinearGradient(){var P=this.fillLinearGradientColorStops();if(P){for(var A=p(),$=this.fillLinearGradientStartPoint(),N=this.fillLinearGradientEndPoint(),T=A.createLinearGradient($.x,$.y,N.x,N.y),O=0;Othis.fillEnabled()&&!!(this.fill()||this.fillPatternImage()||this.fillLinearGradientColorStops()||this.fillRadialGradientColorStops()))}hasStroke(){return this._calculate("hasStroke",["strokeEnabled","strokeWidth","stroke","strokeLinearGradientColorStops"],()=>this.strokeEnabled()&&this.strokeWidth()&&!!(this.stroke()||this.strokeLinearGradientColorStops()))}hasHitStroke(){const P=this.hitStrokeWidth();return P==="auto"?this.hasStroke():this.strokeEnabled()&&!!P}intersects(P){var A=this.getStage(),$=A.bufferHitCanvas,N;return $.getContext().clear(),this.drawHit($,null,!0),N=$.context.getImageData(Math.round(P.x),Math.round(P.y),1,1).data,N[3]>0}destroy(){return i.Node.prototype.destroy.call(this),delete e.shapes[this.colorKey],delete this.colorKey,this}_useBufferCanvas(P){var A;if(!this.getStage()||!((A=this.attrs.perfectDrawEnabled)!==null&&A!==void 0?A:!0))return!1;const N=P||this.hasFill(),T=this.hasStroke(),O=this.getAbsoluteOpacity()!==1;if(N&&T&&O)return!0;const I=this.hasShadow(),M=this.shadowForStrokeEnabled();return!!(N&&T&&I&&M)}setStrokeHitEnabled(P){n.Util.warn("strokeHitEnabled property is deprecated. Please use hitStrokeWidth instead."),P?this.hitStrokeWidth("auto"):this.hitStrokeWidth(0)}getStrokeHitEnabled(){return this.hitStrokeWidth()!==0}getSelfRect(){var P=this.size();return{x:this._centroid?-P.width/2:0,y:this._centroid?-P.height/2:0,width:P.width,height:P.height}}getClientRect(P={}){const A=P.skipTransform,$=P.relativeTo,N=this.getSelfRect(),O=!P.skipStroke&&this.hasStroke()&&this.strokeWidth()||0,I=N.width+O,M=N.height+O,R=!P.skipShadow&&this.hasShadow(),D=R?this.shadowOffsetX():0,L=R?this.shadowOffsetY():0,V=I+Math.abs(D),z=M+Math.abs(L),U=R&&this.shadowBlur()||0,K=V+U*2,W=z+U*2,X={width:K,height:W,x:-(O/2+U)+Math.min(D,0)+N.x,y:-(O/2+U)+Math.min(L,0)+N.y};return A?X:this._transformedRect(X,$)}drawScene(P,A){var $=this.getLayer(),N=P||$.getCanvas(),T=N.getContext(),O=this._getCanvasCache(),I=this.getSceneFunc(),M=this.hasShadow(),R,D,L,V=N.isCache,z=A===this;if(!this.isVisible()&&!z)return this;if(O){T.save();var U=this.getAbsoluteTransform(A).getMatrix();return T.transform(U[0],U[1],U[2],U[3],U[4],U[5]),this._drawCachedSceneCanvas(T),T.restore(),this}if(!I)return this;if(T.save(),this._useBufferCanvas()&&!V){R=this.getStage(),D=R.bufferCanvas,L=D.getContext(),L.clear(),L.save(),L._applyLineJoin(this);var K=this.getAbsoluteTransform(A).getMatrix();L.transform(K[0],K[1],K[2],K[3],K[4],K[5]),I.call(this,L,this),L.restore();var W=D.pixelRatio;M&&T._applyShadow(this),T._applyOpacity(this),T._applyGlobalCompositeOperation(this),T.drawImage(D._canvas,0,0,D.width/W,D.height/W)}else{if(T._applyLineJoin(this),!z){var K=this.getAbsoluteTransform(A).getMatrix();T.transform(K[0],K[1],K[2],K[3],K[4],K[5]),T._applyOpacity(this),T._applyGlobalCompositeOperation(this)}M&&T._applyShadow(this),I.call(this,T,this)}return T.restore(),this}drawHit(P,A,$=!1){if(!this.shouldDrawHit(A,$))return this;var N=this.getLayer(),T=P||N.hitCanvas,O=T&&T.getContext(),I=this.hitFunc()||this.sceneFunc(),M=this._getCanvasCache(),R=M&&M.hit;if(this.colorKey||n.Util.warn("Looks like your canvas has a destroyed shape in it. Do not reuse shape after you destroyed it. If you want to reuse shape you should call remove() instead of destroy()"),R){O.save();var D=this.getAbsoluteTransform(A).getMatrix();return O.transform(D[0],D[1],D[2],D[3],D[4],D[5]),this._drawCachedHitCanvas(O),O.restore(),this}if(!I)return this;if(O.save(),O._applyLineJoin(this),!(this===A)){var V=this.getAbsoluteTransform(A).getMatrix();O.transform(V[0],V[1],V[2],V[3],V[4],V[5])}return I.call(this,O,this),O.restore(),this}drawHitFromCache(P=0){var A=this._getCanvasCache(),$=this._getCachedSceneCanvas(),N=A.hit,T=N.getContext(),O=N.getWidth(),I=N.getHeight(),M,R,D,L,V,z;T.clear(),T.drawImage($._canvas,0,0,O,I);try{for(M=T.getImageData(0,0,O,I),R=M.data,D=R.length,L=n.Util._hexToRgb(this.colorKey),V=0;VP?(R[V]=L.r,R[V+1]=L.g,R[V+2]=L.b,R[V+3]=255):R[V+3]=0;T.putImageData(M,0,0)}catch(U){n.Util.error("Unable to draw hit graph from cached scene canvas. "+U.message)}return this}hasPointerCapture(P){return a.hasPointerCapture(P,this)}setPointerCapture(P){a.setPointerCapture(P,this)}releaseCapture(P){a.releaseCapture(P,this)}}e.Shape=C,C.prototype._fillFunc=m,C.prototype._strokeFunc=S,C.prototype._fillFuncHit=v,C.prototype._strokeFuncHit=y,C.prototype._centroid=!1,C.prototype.nodeType="Shape",(0,s._registerNode)(C),C.prototype.eventListeners={},C.prototype.on.call(C.prototype,"shadowColorChange.konva shadowBlurChange.konva shadowOffsetChange.konva shadowOpacityChange.konva shadowEnabledChange.konva",g),C.prototype.on.call(C.prototype,"shadowColorChange.konva shadowOpacityChange.konva shadowEnabledChange.konva",b),C.prototype.on.call(C.prototype,"fillPriorityChange.konva fillPatternImageChange.konva fillPatternRepeatChange.konva fillPatternScaleXChange.konva fillPatternScaleYChange.konva fillPatternOffsetXChange.konva fillPatternOffsetYChange.konva fillPatternXChange.konva fillPatternYChange.konva fillPatternRotationChange.konva",_),C.prototype.on.call(C.prototype,"fillPriorityChange.konva fillLinearGradientColorStopsChange.konva fillLinearGradientStartPointXChange.konva fillLinearGradientStartPointYChange.konva fillLinearGradientEndPointXChange.konva fillLinearGradientEndPointYChange.konva",w),C.prototype.on.call(C.prototype,"fillPriorityChange.konva fillRadialGradientColorStopsChange.konva fillRadialGradientStartPointXChange.konva fillRadialGradientStartPointYChange.konva fillRadialGradientEndPointXChange.konva fillRadialGradientEndPointYChange.konva fillRadialGradientStartRadiusChange.konva fillRadialGradientEndRadiusChange.konva",x),r.Factory.addGetterSetter(C,"stroke",void 0,(0,o.getStringOrGradientValidator)()),r.Factory.addGetterSetter(C,"strokeWidth",2,(0,o.getNumberValidator)()),r.Factory.addGetterSetter(C,"fillAfterStrokeEnabled",!1),r.Factory.addGetterSetter(C,"hitStrokeWidth","auto",(0,o.getNumberOrAutoValidator)()),r.Factory.addGetterSetter(C,"strokeHitEnabled",!0,(0,o.getBooleanValidator)()),r.Factory.addGetterSetter(C,"perfectDrawEnabled",!0,(0,o.getBooleanValidator)()),r.Factory.addGetterSetter(C,"shadowForStrokeEnabled",!0,(0,o.getBooleanValidator)()),r.Factory.addGetterSetter(C,"lineJoin"),r.Factory.addGetterSetter(C,"lineCap"),r.Factory.addGetterSetter(C,"sceneFunc"),r.Factory.addGetterSetter(C,"hitFunc"),r.Factory.addGetterSetter(C,"dash"),r.Factory.addGetterSetter(C,"dashOffset",0,(0,o.getNumberValidator)()),r.Factory.addGetterSetter(C,"shadowColor",void 0,(0,o.getStringValidator)()),r.Factory.addGetterSetter(C,"shadowBlur",0,(0,o.getNumberValidator)()),r.Factory.addGetterSetter(C,"shadowOpacity",1,(0,o.getNumberValidator)()),r.Factory.addComponentsGetterSetter(C,"shadowOffset",["x","y"]),r.Factory.addGetterSetter(C,"shadowOffsetX",0,(0,o.getNumberValidator)()),r.Factory.addGetterSetter(C,"shadowOffsetY",0,(0,o.getNumberValidator)()),r.Factory.addGetterSetter(C,"fillPatternImage"),r.Factory.addGetterSetter(C,"fill",void 0,(0,o.getStringOrGradientValidator)()),r.Factory.addGetterSetter(C,"fillPatternX",0,(0,o.getNumberValidator)()),r.Factory.addGetterSetter(C,"fillPatternY",0,(0,o.getNumberValidator)()),r.Factory.addGetterSetter(C,"fillLinearGradientColorStops"),r.Factory.addGetterSetter(C,"strokeLinearGradientColorStops"),r.Factory.addGetterSetter(C,"fillRadialGradientStartRadius",0),r.Factory.addGetterSetter(C,"fillRadialGradientEndRadius",0),r.Factory.addGetterSetter(C,"fillRadialGradientColorStops"),r.Factory.addGetterSetter(C,"fillPatternRepeat","repeat"),r.Factory.addGetterSetter(C,"fillEnabled",!0),r.Factory.addGetterSetter(C,"strokeEnabled",!0),r.Factory.addGetterSetter(C,"shadowEnabled",!0),r.Factory.addGetterSetter(C,"dashEnabled",!0),r.Factory.addGetterSetter(C,"strokeScaleEnabled",!0),r.Factory.addGetterSetter(C,"fillPriority","color"),r.Factory.addComponentsGetterSetter(C,"fillPatternOffset",["x","y"]),r.Factory.addGetterSetter(C,"fillPatternOffsetX",0,(0,o.getNumberValidator)()),r.Factory.addGetterSetter(C,"fillPatternOffsetY",0,(0,o.getNumberValidator)()),r.Factory.addComponentsGetterSetter(C,"fillPatternScale",["x","y"]),r.Factory.addGetterSetter(C,"fillPatternScaleX",1,(0,o.getNumberValidator)()),r.Factory.addGetterSetter(C,"fillPatternScaleY",1,(0,o.getNumberValidator)()),r.Factory.addComponentsGetterSetter(C,"fillLinearGradientStartPoint",["x","y"]),r.Factory.addComponentsGetterSetter(C,"strokeLinearGradientStartPoint",["x","y"]),r.Factory.addGetterSetter(C,"fillLinearGradientStartPointX",0),r.Factory.addGetterSetter(C,"strokeLinearGradientStartPointX",0),r.Factory.addGetterSetter(C,"fillLinearGradientStartPointY",0),r.Factory.addGetterSetter(C,"strokeLinearGradientStartPointY",0),r.Factory.addComponentsGetterSetter(C,"fillLinearGradientEndPoint",["x","y"]),r.Factory.addComponentsGetterSetter(C,"strokeLinearGradientEndPoint",["x","y"]),r.Factory.addGetterSetter(C,"fillLinearGradientEndPointX",0),r.Factory.addGetterSetter(C,"strokeLinearGradientEndPointX",0),r.Factory.addGetterSetter(C,"fillLinearGradientEndPointY",0),r.Factory.addGetterSetter(C,"strokeLinearGradientEndPointY",0),r.Factory.addComponentsGetterSetter(C,"fillRadialGradientStartPoint",["x","y"]),r.Factory.addGetterSetter(C,"fillRadialGradientStartPointX",0),r.Factory.addGetterSetter(C,"fillRadialGradientStartPointY",0),r.Factory.addComponentsGetterSetter(C,"fillRadialGradientEndPoint",["x","y"]),r.Factory.addGetterSetter(C,"fillRadialGradientEndPointX",0),r.Factory.addGetterSetter(C,"fillRadialGradientEndPointY",0),r.Factory.addGetterSetter(C,"fillPatternRotation",0),r.Factory.addGetterSetter(C,"fillRule",void 0,(0,o.getStringValidator)()),r.Factory.backCompat(C,{dashArray:"dash",getDashArray:"getDash",setDashArray:"getDash",drawFunc:"sceneFunc",getDrawFunc:"getSceneFunc",setDrawFunc:"setSceneFunc",drawHitFunc:"hitFunc",getDrawHitFunc:"getHitFunc",setDrawHitFunc:"setHitFunc"})})(gn);Object.defineProperty(Np,"__esModule",{value:!0});Np.Layer=void 0;const Uo=Bt,A_=Gl,pu=At,H3=Re,Q8=$i,u2e=he,c2e=gn,d2e=De;var f2e="#",h2e="beforeDraw",p2e="draw",bB=[{x:0,y:0},{x:-1,y:-1},{x:1,y:-1},{x:1,y:1},{x:-1,y:1}],g2e=bB.length;class td extends A_.Container{constructor(t){super(t),this.canvas=new Q8.SceneCanvas,this.hitCanvas=new Q8.HitCanvas({pixelRatio:1}),this._waitingForDraw=!1,this.on("visibleChange.konva",this._checkVisibility),this._checkVisibility(),this.on("imageSmoothingEnabledChange.konva",this._setSmoothEnabled),this._setSmoothEnabled()}createPNGStream(){return this.canvas._canvas.createPNGStream()}getCanvas(){return this.canvas}getNativeCanvasElement(){return this.canvas._canvas}getHitCanvas(){return this.hitCanvas}getContext(){return this.getCanvas().getContext()}clear(t){return this.getContext().clear(t),this.getHitCanvas().getContext().clear(t),this}setZIndex(t){super.setZIndex(t);var n=this.getStage();return n&&n.content&&(n.content.removeChild(this.getNativeCanvasElement()),t{this.draw(),this._waitingForDraw=!1})),this}getIntersection(t){if(!this.isListening()||!this.isVisible())return null;for(var n=1,r=!1;;){for(let i=0;i0)return{antialiased:!0};return{}}drawScene(t,n){var r=this.getLayer(),i=t||r&&r.getCanvas();return this._fire(h2e,{node:this}),this.clearBeforeDraw()&&i.getContext().clear(),A_.Container.prototype.drawScene.call(this,i,n),this._fire(p2e,{node:this}),this}drawHit(t,n){var r=this.getLayer(),i=t||r&&r.hitCanvas;return r&&r.clearBeforeDraw()&&r.getHitCanvas().getContext().clear(),A_.Container.prototype.drawHit.call(this,i,n),this}enableHitGraph(){return this.hitGraphEnabled(!0),this}disableHitGraph(){return this.hitGraphEnabled(!1),this}setHitGraphEnabled(t){Uo.Util.warn("hitGraphEnabled method is deprecated. Please use layer.listening() instead."),this.listening(t)}getHitGraphEnabled(t){return Uo.Util.warn("hitGraphEnabled method is deprecated. Please use layer.listening() instead."),this.listening()}toggleHitCanvas(){if(!(!this.parent||!this.parent.content)){var t=this.parent,n=!!this.hitCanvas._canvas.parentNode;n?t.content.removeChild(this.hitCanvas._canvas):t.content.appendChild(this.hitCanvas._canvas)}}destroy(){return Uo.Util.releaseCanvas(this.getNativeCanvasElement(),this.getHitCanvas()._canvas),super.destroy()}}Np.Layer=td;td.prototype.nodeType="Layer";(0,d2e._registerNode)(td);H3.Factory.addGetterSetter(td,"imageSmoothingEnabled",!0);H3.Factory.addGetterSetter(td,"clearBeforeDraw",!0);H3.Factory.addGetterSetter(td,"hitGraphEnabled",!0,(0,u2e.getBooleanValidator)());var D1={};Object.defineProperty(D1,"__esModule",{value:!0});D1.FastLayer=void 0;const m2e=Bt,y2e=Np,v2e=De;class q3 extends y2e.Layer{constructor(t){super(t),this.listening(!1),m2e.Util.warn('Konva.Fast layer is deprecated. Please use "new Konva.Layer({ listening: false })" instead.')}}D1.FastLayer=q3;q3.prototype.nodeType="FastLayer";(0,v2e._registerNode)(q3);var nd={};Object.defineProperty(nd,"__esModule",{value:!0});nd.Group=void 0;const b2e=Bt,S2e=Gl,_2e=De;class W3 extends S2e.Container{_validateAdd(t){var n=t.getType();n!=="Group"&&n!=="Shape"&&b2e.Util.throw("You may only add groups and shapes to groups.")}}nd.Group=W3;W3.prototype.nodeType="Group";(0,_2e._registerNode)(W3);var rd={};Object.defineProperty(rd,"__esModule",{value:!0});rd.Animation=void 0;const O_=De,Z8=Bt;var R_=function(){return O_.glob.performance&&O_.glob.performance.now?function(){return O_.glob.performance.now()}:function(){return new Date().getTime()}}();class ao{constructor(t,n){this.id=ao.animIdCounter++,this.frame={time:0,timeDiff:0,lastTime:R_(),frameRate:0},this.func=t,this.setLayers(n)}setLayers(t){var n=[];return t?t.length>0?n=t:n=[t]:n=[],this.layers=n,this}getLayers(){return this.layers}addLayer(t){var n=this.layers,r=n.length,i;for(i=0;ithis.duration?this.yoyo?(this._time=this.duration,this.reverse()):this.finish():p<0?this.yoyo?(this._time=0,this.play()):this.reset():(this._time=p,this.update())}getTime(){return this._time}setPosition(p){this.prevPos=this._pos,this.propFunc(p),this._pos=p}getPosition(p){return p===void 0&&(p=this._time),this.func(p,this.begin,this._change,this.duration)}play(){this.state=a,this._startTime=this.getTimer()-this._time,this.onEnterFrame(),this.fire("onPlay")}reverse(){this.state=l,this._time=this.duration-this._time,this._startTime=this.getTimer()-this._time,this.onEnterFrame(),this.fire("onReverse")}seek(p){this.pause(),this._time=p,this.update(),this.fire("onSeek")}reset(){this.pause(),this._time=0,this.update(),this.fire("onReset")}finish(){this.pause(),this._time=this.duration,this.update(),this.fire("onFinish")}update(){this.setPosition(this.getPosition(this._time)),this.fire("onUpdate")}onEnterFrame(){var p=this.getTimer()-this._startTime;this.state===a?this.setTime(p):this.state===l&&this.setTime(this.duration-p)}pause(){this.state=s,this.fire("onPause")}getTimer(){return new Date().getTime()}}class f{constructor(p){var m=this,S=p.node,v=S._id,y,g=p.easing||e.Easings.Linear,b=!!p.yoyo,_;typeof p.duration>"u"?y=.3:p.duration===0?y=.001:y=p.duration,this.node=S,this._id=u++;var w=S.getLayer()||(S instanceof i.Konva.Stage?S.getLayers():null);w||t.Util.error("Tween constructor have `node` that is not in a layer. Please add node into layer first."),this.anim=new n.Animation(function(){m.tween.onEnterFrame()},w),this.tween=new d(_,function(x){m._tweenFunc(x)},g,0,1,y*1e3,b),this._addListeners(),f.attrs[v]||(f.attrs[v]={}),f.attrs[v][this._id]||(f.attrs[v][this._id]={}),f.tweens[v]||(f.tweens[v]={});for(_ in p)o[_]===void 0&&this._addAttr(_,p[_]);this.reset(),this.onFinish=p.onFinish,this.onReset=p.onReset,this.onUpdate=p.onUpdate}_addAttr(p,m){var S=this.node,v=S._id,y,g,b,_,w,x,C,k;if(b=f.tweens[v][p],b&&delete f.attrs[v][b][p],y=S.getAttr(p),t.Util._isArray(m))if(g=[],w=Math.max(m.length,y.length),p==="points"&&m.length!==y.length&&(m.length>y.length?(C=y,y=t.Util._prepareArrayForTween(y,m,S.closed())):(x=m,m=t.Util._prepareArrayForTween(m,y,S.closed()))),p.indexOf("fill")===0)for(_=0;_{this.anim.start()},this.tween.onReverse=()=>{this.anim.start()},this.tween.onPause=()=>{this.anim.stop()},this.tween.onFinish=()=>{var p=this.node,m=f.attrs[p._id][this._id];m.points&&m.points.trueEnd&&p.setAttr("points",m.points.trueEnd),this.onFinish&&this.onFinish.call(this)},this.tween.onReset=()=>{var p=this.node,m=f.attrs[p._id][this._id];m.points&&m.points.trueStart&&p.points(m.points.trueStart),this.onReset&&this.onReset()},this.tween.onUpdate=()=>{this.onUpdate&&this.onUpdate.call(this)}}play(){return this.tween.play(),this}reverse(){return this.tween.reverse(),this}reset(){return this.tween.reset(),this}seek(p){return this.tween.seek(p*1e3),this}pause(){return this.tween.pause(),this}finish(){return this.tween.finish(),this}destroy(){var p=this.node._id,m=this._id,S=f.tweens[p],v;this.pause();for(v in S)delete f.tweens[p][v];delete f.attrs[p][m]}}e.Tween=f,f.attrs={},f.tweens={},r.Node.prototype.to=function(h){var p=h.onFinish;h.node=this,h.onFinish=function(){this.destroy(),p&&p()};var m=new f(h);m.play()},e.Easings={BackEaseIn(h,p,m,S){var v=1.70158;return m*(h/=S)*h*((v+1)*h-v)+p},BackEaseOut(h,p,m,S){var v=1.70158;return m*((h=h/S-1)*h*((v+1)*h+v)+1)+p},BackEaseInOut(h,p,m,S){var v=1.70158;return(h/=S/2)<1?m/2*(h*h*(((v*=1.525)+1)*h-v))+p:m/2*((h-=2)*h*(((v*=1.525)+1)*h+v)+2)+p},ElasticEaseIn(h,p,m,S,v,y){var g=0;return h===0?p:(h/=S)===1?p+m:(y||(y=S*.3),!v||v0?t:n),c=s*n,d=a*(a>0?t:n),f=l*(l>0?n:t);return{x:u,y:r?-1*f:d,width:c-u,height:f-d}}}L1.Arc=Cs;Cs.prototype._centroid=!0;Cs.prototype.className="Arc";Cs.prototype._attrsAffectingSize=["innerRadius","outerRadius"];(0,x2e._registerNode)(Cs);$1.Factory.addGetterSetter(Cs,"innerRadius",0,(0,F1.getNumberValidator)());$1.Factory.addGetterSetter(Cs,"outerRadius",0,(0,F1.getNumberValidator)());$1.Factory.addGetterSetter(Cs,"angle",0,(0,F1.getNumberValidator)());$1.Factory.addGetterSetter(Cs,"clockwise",!1,(0,F1.getBooleanValidator)());var B1={},Dp={};Object.defineProperty(Dp,"__esModule",{value:!0});Dp.Line=void 0;const j1=Re,C2e=gn,_B=he,T2e=De;function Sx(e,t,n,r,i,o,s){var a=Math.sqrt(Math.pow(n-e,2)+Math.pow(r-t,2)),l=Math.sqrt(Math.pow(i-n,2)+Math.pow(o-r,2)),u=s*a/(a+l),c=s*l/(a+l),d=n-u*(i-e),f=r-u*(o-t),h=n+c*(i-e),p=r+c*(o-t);return[d,f,h,p]}function eA(e,t){var n=e.length,r=[],i,o;for(i=2;i4){for(a=this.getTensionPoints(),l=a.length,u=o?0:4,o||t.quadraticCurveTo(a[0],a[1],a[2],a[3]);u{let u,c,d;u=l/2,c=0;for(let h=0;h<20;h++)d=u*e.tValues[20][h]+u,c+=e.cValues[20][h]*r(s,a,d);return u*c};e.getCubicArcLength=t;const n=(s,a,l)=>{l===void 0&&(l=1);const u=s[0]-2*s[1]+s[2],c=a[0]-2*a[1]+a[2],d=2*s[1]-2*s[0],f=2*a[1]-2*a[0],h=4*(u*u+c*c),p=4*(u*d+c*f),m=d*d+f*f;if(h===0)return l*Math.sqrt(Math.pow(s[2]-s[0],2)+Math.pow(a[2]-a[0],2));const S=p/(2*h),v=m/h,y=l+S,g=v-S*S,b=y*y+g>0?Math.sqrt(y*y+g):0,_=S*S+g>0?Math.sqrt(S*S+g):0,w=S+Math.sqrt(S*S+g)!==0?g*Math.log(Math.abs((y+b)/(S+_))):0;return Math.sqrt(h)/2*(y*b-S*_+w)};e.getQuadraticArcLength=n;function r(s,a,l){const u=i(1,l,s),c=i(1,l,a),d=u*u+c*c;return Math.sqrt(d)}const i=(s,a,l)=>{const u=l.length-1;let c,d;if(u===0)return 0;if(s===0){d=0;for(let f=0;f<=u;f++)d+=e.binomialCoefficients[u][f]*Math.pow(1-a,u-f)*Math.pow(a,f)*l[f];return d}else{c=new Array(u);for(let f=0;f{let u=1,c=s/a,d=(s-l(c))/a,f=0;for(;u>.001;){const h=l(c+d),p=Math.abs(s-h)/a;if(p500)break}return c};e.t2length=o})(wB);Object.defineProperty(id,"__esModule",{value:!0});id.Path=void 0;const E2e=Re,P2e=gn,k2e=De,gu=wB;class ln extends P2e.Shape{constructor(t){super(t),this.dataArray=[],this.pathLength=0,this._readDataAttribute(),this.on("dataChange.konva",function(){this._readDataAttribute()})}_readDataAttribute(){this.dataArray=ln.parsePathData(this.data()),this.pathLength=ln.getPathLength(this.dataArray)}_sceneFunc(t){var n=this.dataArray;t.beginPath();for(var r=!1,i=0;ic?u:c,S=u>c?1:u/c,v=u>c?c/u:1;t.translate(a,l),t.rotate(h),t.scale(S,v),t.arc(0,0,m,d,d+f,1-p),t.scale(1/S,1/v),t.rotate(-h),t.translate(-a,-l);break;case"z":r=!0,t.closePath();break}}!r&&!this.hasFill()?t.strokeShape(this):t.fillStrokeShape(this)}getSelfRect(){var t=[];this.dataArray.forEach(function(u){if(u.command==="A"){var c=u.points[4],d=u.points[5],f=u.points[4]+d,h=Math.PI/180;if(Math.abs(c-f)f;p-=h){const m=ln.getPointOnEllipticalArc(u.points[0],u.points[1],u.points[2],u.points[3],p,0);t.push(m.x,m.y)}else for(let p=c+h;pn[i].pathLength;)t-=n[i].pathLength,++i;if(i===o)return r=n[i-1].points.slice(-2),{x:r[0],y:r[1]};if(t<.01)return r=n[i].points.slice(0,2),{x:r[0],y:r[1]};var s=n[i],a=s.points;switch(s.command){case"L":return ln.getPointOnLine(t,s.start.x,s.start.y,a[0],a[1]);case"C":return ln.getPointOnCubicBezier((0,gu.t2length)(t,ln.getPathLength(n),m=>(0,gu.getCubicArcLength)([s.start.x,a[0],a[2],a[4]],[s.start.y,a[1],a[3],a[5]],m)),s.start.x,s.start.y,a[0],a[1],a[2],a[3],a[4],a[5]);case"Q":return ln.getPointOnQuadraticBezier((0,gu.t2length)(t,ln.getPathLength(n),m=>(0,gu.getQuadraticArcLength)([s.start.x,a[0],a[2]],[s.start.y,a[1],a[3]],m)),s.start.x,s.start.y,a[0],a[1],a[2],a[3]);case"A":var l=a[0],u=a[1],c=a[2],d=a[3],f=a[4],h=a[5],p=a[6];return f+=h*t/s.pathLength,ln.getPointOnEllipticalArc(l,u,c,d,f,p)}return null}static getPointOnLine(t,n,r,i,o,s,a){s===void 0&&(s=n),a===void 0&&(a=r);var l=(o-r)/(i-n+1e-8),u=Math.sqrt(t*t/(1+l*l));i0&&!isNaN(p[0]);){var y=null,g=[],b=l,_=u,w,x,C,k,P,A,$,N,T,O;switch(h){case"l":l+=p.shift(),u+=p.shift(),y="L",g.push(l,u);break;case"L":l=p.shift(),u=p.shift(),g.push(l,u);break;case"m":var I=p.shift(),M=p.shift();if(l+=I,u+=M,y="M",s.length>2&&s[s.length-1].command==="z"){for(var R=s.length-2;R>=0;R--)if(s[R].command==="M"){l=s[R].points[0]+I,u=s[R].points[1]+M;break}}g.push(l,u),h="l";break;case"M":l=p.shift(),u=p.shift(),y="M",g.push(l,u),h="L";break;case"h":l+=p.shift(),y="L",g.push(l,u);break;case"H":l=p.shift(),y="L",g.push(l,u);break;case"v":u+=p.shift(),y="L",g.push(l,u);break;case"V":u=p.shift(),y="L",g.push(l,u);break;case"C":g.push(p.shift(),p.shift(),p.shift(),p.shift()),l=p.shift(),u=p.shift(),g.push(l,u);break;case"c":g.push(l+p.shift(),u+p.shift(),l+p.shift(),u+p.shift()),l+=p.shift(),u+=p.shift(),y="C",g.push(l,u);break;case"S":x=l,C=u,w=s[s.length-1],w.command==="C"&&(x=l+(l-w.points[2]),C=u+(u-w.points[3])),g.push(x,C,p.shift(),p.shift()),l=p.shift(),u=p.shift(),y="C",g.push(l,u);break;case"s":x=l,C=u,w=s[s.length-1],w.command==="C"&&(x=l+(l-w.points[2]),C=u+(u-w.points[3])),g.push(x,C,l+p.shift(),u+p.shift()),l+=p.shift(),u+=p.shift(),y="C",g.push(l,u);break;case"Q":g.push(p.shift(),p.shift()),l=p.shift(),u=p.shift(),g.push(l,u);break;case"q":g.push(l+p.shift(),u+p.shift()),l+=p.shift(),u+=p.shift(),y="Q",g.push(l,u);break;case"T":x=l,C=u,w=s[s.length-1],w.command==="Q"&&(x=l+(l-w.points[0]),C=u+(u-w.points[1])),l=p.shift(),u=p.shift(),y="Q",g.push(x,C,l,u);break;case"t":x=l,C=u,w=s[s.length-1],w.command==="Q"&&(x=l+(l-w.points[0]),C=u+(u-w.points[1])),l+=p.shift(),u+=p.shift(),y="Q",g.push(x,C,l,u);break;case"A":k=p.shift(),P=p.shift(),A=p.shift(),$=p.shift(),N=p.shift(),T=l,O=u,l=p.shift(),u=p.shift(),y="A",g=this.convertEndpointToCenterParameterization(T,O,l,u,$,N,k,P,A);break;case"a":k=p.shift(),P=p.shift(),A=p.shift(),$=p.shift(),N=p.shift(),T=l,O=u,l+=p.shift(),u+=p.shift(),y="A",g=this.convertEndpointToCenterParameterization(T,O,l,u,$,N,k,P,A);break}s.push({command:y||h,points:g,start:{x:b,y:_},pathLength:this.calcLength(b,_,y||h,g)})}(h==="z"||h==="Z")&&s.push({command:"z",points:[],start:void 0,pathLength:0})}return s}static calcLength(t,n,r,i){var o,s,a,l,u=ln;switch(r){case"L":return u.getLineLength(t,n,i[0],i[1]);case"C":return(0,gu.getCubicArcLength)([t,i[0],i[2],i[4]],[n,i[1],i[3],i[5]],1);case"Q":return(0,gu.getQuadraticArcLength)([t,i[0],i[2]],[n,i[1],i[3]],1);case"A":o=0;var c=i[4],d=i[5],f=i[4]+d,h=Math.PI/180;if(Math.abs(c-f)f;l-=h)a=u.getPointOnEllipticalArc(i[0],i[1],i[2],i[3],l,0),o+=u.getLineLength(s.x,s.y,a.x,a.y),s=a;else for(l=c+h;l1&&(a*=Math.sqrt(h),l*=Math.sqrt(h));var p=Math.sqrt((a*a*(l*l)-a*a*(f*f)-l*l*(d*d))/(a*a*(f*f)+l*l*(d*d)));o===s&&(p*=-1),isNaN(p)&&(p=0);var m=p*a*f/l,S=p*-l*d/a,v=(t+r)/2+Math.cos(c)*m-Math.sin(c)*S,y=(n+i)/2+Math.sin(c)*m+Math.cos(c)*S,g=function(P){return Math.sqrt(P[0]*P[0]+P[1]*P[1])},b=function(P,A){return(P[0]*A[0]+P[1]*A[1])/(g(P)*g(A))},_=function(P,A){return(P[0]*A[1]=1&&(k=0),s===0&&k>0&&(k=k-2*Math.PI),s===1&&k<0&&(k=k+2*Math.PI),[v,y,a,l,w,k,c,s]}}id.Path=ln;ln.prototype.className="Path";ln.prototype._attrsAffectingSize=["data"];(0,k2e._registerNode)(ln);E2e.Factory.addGetterSetter(ln,"data");Object.defineProperty(B1,"__esModule",{value:!0});B1.Arrow=void 0;const V1=Re,A2e=Dp,xB=he,O2e=De,tA=id;class ql extends A2e.Line{_sceneFunc(t){super._sceneFunc(t);var n=Math.PI*2,r=this.points(),i=r,o=this.tension()!==0&&r.length>4;o&&(i=this.getTensionPoints());var s=this.pointerLength(),a=r.length,l,u;if(o){const f=[i[i.length-4],i[i.length-3],i[i.length-2],i[i.length-1],r[a-2],r[a-1]],h=tA.Path.calcLength(i[i.length-4],i[i.length-3],"C",f),p=tA.Path.getPointOnQuadraticBezier(Math.min(1,1-s/h),f[0],f[1],f[2],f[3],f[4],f[5]);l=r[a-2]-p.x,u=r[a-1]-p.y}else l=r[a-2]-r[a-4],u=r[a-1]-r[a-3];var c=(Math.atan2(u,l)+n)%n,d=this.pointerWidth();this.pointerAtEnding()&&(t.save(),t.beginPath(),t.translate(r[a-2],r[a-1]),t.rotate(c),t.moveTo(0,0),t.lineTo(-s,d/2),t.lineTo(-s,-d/2),t.closePath(),t.restore(),this.__fillStroke(t)),this.pointerAtBeginning()&&(t.save(),t.beginPath(),t.translate(r[0],r[1]),o?(l=(i[0]+i[2])/2-r[0],u=(i[1]+i[3])/2-r[1]):(l=r[2]-r[0],u=r[3]-r[1]),t.rotate((Math.atan2(-u,-l)+n)%n),t.moveTo(0,0),t.lineTo(-s,d/2),t.lineTo(-s,-d/2),t.closePath(),t.restore(),this.__fillStroke(t))}__fillStroke(t){var n=this.dashEnabled();n&&(this.attrs.dashEnabled=!1,t.setLineDash([])),t.fillStrokeShape(this),n&&(this.attrs.dashEnabled=!0)}getSelfRect(){const t=super.getSelfRect(),n=this.pointerWidth()/2;return{x:t.x-n,y:t.y-n,width:t.width+n*2,height:t.height+n*2}}}B1.Arrow=ql;ql.prototype.className="Arrow";(0,O2e._registerNode)(ql);V1.Factory.addGetterSetter(ql,"pointerLength",10,(0,xB.getNumberValidator)());V1.Factory.addGetterSetter(ql,"pointerWidth",10,(0,xB.getNumberValidator)());V1.Factory.addGetterSetter(ql,"pointerAtBeginning",!1);V1.Factory.addGetterSetter(ql,"pointerAtEnding",!0);var z1={};Object.defineProperty(z1,"__esModule",{value:!0});z1.Circle=void 0;const R2e=Re,I2e=gn,M2e=he,N2e=De;class od extends I2e.Shape{_sceneFunc(t){t.beginPath(),t.arc(0,0,this.attrs.radius||0,0,Math.PI*2,!1),t.closePath(),t.fillStrokeShape(this)}getWidth(){return this.radius()*2}getHeight(){return this.radius()*2}setWidth(t){this.radius()!==t/2&&this.radius(t/2)}setHeight(t){this.radius()!==t/2&&this.radius(t/2)}}z1.Circle=od;od.prototype._centroid=!0;od.prototype.className="Circle";od.prototype._attrsAffectingSize=["radius"];(0,N2e._registerNode)(od);R2e.Factory.addGetterSetter(od,"radius",0,(0,M2e.getNumberValidator)());var U1={};Object.defineProperty(U1,"__esModule",{value:!0});U1.Ellipse=void 0;const K3=Re,D2e=gn,CB=he,L2e=De;class Na extends D2e.Shape{_sceneFunc(t){var n=this.radiusX(),r=this.radiusY();t.beginPath(),t.save(),n!==r&&t.scale(1,r/n),t.arc(0,0,n,0,Math.PI*2,!1),t.restore(),t.closePath(),t.fillStrokeShape(this)}getWidth(){return this.radiusX()*2}getHeight(){return this.radiusY()*2}setWidth(t){this.radiusX(t/2)}setHeight(t){this.radiusY(t/2)}}U1.Ellipse=Na;Na.prototype.className="Ellipse";Na.prototype._centroid=!0;Na.prototype._attrsAffectingSize=["radiusX","radiusY"];(0,L2e._registerNode)(Na);K3.Factory.addComponentsGetterSetter(Na,"radius",["x","y"]);K3.Factory.addGetterSetter(Na,"radiusX",0,(0,CB.getNumberValidator)());K3.Factory.addGetterSetter(Na,"radiusY",0,(0,CB.getNumberValidator)());var G1={};Object.defineProperty(G1,"__esModule",{value:!0});G1.Image=void 0;const I_=Bt,Wl=Re,$2e=gn,F2e=De,Lp=he;let No=class TB extends $2e.Shape{constructor(t){super(t),this.on("imageChange.konva",()=>{this._setImageLoad()}),this._setImageLoad()}_setImageLoad(){const t=this.image();t&&t.complete||t&&t.readyState===4||t&&t.addEventListener&&t.addEventListener("load",()=>{this._requestDraw()})}_useBufferCanvas(){return super._useBufferCanvas(!0)}_sceneFunc(t){const n=this.getWidth(),r=this.getHeight(),i=this.cornerRadius(),o=this.attrs.image;let s;if(o){const a=this.attrs.cropWidth,l=this.attrs.cropHeight;a&&l?s=[o,this.cropX(),this.cropY(),a,l,0,0,n,r]:s=[o,0,0,n,r]}(this.hasFill()||this.hasStroke()||i)&&(t.beginPath(),i?I_.Util.drawRoundedRectPath(t,n,r,i):t.rect(0,0,n,r),t.closePath(),t.fillStrokeShape(this)),o&&(i&&t.clip(),t.drawImage.apply(t,s))}_hitFunc(t){var n=this.width(),r=this.height(),i=this.cornerRadius();t.beginPath(),i?I_.Util.drawRoundedRectPath(t,n,r,i):t.rect(0,0,n,r),t.closePath(),t.fillStrokeShape(this)}getWidth(){var t,n;return(t=this.attrs.width)!==null&&t!==void 0?t:(n=this.image())===null||n===void 0?void 0:n.width}getHeight(){var t,n;return(t=this.attrs.height)!==null&&t!==void 0?t:(n=this.image())===null||n===void 0?void 0:n.height}static fromURL(t,n,r=null){var i=I_.Util.createImageElement();i.onload=function(){var o=new TB({image:i});n(o)},i.onerror=r,i.crossOrigin="Anonymous",i.src=t}};G1.Image=No;No.prototype.className="Image";(0,F2e._registerNode)(No);Wl.Factory.addGetterSetter(No,"cornerRadius",0,(0,Lp.getNumberOrArrayOfNumbersValidator)(4));Wl.Factory.addGetterSetter(No,"image");Wl.Factory.addComponentsGetterSetter(No,"crop",["x","y","width","height"]);Wl.Factory.addGetterSetter(No,"cropX",0,(0,Lp.getNumberValidator)());Wl.Factory.addGetterSetter(No,"cropY",0,(0,Lp.getNumberValidator)());Wl.Factory.addGetterSetter(No,"cropWidth",0,(0,Lp.getNumberValidator)());Wl.Factory.addGetterSetter(No,"cropHeight",0,(0,Lp.getNumberValidator)());var jc={};Object.defineProperty(jc,"__esModule",{value:!0});jc.Tag=jc.Label=void 0;const H1=Re,B2e=gn,j2e=nd,Y3=he,EB=De;var PB=["fontFamily","fontSize","fontStyle","padding","lineHeight","text","width","height","pointerDirection","pointerWidth","pointerHeight"],V2e="Change.konva",z2e="none",_x="up",wx="right",xx="down",Cx="left",U2e=PB.length;class X3 extends j2e.Group{constructor(t){super(t),this.on("add.konva",function(n){this._addListeners(n.child),this._sync()})}getText(){return this.find("Text")[0]}getTag(){return this.find("Tag")[0]}_addListeners(t){var n=this,r,i=function(){n._sync()};for(r=0;r{n=Math.min(n,s.x),r=Math.max(r,s.x),i=Math.min(i,s.y),o=Math.max(o,s.y)}),{x:n,y:i,width:r-n,height:o-i}}getWidth(){return this.radius()*2}getHeight(){return this.radius()*2}setWidth(t){this.radius(t/2)}setHeight(t){this.radius(t/2)}}W1.RegularPolygon=Yl;Yl.prototype.className="RegularPolygon";Yl.prototype._centroid=!0;Yl.prototype._attrsAffectingSize=["radius"];(0,X2e._registerNode)(Yl);kB.Factory.addGetterSetter(Yl,"radius",0,(0,AB.getNumberValidator)());kB.Factory.addGetterSetter(Yl,"sides",0,(0,AB.getNumberValidator)());var K1={};Object.defineProperty(K1,"__esModule",{value:!0});K1.Ring=void 0;const OB=Re,Q2e=gn,RB=he,Z2e=De;var nA=Math.PI*2;class Xl extends Q2e.Shape{_sceneFunc(t){t.beginPath(),t.arc(0,0,this.innerRadius(),0,nA,!1),t.moveTo(this.outerRadius(),0),t.arc(0,0,this.outerRadius(),nA,0,!0),t.closePath(),t.fillStrokeShape(this)}getWidth(){return this.outerRadius()*2}getHeight(){return this.outerRadius()*2}setWidth(t){this.outerRadius(t/2)}setHeight(t){this.outerRadius(t/2)}}K1.Ring=Xl;Xl.prototype.className="Ring";Xl.prototype._centroid=!0;Xl.prototype._attrsAffectingSize=["innerRadius","outerRadius"];(0,Z2e._registerNode)(Xl);OB.Factory.addGetterSetter(Xl,"innerRadius",0,(0,RB.getNumberValidator)());OB.Factory.addGetterSetter(Xl,"outerRadius",0,(0,RB.getNumberValidator)());var Y1={};Object.defineProperty(Y1,"__esModule",{value:!0});Y1.Sprite=void 0;const Ql=Re,J2e=gn,ewe=rd,IB=he,twe=De;class Do extends J2e.Shape{constructor(t){super(t),this._updated=!0,this.anim=new ewe.Animation(()=>{var n=this._updated;return this._updated=!1,n}),this.on("animationChange.konva",function(){this.frameIndex(0)}),this.on("frameIndexChange.konva",function(){this._updated=!0}),this.on("frameRateChange.konva",function(){this.anim.isRunning()&&(clearInterval(this.interval),this._setInterval())})}_sceneFunc(t){var n=this.animation(),r=this.frameIndex(),i=r*4,o=this.animations()[n],s=this.frameOffsets(),a=o[i+0],l=o[i+1],u=o[i+2],c=o[i+3],d=this.image();if((this.hasFill()||this.hasStroke())&&(t.beginPath(),t.rect(0,0,u,c),t.closePath(),t.fillStrokeShape(this)),d)if(s){var f=s[n],h=r*2;t.drawImage(d,a,l,u,c,f[h+0],f[h+1],u,c)}else t.drawImage(d,a,l,u,c,0,0,u,c)}_hitFunc(t){var n=this.animation(),r=this.frameIndex(),i=r*4,o=this.animations()[n],s=this.frameOffsets(),a=o[i+2],l=o[i+3];if(t.beginPath(),s){var u=s[n],c=r*2;t.rect(u[c+0],u[c+1],a,l)}else t.rect(0,0,a,l);t.closePath(),t.fillShape(this)}_useBufferCanvas(){return super._useBufferCanvas(!0)}_setInterval(){var t=this;this.interval=setInterval(function(){t._updateIndex()},1e3/this.frameRate())}start(){if(!this.isRunning()){var t=this.getLayer();this.anim.setLayers(t),this._setInterval(),this.anim.start()}}stop(){this.anim.stop(),clearInterval(this.interval)}isRunning(){return this.anim.isRunning()}_updateIndex(){var t=this.frameIndex(),n=this.animation(),r=this.animations(),i=r[n],o=i.length/4;t{t=t.trim();const n=t.indexOf(" ")>=0,r=t.indexOf('"')>=0||t.indexOf("'")>=0;return n&&!r&&(t=`"${t}"`),t}).join(", ")}var Vg;function N_(){return Vg||(Vg=Tx.Util.createCanvasElement().getContext(lwe),Vg)}function bwe(e){e.fillText(this._partialText,this._partialTextX,this._partialTextY)}function Swe(e){e.setAttr("miterLimit",2),e.strokeText(this._partialText,this._partialTextX,this._partialTextY)}function _we(e){return e=e||{},!e.fillLinearGradientColorStops&&!e.fillRadialGradientColorStops&&!e.fillPatternImage&&(e.fill=e.fill||"black"),e}class Xt extends iwe.Shape{constructor(t){super(_we(t)),this._partialTextX=0,this._partialTextY=0;for(var n=0;n1&&(v+=s)}}}_hitFunc(t){var n=this.getWidth(),r=this.getHeight();t.beginPath(),t.rect(0,0,n,r),t.closePath(),t.fillStrokeShape(this)}setText(t){var n=Tx.Util._isString(t)?t:t==null?"":t+"";return this._setAttr(uwe,n),this}getWidth(){var t=this.attrs.width===mu||this.attrs.width===void 0;return t?this.getTextWidth()+this.padding()*2:this.attrs.width}getHeight(){var t=this.attrs.height===mu||this.attrs.height===void 0;return t?this.fontSize()*this.textArr.length*this.lineHeight()+this.padding()*2:this.attrs.height}getTextWidth(){return this.textWidth}getTextHeight(){return Tx.Util.warn("text.getTextHeight() method is deprecated. Use text.height() - for full height and text.fontSize() - for one line height."),this.textHeight}measureSize(t){var n=N_(),r=this.fontSize(),i;return n.save(),n.font=this._getContextFont(),i=n.measureText(t),n.restore(),{width:i.width,height:r}}_getContextFont(){return this.fontStyle()+jg+this.fontVariant()+jg+(this.fontSize()+hwe)+vwe(this.fontFamily())}_addTextLine(t){this.align()===Ld&&(t=t.trim());var r=this._getTextWidth(t);return this.textArr.push({text:t,width:r,lastInParagraph:!1})}_getTextWidth(t){var n=this.letterSpacing(),r=t.length;return N_().measureText(t).width+(r?n*(r-1):0)}_setTextData(){var t=this.text().split(` +`),n=+this.fontSize(),r=0,i=this.lineHeight()*n,o=this.attrs.width,s=this.attrs.height,a=o!==mu&&o!==void 0,l=s!==mu&&s!==void 0,u=this.padding(),c=o-u*2,d=s-u*2,f=0,h=this.wrap(),p=h!==oA,m=h!==mwe&&p,S=this.ellipsis();this.textArr=[],N_().font=this._getContextFont();for(var v=S?this._getTextWidth(M_):0,y=0,g=t.length;yc)for(;b.length>0;){for(var w=0,x=b.length,C="",k=0;w>>1,A=b.slice(0,P+1),$=this._getTextWidth(A)+v;$<=c?(w=P+1,C=A,k=$):x=P}if(C){if(m){var N,T=b[C.length],O=T===jg||T===rA;O&&k<=c?N=C.length:N=Math.max(C.lastIndexOf(jg),C.lastIndexOf(rA))+1,N>0&&(w=N,C=C.slice(0,w),k=this._getTextWidth(C))}C=C.trimRight(),this._addTextLine(C),r=Math.max(r,k),f+=i;var I=this._shouldHandleEllipsis(f);if(I){this._tryToAddEllipsisToLastLine();break}if(b=b.slice(w),b=b.trimLeft(),b.length>0&&(_=this._getTextWidth(b),_<=c)){this._addTextLine(b),f+=i,r=Math.max(r,_);break}}else break}else this._addTextLine(b),f+=i,r=Math.max(r,_),this._shouldHandleEllipsis(f)&&yd)break}this.textHeight=n,this.textWidth=r}_shouldHandleEllipsis(t){var n=+this.fontSize(),r=this.lineHeight()*n,i=this.attrs.height,o=i!==mu&&i!==void 0,s=this.padding(),a=i-s*2,l=this.wrap(),u=l!==oA;return!u||o&&t+r>a}_tryToAddEllipsisToLastLine(){var t=this.attrs.width,n=t!==mu&&t!==void 0,r=this.padding(),i=t-r*2,o=this.ellipsis(),s=this.textArr[this.textArr.length-1];if(!(!s||!o)){if(n){var a=this._getTextWidth(s.text+M_)n?null:$d.Path.getPointAtLengthOfDataArray(t,this.dataArray)}_readDataAttribute(){this.dataArray=$d.Path.parsePathData(this.attrs.data),this.pathLength=this._getTextPathLength()}_sceneFunc(t){t.setAttr("font",this._getContextFont()),t.setAttr("textBaseline",this.textBaseline()),t.setAttr("textAlign","left"),t.save();var n=this.textDecoration(),r=this.fill(),i=this.fontSize(),o=this.glyphInfo;n==="underline"&&t.beginPath();for(var s=0;s=1){var r=n[0].p0;t.moveTo(r.x,r.y)}for(var i=0;ie+`.${VB}`).join(" "),lA="nodesRect",Awe=["widthChange","heightChange","scaleXChange","scaleYChange","skewXChange","skewYChange","rotationChange","offsetXChange","offsetYChange","transformsEnabledChange","strokeWidthChange"],Owe={"top-left":-45,"top-center":0,"top-right":45,"middle-right":-90,"middle-left":90,"bottom-left":-135,"bottom-center":180,"bottom-right":135};const Rwe="ontouchstart"in Ci.Konva._global;function Iwe(e,t){if(e==="rotater")return"crosshair";t+=st.Util.degToRad(Owe[e]||0);var n=(st.Util.radToDeg(t)%360+360)%360;return st.Util._inRange(n,315+22.5,360)||st.Util._inRange(n,0,22.5)?"ns-resize":st.Util._inRange(n,45-22.5,45+22.5)?"nesw-resize":st.Util._inRange(n,90-22.5,90+22.5)?"ew-resize":st.Util._inRange(n,135-22.5,135+22.5)?"nwse-resize":st.Util._inRange(n,180-22.5,180+22.5)?"ns-resize":st.Util._inRange(n,225-22.5,225+22.5)?"nesw-resize":st.Util._inRange(n,270-22.5,270+22.5)?"ew-resize":st.Util._inRange(n,315-22.5,315+22.5)?"nwse-resize":(st.Util.error("Transformer has unknown angle for cursor detection: "+n),"pointer")}var g0=["top-left","top-center","top-right","middle-right","middle-left","bottom-left","bottom-center","bottom-right"],uA=1e8;function Mwe(e){return{x:e.x+e.width/2*Math.cos(e.rotation)+e.height/2*Math.sin(-e.rotation),y:e.y+e.height/2*Math.cos(e.rotation)+e.width/2*Math.sin(e.rotation)}}function zB(e,t,n){const r=n.x+(e.x-n.x)*Math.cos(t)-(e.y-n.y)*Math.sin(t),i=n.y+(e.x-n.x)*Math.sin(t)+(e.y-n.y)*Math.cos(t);return Object.assign(Object.assign({},e),{rotation:e.rotation+t,x:r,y:i})}function Nwe(e,t){const n=Mwe(e);return zB(e,t,n)}function Dwe(e,t,n){let r=t;for(let i=0;ii.isAncestorOf(this)?(st.Util.error("Konva.Transformer cannot be an a child of the node you are trying to attach"),!1):!0);this._nodes=t=n,t.length===1&&this.useSingleNodeRotation()?this.rotation(t[0].getAbsoluteRotation()):this.rotation(0),this._nodes.forEach(i=>{const o=()=>{this.nodes().length===1&&this.useSingleNodeRotation()&&this.rotation(this.nodes()[0].getAbsoluteRotation()),this._resetTransformCache(),!this._transforming&&!this.isDragging()&&this.update()},s=i._attrsAffectingSize.map(a=>a+"Change."+this._getEventNamespace()).join(" ");i.on(s,o),i.on(Awe.map(a=>a+`.${this._getEventNamespace()}`).join(" "),o),i.on(`absoluteTransformChange.${this._getEventNamespace()}`,o),this._proxyDrag(i)}),this._resetTransformCache();var r=!!this.findOne(".top-left");return r&&this.update(),this}_proxyDrag(t){let n;t.on(`dragstart.${this._getEventNamespace()}`,r=>{n=t.getAbsolutePosition(),!this.isDragging()&&t!==this.findOne(".back")&&this.startDrag(r,!1)}),t.on(`dragmove.${this._getEventNamespace()}`,r=>{if(!n)return;const i=t.getAbsolutePosition(),o=i.x-n.x,s=i.y-n.y;this.nodes().forEach(a=>{if(a===t||a.isDragging())return;const l=a.getAbsolutePosition();a.setAbsolutePosition({x:l.x+o,y:l.y+s}),a.startDrag(r)}),n=null})}getNodes(){return this._nodes||[]}getActiveAnchor(){return this._movingAnchorName}detach(){this._nodes&&this._nodes.forEach(t=>{t.off("."+this._getEventNamespace())}),this._nodes=[],this._resetTransformCache()}_resetTransformCache(){this._clearCache(lA),this._clearCache("transform"),this._clearSelfAndDescendantCache("absoluteTransform")}_getNodeRect(){return this._getCache(lA,this.__getNodeRect)}__getNodeShape(t,n=this.rotation(),r){var i=t.getClientRect({skipTransform:!0,skipShadow:!0,skipStroke:this.ignoreStroke()}),o=t.getAbsoluteScale(r),s=t.getAbsolutePosition(r),a=i.x*o.x-t.offsetX()*o.x,l=i.y*o.y-t.offsetY()*o.y;const u=(Ci.Konva.getAngle(t.getAbsoluteRotation())+Math.PI*2)%(Math.PI*2),c={x:s.x+a*Math.cos(u)+l*Math.sin(-u),y:s.y+l*Math.cos(u)+a*Math.sin(u),width:i.width*o.x,height:i.height*o.y,rotation:u};return zB(c,-Ci.Konva.getAngle(n),{x:0,y:0})}__getNodeRect(){var t=this.getNode();if(!t)return{x:-uA,y:-uA,width:0,height:0,rotation:0};const n=[];this.nodes().map(u=>{const c=u.getClientRect({skipTransform:!0,skipShadow:!0,skipStroke:this.ignoreStroke()});var d=[{x:c.x,y:c.y},{x:c.x+c.width,y:c.y},{x:c.x+c.width,y:c.y+c.height},{x:c.x,y:c.y+c.height}],f=u.getAbsoluteTransform();d.forEach(function(h){var p=f.point(h);n.push(p)})});const r=new st.Transform;r.rotate(-Ci.Konva.getAngle(this.rotation()));var i,o,s,a;n.forEach(function(u){var c=r.point(u);i===void 0&&(i=s=c.x,o=a=c.y),i=Math.min(i,c.x),o=Math.min(o,c.y),s=Math.max(s,c.x),a=Math.max(a,c.y)}),r.invert();const l=r.point({x:i,y:o});return{x:l.x,y:l.y,width:s-i,height:a-o,rotation:Ci.Konva.getAngle(this.rotation())}}getX(){return this._getNodeRect().x}getY(){return this._getNodeRect().y}getWidth(){return this._getNodeRect().width}getHeight(){return this._getNodeRect().height}_createElements(){this._createBack(),g0.forEach((function(t){this._createAnchor(t)}).bind(this)),this._createAnchor("rotater")}_createAnchor(t){var n=new Ewe.Rect({stroke:"rgb(0, 161, 255)",fill:"white",strokeWidth:1,name:t+" _anchor",dragDistance:0,draggable:!0,hitStrokeWidth:Rwe?10:"auto"}),r=this;n.on("mousedown touchstart",function(i){r._handleMouseDown(i)}),n.on("dragstart",i=>{n.stopDrag(),i.cancelBubble=!0}),n.on("dragend",i=>{i.cancelBubble=!0}),n.on("mouseenter",()=>{var i=Ci.Konva.getAngle(this.rotation()),o=Iwe(t,i);n.getStage().content&&(n.getStage().content.style.cursor=o),this._cursorChange=!0}),n.on("mouseout",()=>{n.getStage().content&&(n.getStage().content.style.cursor=""),this._cursorChange=!1}),this.add(n)}_createBack(){var t=new Twe.Shape({name:"back",width:0,height:0,draggable:!0,sceneFunc(n){var r=this.getParent(),i=r.padding();n.beginPath(),n.rect(-i,-i,this.width()+i*2,this.height()+i*2),n.moveTo(this.width()/2,-i),r.rotateEnabled()&&n.lineTo(this.width()/2,-r.rotateAnchorOffset()*st.Util._sign(this.height())-i),n.fillStrokeShape(this)},hitFunc:(n,r)=>{if(this.shouldOverdrawWholeArea()){var i=this.padding();n.beginPath(),n.rect(-i,-i,r.width()+i*2,r.height()+i*2),n.fillStrokeShape(r)}}});this.add(t),this._proxyDrag(t),t.on("dragstart",n=>{n.cancelBubble=!0}),t.on("dragmove",n=>{n.cancelBubble=!0}),t.on("dragend",n=>{n.cancelBubble=!0}),this.on("dragmove",n=>{this.update()})}_handleMouseDown(t){this._movingAnchorName=t.target.name().split(" ")[0];var n=this._getNodeRect(),r=n.width,i=n.height,o=Math.sqrt(Math.pow(r,2)+Math.pow(i,2));this.sin=Math.abs(i/o),this.cos=Math.abs(r/o),typeof window<"u"&&(window.addEventListener("mousemove",this._handleMouseMove),window.addEventListener("touchmove",this._handleMouseMove),window.addEventListener("mouseup",this._handleMouseUp,!0),window.addEventListener("touchend",this._handleMouseUp,!0)),this._transforming=!0;var s=t.target.getAbsolutePosition(),a=t.target.getStage().getPointerPosition();this._anchorDragOffset={x:a.x-s.x,y:a.y-s.y},this._fire("transformstart",{evt:t.evt,target:this.getNode()}),this._nodes.forEach(l=>{l._fire("transformstart",{evt:t.evt,target:l})})}_handleMouseMove(t){var n,r,i,o=this.findOne("."+this._movingAnchorName),s=o.getStage();s.setPointersPositions(t);const a=s.getPointerPosition();let l={x:a.x-this._anchorDragOffset.x,y:a.y-this._anchorDragOffset.y};const u=o.getAbsolutePosition();this.anchorDragBoundFunc()&&(l=this.anchorDragBoundFunc()(u,l,t)),o.setAbsolutePosition(l);const c=o.getAbsolutePosition();if(!(u.x===c.x&&u.y===c.y)){if(this._movingAnchorName==="rotater"){var d=this._getNodeRect();n=o.x()-d.width/2,r=-o.y()+d.height/2;let N=Math.atan2(-r,n)+Math.PI/2;d.height<0&&(N-=Math.PI);var f=Ci.Konva.getAngle(this.rotation());const T=f+N,O=Ci.Konva.getAngle(this.rotationSnapTolerance()),M=Dwe(this.rotationSnaps(),T,O)-d.rotation,R=Nwe(d,M);this._fitNodesInto(R,t);return}var h=this.shiftBehavior(),p;h==="inverted"?p=this.keepRatio()&&!t.shiftKey:h==="none"?p=this.keepRatio():p=this.keepRatio()||t.shiftKey;var g=this.centeredScaling()||t.altKey;if(this._movingAnchorName==="top-left"){if(p){var m=g?{x:this.width()/2,y:this.height()/2}:{x:this.findOne(".bottom-right").x(),y:this.findOne(".bottom-right").y()};i=Math.sqrt(Math.pow(m.x-o.x(),2)+Math.pow(m.y-o.y(),2));var S=this.findOne(".top-left").x()>m.x?-1:1,v=this.findOne(".top-left").y()>m.y?-1:1;n=i*this.cos*S,r=i*this.sin*v,this.findOne(".top-left").x(m.x-n),this.findOne(".top-left").y(m.y-r)}}else if(this._movingAnchorName==="top-center")this.findOne(".top-left").y(o.y());else if(this._movingAnchorName==="top-right"){if(p){var m=g?{x:this.width()/2,y:this.height()/2}:{x:this.findOne(".bottom-left").x(),y:this.findOne(".bottom-left").y()};i=Math.sqrt(Math.pow(o.x()-m.x,2)+Math.pow(m.y-o.y(),2));var S=this.findOne(".top-right").x()m.y?-1:1;n=i*this.cos*S,r=i*this.sin*v,this.findOne(".top-right").x(m.x+n),this.findOne(".top-right").y(m.y-r)}var y=o.position();this.findOne(".top-left").y(y.y),this.findOne(".bottom-right").x(y.x)}else if(this._movingAnchorName==="middle-left")this.findOne(".top-left").x(o.x());else if(this._movingAnchorName==="middle-right")this.findOne(".bottom-right").x(o.x());else if(this._movingAnchorName==="bottom-left"){if(p){var m=g?{x:this.width()/2,y:this.height()/2}:{x:this.findOne(".top-right").x(),y:this.findOne(".top-right").y()};i=Math.sqrt(Math.pow(m.x-o.x(),2)+Math.pow(o.y()-m.y,2));var S=m.x{r._fire("transformend",{evt:t,target:r})}),this._movingAnchorName=null}}_fitNodesInto(t,n){var r=this._getNodeRect();const i=1;if(st.Util._inRange(t.width,-this.padding()*2-i,i)){this.update();return}if(st.Util._inRange(t.height,-this.padding()*2-i,i)){this.update();return}const o=this.flipEnabled();var s=new st.Transform;if(s.rotate(Ci.Konva.getAngle(this.rotation())),this._movingAnchorName&&t.width<0&&this._movingAnchorName.indexOf("left")>=0){const d=s.point({x:-this.padding()*2,y:0});if(t.x+=d.x,t.y+=d.y,t.width+=this.padding()*2,this._movingAnchorName=this._movingAnchorName.replace("left","right"),this._anchorDragOffset.x-=d.x,this._anchorDragOffset.y-=d.y,!o){this.update();return}}else if(this._movingAnchorName&&t.width<0&&this._movingAnchorName.indexOf("right")>=0){const d=s.point({x:this.padding()*2,y:0});if(this._movingAnchorName=this._movingAnchorName.replace("right","left"),this._anchorDragOffset.x-=d.x,this._anchorDragOffset.y-=d.y,t.width+=this.padding()*2,!o){this.update();return}}if(this._movingAnchorName&&t.height<0&&this._movingAnchorName.indexOf("top")>=0){const d=s.point({x:0,y:-this.padding()*2});if(t.x+=d.x,t.y+=d.y,this._movingAnchorName=this._movingAnchorName.replace("top","bottom"),this._anchorDragOffset.x-=d.x,this._anchorDragOffset.y-=d.y,t.height+=this.padding()*2,!o){this.update();return}}else if(this._movingAnchorName&&t.height<0&&this._movingAnchorName.indexOf("bottom")>=0){const d=s.point({x:0,y:this.padding()*2});if(this._movingAnchorName=this._movingAnchorName.replace("bottom","top"),this._anchorDragOffset.x-=d.x,this._anchorDragOffset.y-=d.y,t.height+=this.padding()*2,!o){this.update();return}}if(this.boundBoxFunc()){const d=this.boundBoxFunc()(r,t);d?t=d:st.Util.warn("boundBoxFunc returned falsy. You should return new bound rect from it!")}const a=1e7,l=new st.Transform;l.translate(r.x,r.y),l.rotate(r.rotation),l.scale(r.width/a,r.height/a);const u=new st.Transform;u.translate(t.x,t.y),u.rotate(t.rotation),u.scale(t.width/a,t.height/a);const c=u.multiply(l.invert());this._nodes.forEach(d=>{var f;const h=d.getParent().getAbsoluteTransform(),p=d.getTransform().copy();p.translate(d.offsetX(),d.offsetY());const m=new st.Transform;m.multiply(h.copy().invert()).multiply(c).multiply(h).multiply(p);const S=m.decompose();d.setAttrs(S),this._fire("transform",{evt:n,target:d}),d._fire("transform",{evt:n,target:d}),(f=d.getLayer())===null||f===void 0||f.batchDraw()}),this.rotation(st.Util._getRotation(t.rotation)),this._resetTransformCache(),this.update(),this.getLayer().batchDraw()}forceUpdate(){this._resetTransformCache(),this.update()}_batchChangeChild(t,n){this.findOne(t).setAttrs(n)}update(){var t,n=this._getNodeRect();this.rotation(st.Util._getRotation(n.rotation));var r=n.width,i=n.height,o=this.enabledAnchors(),s=this.resizeEnabled(),a=this.padding(),l=this.anchorSize();const u=this.find("._anchor");u.forEach(d=>{d.setAttrs({width:l,height:l,offsetX:l/2,offsetY:l/2,stroke:this.anchorStroke(),strokeWidth:this.anchorStrokeWidth(),fill:this.anchorFill(),cornerRadius:this.anchorCornerRadius()})}),this._batchChangeChild(".top-left",{x:0,y:0,offsetX:l/2+a,offsetY:l/2+a,visible:s&&o.indexOf("top-left")>=0}),this._batchChangeChild(".top-center",{x:r/2,y:0,offsetY:l/2+a,visible:s&&o.indexOf("top-center")>=0}),this._batchChangeChild(".top-right",{x:r,y:0,offsetX:l/2-a,offsetY:l/2+a,visible:s&&o.indexOf("top-right")>=0}),this._batchChangeChild(".middle-left",{x:0,y:i/2,offsetX:l/2+a,visible:s&&o.indexOf("middle-left")>=0}),this._batchChangeChild(".middle-right",{x:r,y:i/2,offsetX:l/2-a,visible:s&&o.indexOf("middle-right")>=0}),this._batchChangeChild(".bottom-left",{x:0,y:i,offsetX:l/2+a,offsetY:l/2-a,visible:s&&o.indexOf("bottom-left")>=0}),this._batchChangeChild(".bottom-center",{x:r/2,y:i,offsetY:l/2-a,visible:s&&o.indexOf("bottom-center")>=0}),this._batchChangeChild(".bottom-right",{x:r,y:i,offsetX:l/2-a,offsetY:l/2-a,visible:s&&o.indexOf("bottom-right")>=0}),this._batchChangeChild(".rotater",{x:r/2,y:-this.rotateAnchorOffset()*st.Util._sign(i)-a,visible:this.rotateEnabled()}),this._batchChangeChild(".back",{width:r,height:i,visible:this.borderEnabled(),stroke:this.borderStroke(),strokeWidth:this.borderStrokeWidth(),dash:this.borderDash(),x:0,y:0});const c=this.anchorStyleFunc();c&&u.forEach(d=>{c(d)}),(t=this.getLayer())===null||t===void 0||t.batchDraw()}isTransforming(){return this._transforming}stopTransform(){if(this._transforming){this._removeEvents();var t=this.findOne("."+this._movingAnchorName);t&&t.stopDrag()}}destroy(){return this.getStage()&&this._cursorChange&&this.getStage().content&&(this.getStage().content.style.cursor=""),aA.Group.prototype.destroy.call(this),this.detach(),this._removeEvents(),this}toObject(){return sA.Node.prototype.toObject.call(this)}clone(t){var n=sA.Node.prototype.clone.call(this,t);return n}getClientRect(){return this.nodes().length>0?super.getClientRect():{x:0,y:0,width:0,height:0}}}Z1.Transformer=Ze;function Lwe(e){return e instanceof Array||st.Util.warn("enabledAnchors value should be an array"),e instanceof Array&&e.forEach(function(t){g0.indexOf(t)===-1&&st.Util.warn("Unknown anchor name: "+t+". Available names are: "+g0.join(", "))}),e||[]}Ze.prototype.className="Transformer";(0,Pwe._registerNode)(Ze);ot.Factory.addGetterSetter(Ze,"enabledAnchors",g0,Lwe);ot.Factory.addGetterSetter(Ze,"flipEnabled",!0,(0,$a.getBooleanValidator)());ot.Factory.addGetterSetter(Ze,"resizeEnabled",!0);ot.Factory.addGetterSetter(Ze,"anchorSize",10,(0,$a.getNumberValidator)());ot.Factory.addGetterSetter(Ze,"rotateEnabled",!0);ot.Factory.addGetterSetter(Ze,"rotationSnaps",[]);ot.Factory.addGetterSetter(Ze,"rotateAnchorOffset",50,(0,$a.getNumberValidator)());ot.Factory.addGetterSetter(Ze,"rotationSnapTolerance",5,(0,$a.getNumberValidator)());ot.Factory.addGetterSetter(Ze,"borderEnabled",!0);ot.Factory.addGetterSetter(Ze,"anchorStroke","rgb(0, 161, 255)");ot.Factory.addGetterSetter(Ze,"anchorStrokeWidth",1,(0,$a.getNumberValidator)());ot.Factory.addGetterSetter(Ze,"anchorFill","white");ot.Factory.addGetterSetter(Ze,"anchorCornerRadius",0,(0,$a.getNumberValidator)());ot.Factory.addGetterSetter(Ze,"borderStroke","rgb(0, 161, 255)");ot.Factory.addGetterSetter(Ze,"borderStrokeWidth",1,(0,$a.getNumberValidator)());ot.Factory.addGetterSetter(Ze,"borderDash");ot.Factory.addGetterSetter(Ze,"keepRatio",!0);ot.Factory.addGetterSetter(Ze,"shiftBehavior","default");ot.Factory.addGetterSetter(Ze,"centeredScaling",!1);ot.Factory.addGetterSetter(Ze,"ignoreStroke",!1);ot.Factory.addGetterSetter(Ze,"padding",0,(0,$a.getNumberValidator)());ot.Factory.addGetterSetter(Ze,"node");ot.Factory.addGetterSetter(Ze,"nodes");ot.Factory.addGetterSetter(Ze,"boundBoxFunc");ot.Factory.addGetterSetter(Ze,"anchorDragBoundFunc");ot.Factory.addGetterSetter(Ze,"anchorStyleFunc");ot.Factory.addGetterSetter(Ze,"shouldOverdrawWholeArea",!1);ot.Factory.addGetterSetter(Ze,"useSingleNodeRotation",!0);ot.Factory.backCompat(Ze,{lineEnabled:"borderEnabled",rotateHandlerOffset:"rotateAnchorOffset",enabledHandlers:"enabledAnchors"});var J1={};Object.defineProperty(J1,"__esModule",{value:!0});J1.Wedge=void 0;const eb=Re,$we=gn,Fwe=De,UB=he,Bwe=De;class Ts extends $we.Shape{_sceneFunc(t){t.beginPath(),t.arc(0,0,this.radius(),0,Fwe.Konva.getAngle(this.angle()),this.clockwise()),t.lineTo(0,0),t.closePath(),t.fillStrokeShape(this)}getWidth(){return this.radius()*2}getHeight(){return this.radius()*2}setWidth(t){this.radius(t/2)}setHeight(t){this.radius(t/2)}}J1.Wedge=Ts;Ts.prototype.className="Wedge";Ts.prototype._centroid=!0;Ts.prototype._attrsAffectingSize=["radius"];(0,Bwe._registerNode)(Ts);eb.Factory.addGetterSetter(Ts,"radius",0,(0,UB.getNumberValidator)());eb.Factory.addGetterSetter(Ts,"angle",0,(0,UB.getNumberValidator)());eb.Factory.addGetterSetter(Ts,"clockwise",!1);eb.Factory.backCompat(Ts,{angleDeg:"angle",getAngleDeg:"getAngle",setAngleDeg:"setAngle"});var tb={};Object.defineProperty(tb,"__esModule",{value:!0});tb.Blur=void 0;const cA=Re,jwe=At,Vwe=he;function dA(){this.r=0,this.g=0,this.b=0,this.a=0,this.next=null}var zwe=[512,512,456,512,328,456,335,512,405,328,271,456,388,335,292,512,454,405,364,328,298,271,496,456,420,388,360,335,312,292,273,512,482,454,428,405,383,364,345,328,312,298,284,271,259,496,475,456,437,420,404,388,374,360,347,335,323,312,302,292,282,273,265,512,497,482,468,454,441,428,417,405,394,383,373,364,354,345,337,328,320,312,305,298,291,284,278,271,265,259,507,496,485,475,465,456,446,437,428,420,412,404,396,388,381,374,367,360,354,347,341,335,329,323,318,312,307,302,297,292,287,282,278,273,269,265,261,512,505,497,489,482,475,468,461,454,447,441,435,428,422,417,411,405,399,394,389,383,378,373,368,364,359,354,350,345,341,337,332,328,324,320,316,312,309,305,301,298,294,291,287,284,281,278,274,271,268,265,262,259,257,507,501,496,491,485,480,475,470,465,460,456,451,446,442,437,433,428,424,420,416,412,408,404,400,396,392,388,385,381,377,374,370,367,363,360,357,354,350,347,344,341,338,335,332,329,326,323,320,318,315,312,310,307,304,302,299,297,294,292,289,287,285,282,280,278,275,273,271,269,267,265,263,261,259],Uwe=[9,11,12,13,13,14,14,15,15,15,15,16,16,16,16,17,17,17,17,17,17,17,18,18,18,18,18,18,18,18,18,19,19,19,19,19,19,19,19,19,19,19,19,19,19,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24];function Gwe(e,t){var n=e.data,r=e.width,i=e.height,o,s,a,l,u,c,d,f,h,p,m,S,v,y,g,b,_,w,x,C,k,P,A,$,N=t+t+1,T=r-1,O=i-1,I=t+1,M=I*(I+1)/2,R=new dA,D=null,L=R,V=null,z=null,U=zwe[t],K=Uwe[t];for(a=1;a>K,A!==0?(A=255/A,n[c]=(f*U>>K)*A,n[c+1]=(h*U>>K)*A,n[c+2]=(p*U>>K)*A):n[c]=n[c+1]=n[c+2]=0,f-=S,h-=v,p-=y,m-=g,S-=V.r,v-=V.g,y-=V.b,g-=V.a,l=d+((l=o+t+1)>K,A>0?(A=255/A,n[l]=(f*U>>K)*A,n[l+1]=(h*U>>K)*A,n[l+2]=(p*U>>K)*A):n[l]=n[l+1]=n[l+2]=0,f-=S,h-=v,p-=y,m-=g,S-=V.r,v-=V.g,y-=V.b,g-=V.a,l=o+((l=s+I)0&&Gwe(t,n)};tb.Blur=Hwe;cA.Factory.addGetterSetter(jwe.Node,"blurRadius",0,(0,Vwe.getNumberValidator)(),cA.Factory.afterSetFilter);var nb={};Object.defineProperty(nb,"__esModule",{value:!0});nb.Brighten=void 0;const fA=Re,qwe=At,Wwe=he,Kwe=function(e){var t=this.brightness()*255,n=e.data,r=n.length,i;for(i=0;i255?255:i,o=o<0?0:o>255?255:o,s=s<0?0:s>255?255:s,n[a]=i,n[a+1]=o,n[a+2]=s};rb.Contrast=Qwe;hA.Factory.addGetterSetter(Ywe.Node,"contrast",0,(0,Xwe.getNumberValidator)(),hA.Factory.afterSetFilter);var ib={};Object.defineProperty(ib,"__esModule",{value:!0});ib.Emboss=void 0;const xa=Re,ob=At,Zwe=Bt,GB=he,Jwe=function(e){var t=this.embossStrength()*10,n=this.embossWhiteLevel()*255,r=this.embossDirection(),i=this.embossBlend(),o=0,s=0,a=e.data,l=e.width,u=e.height,c=l*4,d=u;switch(r){case"top-left":o=-1,s=-1;break;case"top":o=-1,s=0;break;case"top-right":o=-1,s=1;break;case"right":o=0,s=1;break;case"bottom-right":o=1,s=1;break;case"bottom":o=1,s=0;break;case"bottom-left":o=1,s=-1;break;case"left":o=0,s=-1;break;default:Zwe.Util.error("Unknown emboss direction: "+r)}do{var f=(d-1)*c,h=o;d+h<1&&(h=0),d+h>u&&(h=0);var p=(d-1+h)*l*4,m=l;do{var S=f+(m-1)*4,v=s;m+v<1&&(v=0),m+v>l&&(v=0);var y=p+(m-1+v)*4,g=a[S]-a[y],b=a[S+1]-a[y+1],_=a[S+2]-a[y+2],w=g,x=w>0?w:-w,C=b>0?b:-b,k=_>0?_:-_;if(C>x&&(w=b),k>x&&(w=_),w*=t,i){var P=a[S]+w,A=a[S+1]+w,$=a[S+2]+w;a[S]=P>255?255:P<0?0:P,a[S+1]=A>255?255:A<0?0:A,a[S+2]=$>255?255:$<0?0:$}else{var N=n-w;N<0?N=0:N>255&&(N=255),a[S]=a[S+1]=a[S+2]=N}}while(--m)}while(--d)};ib.Emboss=Jwe;xa.Factory.addGetterSetter(ob.Node,"embossStrength",.5,(0,GB.getNumberValidator)(),xa.Factory.afterSetFilter);xa.Factory.addGetterSetter(ob.Node,"embossWhiteLevel",.5,(0,GB.getNumberValidator)(),xa.Factory.afterSetFilter);xa.Factory.addGetterSetter(ob.Node,"embossDirection","top-left",null,xa.Factory.afterSetFilter);xa.Factory.addGetterSetter(ob.Node,"embossBlend",!1,null,xa.Factory.afterSetFilter);var sb={};Object.defineProperty(sb,"__esModule",{value:!0});sb.Enhance=void 0;const pA=Re,exe=At,txe=he;function $_(e,t,n,r,i){var o=n-t,s=i-r,a;return o===0?r+s/2:s===0?r:(a=(e-t)/o,a=s*a+r,a)}const nxe=function(e){var t=e.data,n=t.length,r=t[0],i=r,o,s=t[1],a=s,l,u=t[2],c=u,d,f,h=this.enhance();if(h!==0){for(f=0;fi&&(i=o),l=t[f+1],la&&(a=l),d=t[f+2],dc&&(c=d);i===r&&(i=255,r=0),a===s&&(a=255,s=0),c===u&&(c=255,u=0);var p,m,S,v,y,g,b,_,w;for(h>0?(m=i+h*(255-i),S=r-h*(r-0),y=a+h*(255-a),g=s-h*(s-0),_=c+h*(255-c),w=u-h*(u-0)):(p=(i+r)*.5,m=i+h*(i-p),S=r+h*(r-p),v=(a+s)*.5,y=a+h*(a-v),g=s+h*(s-v),b=(c+u)*.5,_=c+h*(c-b),w=u+h*(u-b)),f=0;fv?S:v;var y=s,g=o,b,_,w=360/g*Math.PI/180,x,C;for(_=0;_g?y:g;var b=s,_=o,w,x,C=n.polarRotation||0,k,P;for(c=0;ct&&(b=g,_=0,w=-1),i=0;i=0&&h=0&&p=0&&h=0&&p=255*4?255:0}return s}function yxe(e,t,n){for(var r=[.1111111111111111,.1111111111111111,.1111111111111111,.1111111111111111,.1111111111111111,.1111111111111111,.1111111111111111,.1111111111111111,.1111111111111111],i=Math.round(Math.sqrt(r.length)),o=Math.floor(i/2),s=[],a=0;a=0&&h=0&&p=n))for(o=m;o=r||(s=(n*o+i)*4,a+=b[s+0],l+=b[s+1],u+=b[s+2],c+=b[s+3],g+=1);for(a=a/g,l=l/g,u=u/g,c=c/g,i=h;i=n))for(o=m;o=r||(s=(n*o+i)*4,b[s+0]=a,b[s+1]=l,b[s+2]=u,b[s+3]=c)}};pb.Pixelate=Txe;vA.Factory.addGetterSetter(xxe.Node,"pixelSize",8,(0,Cxe.getNumberValidator)(),vA.Factory.afterSetFilter);var gb={};Object.defineProperty(gb,"__esModule",{value:!0});gb.Posterize=void 0;const bA=Re,Exe=At,Pxe=he,kxe=function(e){var t=Math.round(this.levels()*254)+1,n=e.data,r=n.length,i=255/t,o;for(o=0;o255?255:e<0?0:Math.round(e)});y0.Factory.addGetterSetter(r4.Node,"green",0,function(e){return this._filterUpToDate=!1,e>255?255:e<0?0:Math.round(e)});y0.Factory.addGetterSetter(r4.Node,"blue",0,Axe.RGBComponent,y0.Factory.afterSetFilter);var yb={};Object.defineProperty(yb,"__esModule",{value:!0});yb.RGBA=void 0;const $h=Re,vb=At,Rxe=he,Ixe=function(e){var t=e.data,n=t.length,r=this.red(),i=this.green(),o=this.blue(),s=this.alpha(),a,l;for(a=0;a255?255:e<0?0:Math.round(e)});$h.Factory.addGetterSetter(vb.Node,"green",0,function(e){return this._filterUpToDate=!1,e>255?255:e<0?0:Math.round(e)});$h.Factory.addGetterSetter(vb.Node,"blue",0,Rxe.RGBComponent,$h.Factory.afterSetFilter);$h.Factory.addGetterSetter(vb.Node,"alpha",1,function(e){return this._filterUpToDate=!1,e>1?1:e<0?0:e});var bb={};Object.defineProperty(bb,"__esModule",{value:!0});bb.Sepia=void 0;const Mxe=function(e){var t=e.data,n=t.length,r,i,o,s;for(r=0;r127&&(u=255-u),c>127&&(c=255-c),d>127&&(d=255-d),t[l]=u,t[l+1]=c,t[l+2]=d}while(--a)}while(--o)};Sb.Solarize=Nxe;var _b={};Object.defineProperty(_b,"__esModule",{value:!0});_b.Threshold=void 0;const SA=Re,Dxe=At,Lxe=he,$xe=function(e){var t=this.threshold()*255,n=e.data,r=n.length,i;for(i=0;i{const{width:r,height:i}=t,o=document.createElement("div"),s=new Bd.Stage({container:o,width:r,height:i}),a=new Bd.Layer,l=new Bd.Layer;return a.add(new Bd.Rect({...t,fill:n?"black":"white"})),e.forEach(u=>l.add(new Bd.Line({points:u.points,stroke:n?"white":"black",strokeWidth:u.strokeWidth*2,tension:0,lineCap:"round",lineJoin:"round",shadowForStrokeEnabled:!1,globalCompositeOperation:u.tool==="brush"?"source-over":"destination-out"}))),s.add(a),s.add(l),o.remove(),s},xCe=async(e,t,n)=>new Promise((r,i)=>{const o=document.createElement("canvas");o.width=t,o.height=n;const s=o.getContext("2d"),a=new Image;if(!s){o.remove(),i("Unable to get context");return}a.onload=function(){s.drawImage(a,0,0),o.remove(),r(s.getImageData(0,0,t,n))},a.src=e}),xA=async(e,t)=>{const n=e.toDataURL(t);return await xCe(n,t.width,t.height)},CCe=ve.child({namespace:"getCanvasDataURLs"}),TCe=async e=>{const t=E1(),n=hbe();if(!t||!n){CCe.error("Unable to find canvas / stage");return}const{layerState:{objects:r},boundingBoxCoordinates:i,boundingBoxDimensions:o,isMaskEnabled:s,shouldPreserveMaskedArea:a}=e.canvas,l={...i,...o},u=t.clone();u.scale({x:1,y:1});const c=u.getAbsolutePosition(),d={x:l.x+c.x,y:l.y+c.y,width:l.width,height:l.height},f=await f0(u,d),h=await xA(u,d),p=await wCe(s?r.filter(uL):[],l,a),m=await f0(p,l),S=await xA(p,l);return{baseBlob:f,baseImageData:h,maskBlob:m,maskImageData:S}},ECe=e=>{let t=!0,n=!1;const r=e.length;let i=3;for(i;i{const t=e.length;let n=0;for(n;n{const{isPartiallyTransparent:n,isFullyTransparent:r}=ECe(e.data),i=PCe(t.data);return n?r?"txt2img":"outpaint":i?"inpaint":"img2img"},CA=e=>new Promise((t,n)=>{const r=new FileReader;r.onload=i=>t(r.result),r.onerror=i=>n(r.error),r.onabort=i=>n(new Error("Read aborted")),r.readAsDataURL(e)}),ACe=e=>{const t=window.open("");t&&e.forEach(n=>{const r=new Image;r.src=n.base64,t.document.write(n.caption),t.document.write("
"),t.document.write(r.outerHTML),t.document.write("

")})},F_=ve.child({namespace:"invoke"}),OCe=()=>{fe({predicate:e=>Op.match(e)&&e.payload==="unifiedCanvas",effect:async(e,{getState:t,dispatch:n,take:r})=>{const i=t(),o=await TCe(i);if(!o){F_.error("Unable to create canvas data");return}const{baseBlob:s,baseImageData:a,maskBlob:l,maskImageData:u}=o,c=kCe(a,u);if(i.system.enableImageDebugging){const v=await CA(s),y=await CA(l);ACe([{base64:y,caption:"mask b64"},{base64:v,caption:"image b64"}])}F_.debug(`Generation mode: ${c}`);let d,f;if(["img2img","inpaint","outpaint"].includes(c)){const{requestId:v}=n(Br({file:new File([s],"canvasInitImage.png",{type:"image/png"}),image_category:"general",is_intermediate:!0})),[{payload:y}]=await r(g=>Br.fulfilled.match(g)&&g.meta.requestId===v);d=y}if(["inpaint","outpaint"].includes(c)){const{requestId:v}=n(Br({file:new File([l],"canvasMaskImage.png",{type:"image/png"}),image_category:"mask",is_intermediate:!0})),[{payload:y}]=await r(g=>Br.fulfilled.match(g)&&g.meta.requestId===v);f=y}const h=w_e(i,c,d,f);F_.debug({graph:h},"Canvas graph built"),n(cB(h));const{requestId:p}=n(Un({graph:h})),[m]=await r(v=>Un.fulfilled.match(v)&&v.meta.requestId===p),S=m.payload.id;["img2img","inpaint"].includes(c)&&d&&n(io({image_name:d.image_name,session_id:S})),["inpaint"].includes(c)&&f&&n(io({image_name:f.image_name,session_id:S})),i.canvas.layerState.stagingArea.boundingBox||n(bhe({sessionId:S,boundingBox:{...i.canvas.boundingBoxCoordinates,...i.canvas.boundingBoxDimensions}})),n(She(S)),n(Ul())}})},TA=ve.child({namespace:"nodes"}),RCe=e=>{const{positivePrompt:t,negativePrompt:n,model:r,cfgScale:i,scheduler:o,steps:s,initialImage:a,img2imgStrength:l,shouldFitToWidthHeight:u,width:c,height:d,clipSkip:f,shouldUseCpuNoise:h,shouldUseNoiseSettings:p}=e.generation;if(!a)throw TA.error("No initial image found in state"),new Error("No initial image found in state");if(!r)throw TA.error("No model found in state"),new Error("No model found in state");const m=p?h:Vl.shouldUseCpuNoise,S={id:h0,nodes:{[wt]:{type:"main_model_loader",id:wt,model:r},[ft]:{type:"clip_skip",id:ft,skipped_layers:f},[Lt]:{type:"compel",id:Lt,prompt:t},[Wt]:{type:"compel",id:Wt,prompt:n},[Nt]:{type:"noise",id:Nt,use_cpu:m},[jn]:{type:"l2i",id:jn},[tn]:{type:"l2l",id:tn,cfg_scale:i,scheduler:o,steps:s,strength:l},[ur]:{type:"i2l",id:ur}},edges:[{source:{node_id:wt,field:"unet"},destination:{node_id:tn,field:"unet"}},{source:{node_id:wt,field:"clip"},destination:{node_id:ft,field:"clip"}},{source:{node_id:ft,field:"clip"},destination:{node_id:Lt,field:"clip"}},{source:{node_id:ft,field:"clip"},destination:{node_id:Wt,field:"clip"}},{source:{node_id:tn,field:"latents"},destination:{node_id:jn,field:"latents"}},{source:{node_id:ur,field:"latents"},destination:{node_id:tn,field:"latents"}},{source:{node_id:Nt,field:"noise"},destination:{node_id:tn,field:"noise"}},{source:{node_id:Wt,field:"conditioning"},destination:{node_id:tn,field:"negative_conditioning"}},{source:{node_id:Lt,field:"conditioning"},destination:{node_id:tn,field:"positive_conditioning"}}]};if(u&&(a.width!==c||a.height!==d)){const v={id:so,type:"img_resize",image:{image_name:a.imageName},is_intermediate:!0,width:c,height:d};S.nodes[so]=v,S.edges.push({source:{node_id:so,field:"image"},destination:{node_id:ur,field:"image"}}),S.edges.push({source:{node_id:so,field:"width"},destination:{node_id:Nt,field:"width"}}),S.edges.push({source:{node_id:so,field:"height"},destination:{node_id:Nt,field:"height"}})}else S.nodes[ur].image={image_name:a.imageName},S.edges.push({source:{node_id:ur,field:"width"},destination:{node_id:Nt,field:"width"}}),S.edges.push({source:{node_id:ur,field:"height"},destination:{node_id:Nt,field:"height"}});return S.nodes[fn]={id:fn,type:"metadata_accumulator",generation_mode:"img2img",cfg_scale:i,height:d,width:c,positive_prompt:"",negative_prompt:n,model:r,seed:0,steps:s,rand_device:m?"cpu":"cuda",scheduler:o,vae:void 0,controlnets:[],loras:[],clip_skip:f,strength:l,init_image:a.imageName},S.edges.push({source:{node_id:fn,field:"metadata"},destination:{node_id:jn,field:"metadata"}}),Rp(e,S,tn),Ip(e,S),A1(e,S),k1(e,S,tn),S},ICe=ve.child({namespace:"invoke"}),MCe=()=>{fe({predicate:e=>Op.match(e)&&e.payload==="img2img",effect:async(e,{getState:t,dispatch:n,take:r})=>{const i=t(),o=RCe(i);n(uB(o)),ICe.debug({data:o},"Image to Image graph built"),n(Un({graph:o})),await r(Un.fulfilled.match),n(Ul())}})};let Ug;const NCe=new Uint8Array(16);function DCe(){if(!Ug&&(Ug=typeof crypto<"u"&&crypto.getRandomValues&&crypto.getRandomValues.bind(crypto),!Ug))throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");return Ug(NCe)}const Mn=[];for(let e=0;e<256;++e)Mn.push((e+256).toString(16).slice(1));function LCe(e,t=0){return(Mn[e[t+0]]+Mn[e[t+1]]+Mn[e[t+2]]+Mn[e[t+3]]+"-"+Mn[e[t+4]]+Mn[e[t+5]]+"-"+Mn[e[t+6]]+Mn[e[t+7]]+"-"+Mn[e[t+8]]+Mn[e[t+9]]+"-"+Mn[e[t+10]]+Mn[e[t+11]]+Mn[e[t+12]]+Mn[e[t+13]]+Mn[e[t+14]]+Mn[e[t+15]]).toLowerCase()}const $Ce=typeof crypto<"u"&&crypto.randomUUID&&crypto.randomUUID.bind(crypto),EA={randomUUID:$Ce};function FCe(e,t,n){if(EA.randomUUID&&!t&&!e)return EA.randomUUID();e=e||{};const r=e.random||(e.rng||DCe)();if(r[6]=r[6]&15|64,r[8]=r[8]&63|128,t){n=n||0;for(let i=0;i<16;++i)t[n+i]=r[i];return t}return LCe(r)}const BCe=e=>{if(e.type==="color"&&e.value){const t=Yn(e.value),{r:n,g:r,b:i,a:o}=e.value,s=Math.max(0,Math.min(o*255,255));return Object.assign(t,{r:n,g:r,b:i,a:s}),t}return e.value},jCe=e=>{const{nodes:t,edges:n}=e.nodes,i=t.filter(a=>a.type!=="progress_image").reduce((a,l,u)=>{const{id:c,data:d}=l,{type:f,inputs:h}=d,p=Tv(h,(S,v,y)=>{const g=BCe(v);return S[y]=g,S},{}),m={type:f,id:c,...p};return Object.assign(a,{[c]:m}),a},{}),o=n.reduce((a,l,u)=>{const{source:c,target:d,sourceHandle:f,targetHandle:h}=l;return a.push({source:{node_id:c,field:f},destination:{node_id:d,field:h}}),a},[]);return o.forEach(a=>{const l=i[a.destination.node_id],u=a.destination.field;i[a.destination.node_id]=h5(l,u)}),{id:FCe(),nodes:i,edges:o}},VCe=ve.child({namespace:"invoke"}),zCe=()=>{fe({predicate:e=>Op.match(e)&&e.payload==="nodes",effect:async(e,{getState:t,dispatch:n,take:r})=>{const i=t(),o=jCe(i);n(dB(o)),VCe.debug({data:o},"Nodes graph built"),n(Un({graph:o})),await r(Un.fulfilled.match),n(Ul())}})},UCe=ve.child({namespace:"nodes"}),GCe=e=>{const{positivePrompt:t,negativePrompt:n,model:r,cfgScale:i,scheduler:o,steps:s,width:a,height:l,clipSkip:u,shouldUseCpuNoise:c,shouldUseNoiseSettings:d}=e.generation,f=d?c:Vl.shouldUseCpuNoise;if(!r)throw UCe.error("No model found in state"),new Error("No model found in state");const h={id:z3,nodes:{[wt]:{type:"main_model_loader",id:wt,model:r},[ft]:{type:"clip_skip",id:ft,skipped_layers:u},[Lt]:{type:"compel",id:Lt,prompt:t},[Wt]:{type:"compel",id:Wt,prompt:n},[Nt]:{type:"noise",id:Nt,width:a,height:l,use_cpu:f},[wn]:{type:"t2l",id:wn,cfg_scale:i,scheduler:o,steps:s},[jn]:{type:"l2i",id:jn}},edges:[{source:{node_id:wt,field:"clip"},destination:{node_id:ft,field:"clip"}},{source:{node_id:wt,field:"unet"},destination:{node_id:wn,field:"unet"}},{source:{node_id:ft,field:"clip"},destination:{node_id:Lt,field:"clip"}},{source:{node_id:ft,field:"clip"},destination:{node_id:Wt,field:"clip"}},{source:{node_id:Lt,field:"conditioning"},destination:{node_id:wn,field:"positive_conditioning"}},{source:{node_id:Wt,field:"conditioning"},destination:{node_id:wn,field:"negative_conditioning"}},{source:{node_id:wn,field:"latents"},destination:{node_id:jn,field:"latents"}},{source:{node_id:Nt,field:"noise"},destination:{node_id:wn,field:"noise"}}]};return h.nodes[fn]={id:fn,type:"metadata_accumulator",generation_mode:"txt2img",cfg_scale:i,height:l,width:a,positive_prompt:"",negative_prompt:n,model:r,seed:0,steps:s,rand_device:f?"cpu":"cuda",scheduler:o,vae:void 0,controlnets:[],loras:[],clip_skip:u},h.edges.push({source:{node_id:fn,field:"metadata"},destination:{node_id:jn,field:"metadata"}}),Rp(e,h,wn),Ip(e,h),A1(e,h),k1(e,h,wn),h},HCe=ve.child({namespace:"invoke"}),qCe=()=>{fe({predicate:e=>Op.match(e)&&e.payload==="txt2img",effect:async(e,{getState:t,dispatch:n,take:r})=>{const i=t(),o=GCe(i);n(lB(o)),HCe.debug({data:o},"Text to Image graph built"),n(Un({graph:o})),await r(Un.fulfilled.match),n(Ul())}})},WCe=ve.child({namespace:"socketio"}),KCe=()=>{fe({actionCreator:ZL,effect:(e,{dispatch:t,getState:n})=>{const{model_name:r,model_type:i,submodel:o}=e.payload.data;let s=`${i} model: ${r}`;o&&(s=s.concat(`, submodel: ${o}`)),WCe.debug(e.payload,`Model load started (${s})`),t(Bpe(e.payload))}})},YCe=ve.child({namespace:"socketio"}),XCe=()=>{fe({actionCreator:JL,effect:(e,{dispatch:t,getState:n})=>{const{model_name:r,model_type:i,submodel:o}=e.payload.data;let s=`${i} model: ${r}`;o&&(s=s.concat(`, submodel: ${o}`)),YCe.debug(e.payload,`Model load completed (${s})`),t(jpe(e.payload))}})},QCe=({image_name:e,esrganModelName:t})=>{const n={id:z8,type:"esrgan",image:{image_name:e},model_name:t,is_intermediate:!1};return{id:"adhoc-esrgan-graph",nodes:{[z8]:n},edges:[]}};ve.child({namespace:"upscale"});const ZCe=ge("upscale/upscaleRequested"),JCe=()=>{fe({actionCreator:ZCe,effect:async(e,{dispatch:t,getState:n,take:r,unsubscribe:i,subscribe:o})=>{const{image_name:s}=e.payload,{esrganModelName:a}=n().postprocessing,l=QCe({image_name:s,esrganModelName:a});t(Un({graph:l})),await r(Un.fulfilled.match),t(Ul())}})},WB=_I(),fe=WB.startListening;Wbe();Kbe();Hbe();qbe();Jbe();Nbe();Dbe();Lbe();$be();abe();Gbe();jbe();Vbe();Ybe();Xbe();OCe();zCe();qCe();MCe();KSe();Cbe();Sbe();ybe();wbe();h_e();nbe();JSe();t_e();i_e();s_e();a_e();XSe();ZSe();u_e();d_e();KCe();XCe();VSe();zSe();USe();GSe();HSe();qSe();FSe();BSe();jSe();LSe();$Se();Obe();Pbe();Ibe();Mbe();zbe();Ube();sbe();OSe();Bbe();tSe();obe();rSe();rbe();JCe();const I8e=["chakra-ui-color-mode","i18nextLng","ROARR_FILTER","ROARR_LOG"],e5e="@@invokeai-",t5e=["cursorPosition","isCanvasInitialized","doesCanvasNeedScaling"],n5e=["pendingControlImages"],r5e=["selection","entities","ids","isLoading","limit","offset","selectedBoardId","galleryView","total","isInitialized"],i5e=["schema","invocationTemplates"],o5e=[],s5e=[],a5e=["currentIteration","currentStep","isCancelable","isConnected","isESRGANAvailable","isGFPGANAvailable","isProcessing","totalIterations","totalSteps","isCancelScheduled","progressImage","wereModelsReceived","wasSchemaParsed","isPersisted","isUploading"],l5e=["shouldShowImageDetails"],u5e={canvas:t5e,gallery:r5e,generation:o5e,nodes:i5e,postprocessing:s5e,system:a5e,ui:l5e,controlNet:n5e},c5e=(e,t)=>{const n=h5(e,u5e[t]);return JSON.stringify(n)},d5e={canvas:cL,gallery:xL,generation:Vl,nodes:IF,postprocessing:DF,system:BF,config:x7,ui:MD,hotkeys:hD,controlNet:Qw},f5e=(e,t)=>WQ(JSON.parse(e),d5e[t]),h5e=e=>{if(x_e(e)&&e.payload.nodes){const t={};return{...e,payload:{...e.payload,nodes:t}}}return Nh.fulfilled.match(e)?{...e,payload:""}:B3.match(e)?{...e,payload:""}:e},p5e=["canvas/setCursorPosition","canvas/setStageCoordinates","canvas/setStageScale","canvas/setIsDrawing","canvas/setBoundingBoxCoordinates","canvas/setBoundingBoxDimensions","canvas/setIsDrawing","canvas/addPointToCurrentLine","socket/socketGeneratorProgress","socket/appSocketGeneratorProgress","hotkeys/shiftKeyPressed","@@REMEMBER_PERSISTED"],g5e=e=>e,m5e={canvas:_he,gallery:Tpe,generation:Vce,nodes:k1e,postprocessing:O1e,system:J1e,config:jZ,ui:Hce,hotkeys:lue,controlNet:Gpe,boards:Ype,dynamicPrompts:Wpe,imageDeletion:Zpe,lora:tge,modelmanager:tbe,[Eo.reducerPath]:Eo.reducer},y5e=qc(m5e),v5e=rq(y5e),b5e=["canvas","gallery","generation","nodes","postprocessing","system","ui","controlNet","dynamicPrompts","lora","modelmanager"],S5e=tI({reducer:v5e,enhancers:e=>e.concat(iq(window.localStorage,b5e,{persistDebounce:300,serialize:c5e,unserialize:f5e,prefix:e5e})).concat(xI()),middleware:e=>e({immutableCheck:!1,serializableCheck:!1}).concat(Eo.middleware).concat(LH).prepend(WB.middleware),devTools:{actionSanitizer:h5e,stateSanitizer:g5e,trace:!0,predicate:(e,t)=>!p5e.includes(t.type)}}),M8e=e=>e,_5e=""+new URL("logo-13003d72.png",import.meta.url).href,w5e=()=>j.jsxs(Q5,{position:"relative",width:"100vw",height:"100vh",alignItems:"center",justifyContent:"center",bg:"#151519",children:[j.jsx(K5,{src:_5e,w:"8rem",h:"8rem"}),j.jsx(Vv,{label:"Loading",color:"grey",position:"absolute",size:"sm",width:"24px !important",height:"24px !important",right:"1.5rem",bottom:"1.5rem"})]}),x5e=E.memo(w5e);function Ex(e){"@babel/helpers - typeof";return Ex=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(t){return typeof t}:function(t){return t&&typeof Symbol=="function"&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},Ex(e)}var KB=[],C5e=KB.forEach,T5e=KB.slice;function Px(e){return C5e.call(T5e.call(arguments,1),function(t){if(t)for(var n in t)e[n]===void 0&&(e[n]=t[n])}),e}function YB(){return typeof XMLHttpRequest=="function"||(typeof XMLHttpRequest>"u"?"undefined":Ex(XMLHttpRequest))==="object"}function E5e(e){return!!e&&typeof e.then=="function"}function P5e(e){return E5e(e)?e:Promise.resolve(e)}function k5e(e){throw new Error('Could not dynamically require "'+e+'". Please configure the dynamicRequireTargets or/and ignoreDynamicRequires option of @rollup/plugin-commonjs appropriately for this require call to work.')}var kx={exports:{}},Gg={exports:{}},PA;function A5e(){return PA||(PA=1,function(e,t){var n=typeof self<"u"?self:Ne,r=function(){function o(){this.fetch=!1,this.DOMException=n.DOMException}return o.prototype=n,new o}();(function(o){(function(s){var a={searchParams:"URLSearchParams"in o,iterable:"Symbol"in o&&"iterator"in Symbol,blob:"FileReader"in o&&"Blob"in o&&function(){try{return new Blob,!0}catch{return!1}}(),formData:"FormData"in o,arrayBuffer:"ArrayBuffer"in o};function l(T){return T&&DataView.prototype.isPrototypeOf(T)}if(a.arrayBuffer)var u=["[object Int8Array]","[object Uint8Array]","[object Uint8ClampedArray]","[object Int16Array]","[object Uint16Array]","[object Int32Array]","[object Uint32Array]","[object Float32Array]","[object Float64Array]"],c=ArrayBuffer.isView||function(T){return T&&u.indexOf(Object.prototype.toString.call(T))>-1};function d(T){if(typeof T!="string"&&(T=String(T)),/[^a-z0-9\-#$%&'*+.^_`|~]/i.test(T))throw new TypeError("Invalid character in header field name");return T.toLowerCase()}function f(T){return typeof T!="string"&&(T=String(T)),T}function h(T){var O={next:function(){var I=T.shift();return{done:I===void 0,value:I}}};return a.iterable&&(O[Symbol.iterator]=function(){return O}),O}function p(T){this.map={},T instanceof p?T.forEach(function(O,I){this.append(I,O)},this):Array.isArray(T)?T.forEach(function(O){this.append(O[0],O[1])},this):T&&Object.getOwnPropertyNames(T).forEach(function(O){this.append(O,T[O])},this)}p.prototype.append=function(T,O){T=d(T),O=f(O);var I=this.map[T];this.map[T]=I?I+", "+O:O},p.prototype.delete=function(T){delete this.map[d(T)]},p.prototype.get=function(T){return T=d(T),this.has(T)?this.map[T]:null},p.prototype.has=function(T){return this.map.hasOwnProperty(d(T))},p.prototype.set=function(T,O){this.map[d(T)]=f(O)},p.prototype.forEach=function(T,O){for(var I in this.map)this.map.hasOwnProperty(I)&&T.call(O,this.map[I],I,this)},p.prototype.keys=function(){var T=[];return this.forEach(function(O,I){T.push(I)}),h(T)},p.prototype.values=function(){var T=[];return this.forEach(function(O){T.push(O)}),h(T)},p.prototype.entries=function(){var T=[];return this.forEach(function(O,I){T.push([I,O])}),h(T)},a.iterable&&(p.prototype[Symbol.iterator]=p.prototype.entries);function m(T){if(T.bodyUsed)return Promise.reject(new TypeError("Already read"));T.bodyUsed=!0}function S(T){return new Promise(function(O,I){T.onload=function(){O(T.result)},T.onerror=function(){I(T.error)}})}function v(T){var O=new FileReader,I=S(O);return O.readAsArrayBuffer(T),I}function y(T){var O=new FileReader,I=S(O);return O.readAsText(T),I}function g(T){for(var O=new Uint8Array(T),I=new Array(O.length),M=0;M-1?O:T}function C(T,O){O=O||{};var I=O.body;if(T instanceof C){if(T.bodyUsed)throw new TypeError("Already read");this.url=T.url,this.credentials=T.credentials,O.headers||(this.headers=new p(T.headers)),this.method=T.method,this.mode=T.mode,this.signal=T.signal,!I&&T._bodyInit!=null&&(I=T._bodyInit,T.bodyUsed=!0)}else this.url=String(T);if(this.credentials=O.credentials||this.credentials||"same-origin",(O.headers||!this.headers)&&(this.headers=new p(O.headers)),this.method=x(O.method||this.method||"GET"),this.mode=O.mode||this.mode||null,this.signal=O.signal||this.signal,this.referrer=null,(this.method==="GET"||this.method==="HEAD")&&I)throw new TypeError("Body not allowed for GET or HEAD requests");this._initBody(I)}C.prototype.clone=function(){return new C(this,{body:this._bodyInit})};function k(T){var O=new FormData;return T.trim().split("&").forEach(function(I){if(I){var M=I.split("="),R=M.shift().replace(/\+/g," "),D=M.join("=").replace(/\+/g," ");O.append(decodeURIComponent(R),decodeURIComponent(D))}}),O}function P(T){var O=new p,I=T.replace(/\r?\n[\t ]+/g," ");return I.split(/\r?\n/).forEach(function(M){var R=M.split(":"),D=R.shift().trim();if(D){var L=R.join(":").trim();O.append(D,L)}}),O}_.call(C.prototype);function A(T,O){O||(O={}),this.type="default",this.status=O.status===void 0?200:O.status,this.ok=this.status>=200&&this.status<300,this.statusText="statusText"in O?O.statusText:"OK",this.headers=new p(O.headers),this.url=O.url||"",this._initBody(T)}_.call(A.prototype),A.prototype.clone=function(){return new A(this._bodyInit,{status:this.status,statusText:this.statusText,headers:new p(this.headers),url:this.url})},A.error=function(){var T=new A(null,{status:0,statusText:""});return T.type="error",T};var $=[301,302,303,307,308];A.redirect=function(T,O){if($.indexOf(O)===-1)throw new RangeError("Invalid status code");return new A(null,{status:O,headers:{location:T}})},s.DOMException=o.DOMException;try{new s.DOMException}catch{s.DOMException=function(O,I){this.message=O,this.name=I;var M=Error(O);this.stack=M.stack},s.DOMException.prototype=Object.create(Error.prototype),s.DOMException.prototype.constructor=s.DOMException}function N(T,O){return new Promise(function(I,M){var R=new C(T,O);if(R.signal&&R.signal.aborted)return M(new s.DOMException("Aborted","AbortError"));var D=new XMLHttpRequest;function L(){D.abort()}D.onload=function(){var V={status:D.status,statusText:D.statusText,headers:P(D.getAllResponseHeaders()||"")};V.url="responseURL"in D?D.responseURL:V.headers.get("X-Request-URL");var z="response"in D?D.response:D.responseText;I(new A(z,V))},D.onerror=function(){M(new TypeError("Network request failed"))},D.ontimeout=function(){M(new TypeError("Network request failed"))},D.onabort=function(){M(new s.DOMException("Aborted","AbortError"))},D.open(R.method,R.url,!0),R.credentials==="include"?D.withCredentials=!0:R.credentials==="omit"&&(D.withCredentials=!1),"responseType"in D&&a.blob&&(D.responseType="blob"),R.headers.forEach(function(V,z){D.setRequestHeader(z,V)}),R.signal&&(R.signal.addEventListener("abort",L),D.onreadystatechange=function(){D.readyState===4&&R.signal.removeEventListener("abort",L)}),D.send(typeof R._bodyInit>"u"?null:R._bodyInit)})}return N.polyfill=!0,o.fetch||(o.fetch=N,o.Headers=p,o.Request=C,o.Response=A),s.Headers=p,s.Request=C,s.Response=A,s.fetch=N,Object.defineProperty(s,"__esModule",{value:!0}),s})({})})(r),r.fetch.ponyfill=!0,delete r.fetch.polyfill;var i=r;t=i.fetch,t.default=i.fetch,t.fetch=i.fetch,t.Headers=i.Headers,t.Request=i.Request,t.Response=i.Response,e.exports=t}(Gg,Gg.exports)),Gg.exports}(function(e,t){var n;if(typeof fetch=="function"&&(typeof Ne<"u"&&Ne.fetch?n=Ne.fetch:typeof window<"u"&&window.fetch?n=window.fetch:n=fetch),typeof k5e<"u"&&(typeof window>"u"||typeof window.document>"u")){var r=n||A5e();r.default&&(r=r.default),t.default=r,e.exports=t.default}})(kx,kx.exports);var XB=kx.exports;const QB=Rl(XB),kA=i9({__proto__:null,default:QB},[XB]);function v0(e){"@babel/helpers - typeof";return v0=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(t){return typeof t}:function(t){return t&&typeof Symbol=="function"&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},v0(e)}var as;typeof fetch=="function"&&(typeof global<"u"&&global.fetch?as=global.fetch:typeof window<"u"&&window.fetch?as=window.fetch:as=fetch);var Fh;YB()&&(typeof global<"u"&&global.XMLHttpRequest?Fh=global.XMLHttpRequest:typeof window<"u"&&window.XMLHttpRequest&&(Fh=window.XMLHttpRequest));var b0;typeof ActiveXObject=="function"&&(typeof global<"u"&&global.ActiveXObject?b0=global.ActiveXObject:typeof window<"u"&&window.ActiveXObject&&(b0=window.ActiveXObject));!as&&kA&&!Fh&&!b0&&(as=QB||kA);typeof as!="function"&&(as=void 0);var Ax=function(t,n){if(n&&v0(n)==="object"){var r="";for(var i in n)r+="&"+encodeURIComponent(i)+"="+encodeURIComponent(n[i]);if(!r)return t;t=t+(t.indexOf("?")!==-1?"&":"?")+r.slice(1)}return t},AA=function(t,n,r){as(t,n).then(function(i){if(!i.ok)return r(i.statusText||"Error",{status:i.status});i.text().then(function(o){r(null,{status:i.status,data:o})}).catch(r)}).catch(r)},OA=!1,O5e=function(t,n,r,i){t.queryStringParams&&(n=Ax(n,t.queryStringParams));var o=Px({},typeof t.customHeaders=="function"?t.customHeaders():t.customHeaders);r&&(o["Content-Type"]="application/json");var s=typeof t.requestOptions=="function"?t.requestOptions(r):t.requestOptions,a=Px({method:r?"POST":"GET",body:r?t.stringify(r):void 0,headers:o},OA?{}:s);try{AA(n,a,i)}catch(l){if(!s||Object.keys(s).length===0||!l.message||l.message.indexOf("not implemented")<0)return i(l);try{Object.keys(s).forEach(function(u){delete a[u]}),AA(n,a,i),OA=!0}catch(u){i(u)}}},R5e=function(t,n,r,i){r&&v0(r)==="object"&&(r=Ax("",r).slice(1)),t.queryStringParams&&(n=Ax(n,t.queryStringParams));try{var o;Fh?o=new Fh:o=new b0("MSXML2.XMLHTTP.3.0"),o.open(r?"POST":"GET",n,1),t.crossDomain||o.setRequestHeader("X-Requested-With","XMLHttpRequest"),o.withCredentials=!!t.withCredentials,r&&o.setRequestHeader("Content-Type","application/x-www-form-urlencoded"),o.overrideMimeType&&o.overrideMimeType("application/json");var s=t.customHeaders;if(s=typeof s=="function"?s():s,s)for(var a in s)o.setRequestHeader(a,s[a]);o.onreadystatechange=function(){o.readyState>3&&i(o.status>=400?o.statusText:null,{status:o.status,data:o.responseText})},o.send(r)}catch(l){console&&console.log(l)}},I5e=function(t,n,r,i){if(typeof r=="function"&&(i=r,r=void 0),i=i||function(){},as&&n.indexOf("file:")!==0)return O5e(t,n,r,i);if(YB()||typeof ActiveXObject=="function")return R5e(t,n,r,i);i(new Error("No fetch and no xhr implementation found!"))};function Bh(e){"@babel/helpers - typeof";return Bh=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(t){return typeof t}:function(t){return t&&typeof Symbol=="function"&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},Bh(e)}function M5e(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function RA(e,t){for(var n=0;n1&&arguments[1]!==void 0?arguments[1]:{},r=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{};M5e(this,e),this.services=t,this.options=n,this.allOptions=r,this.type="backend",this.init(t,n,r)}return N5e(e,[{key:"init",value:function(n){var r=this,i=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},o=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{};this.services=n,this.options=Px(i,this.options||{},$5e()),this.allOptions=o,this.services&&this.options.reloadInterval&&setInterval(function(){return r.reload()},this.options.reloadInterval)}},{key:"readMulti",value:function(n,r,i){this._readAny(n,n,r,r,i)}},{key:"read",value:function(n,r,i){this._readAny([n],n,[r],r,i)}},{key:"_readAny",value:function(n,r,i,o,s){var a=this,l=this.options.loadPath;typeof this.options.loadPath=="function"&&(l=this.options.loadPath(n,i)),l=P5e(l),l.then(function(u){if(!u)return s(null,{});var c=a.services.interpolator.interpolate(u,{lng:n.join("+"),ns:i.join("+")});a.loadUrl(c,s,r,o)})}},{key:"loadUrl",value:function(n,r,i,o){var s=this,a=typeof i=="string"?[i]:i,l=typeof o=="string"?[o]:o,u=this.options.parseLoadPayload(a,l);this.options.request(this.options,n,u,function(c,d){if(d&&(d.status>=500&&d.status<600||!d.status))return r("failed loading "+n+"; status code: "+d.status,!0);if(d&&d.status>=400&&d.status<500)return r("failed loading "+n+"; status code: "+d.status,!1);if(!d&&c&&c.message&&c.message.indexOf("Failed to fetch")>-1)return r("failed loading "+n+": "+c.message,!0);if(c)return r(c,!1);var f,h;try{typeof d.data=="string"?f=s.options.parse(d.data,i,o):f=d.data}catch{h="failed parsing "+n+" to json"}if(h)return r(h,!1);r(null,f)})}},{key:"create",value:function(n,r,i,o,s){var a=this;if(this.options.addPath){typeof n=="string"&&(n=[n]);var l=this.options.parsePayload(r,i,o),u=0,c=[],d=[];n.forEach(function(f){var h=a.options.addPath;typeof a.options.addPath=="function"&&(h=a.options.addPath(f,r));var p=a.services.interpolator.interpolate(h,{lng:f,ns:r});a.options.request(a.options,p,l,function(m,S){u+=1,c.push(m),d.push(S),u===n.length&&typeof s=="function"&&s(c,d)})})}}},{key:"reload",value:function(){var n=this,r=this.services,i=r.backendConnector,o=r.languageUtils,s=r.logger,a=i.language;if(!(a&&a.toLowerCase()==="cimode")){var l=[],u=function(d){var f=o.toResolveHierarchy(d);f.forEach(function(h){l.indexOf(h)<0&&l.push(h)})};u(a),this.allOptions.preload&&this.allOptions.preload.forEach(function(c){return u(c)}),l.forEach(function(c){n.allOptions.ns.forEach(function(d){i.read(c,d,"read",null,null,function(f,h){f&&s.warn("loading namespace ".concat(d," for language ").concat(c," failed"),f),!f&&h&&s.log("loaded namespace ".concat(d," for language ").concat(c),h),i.loaded("".concat(c,"|").concat(d),f,h)})})})}}}]),e}();JB.type="backend";tr.use(JB).use(Sue).init({fallbackLng:"en",debug:!1,backend:{loadPath:"/locales/{{lng}}.json"},interpolation:{escapeValue:!1},returnNull:!1});const Po=Object.create(null);Po.open="0";Po.close="1";Po.ping="2";Po.pong="3";Po.message="4";Po.upgrade="5";Po.noop="6";const Im=Object.create(null);Object.keys(Po).forEach(e=>{Im[Po[e]]=e});const F5e={type:"error",data:"parser error"},ej=typeof Blob=="function"||typeof Blob<"u"&&Object.prototype.toString.call(Blob)==="[object BlobConstructor]",tj=typeof ArrayBuffer=="function",nj=e=>typeof ArrayBuffer.isView=="function"?ArrayBuffer.isView(e):e&&e.buffer instanceof ArrayBuffer,i4=({type:e,data:t},n,r)=>ej&&t instanceof Blob?n?r(t):IA(t,r):tj&&(t instanceof ArrayBuffer||nj(t))?n?r(t):IA(new Blob([t]),r):r(Po[e]+(t||"")),IA=(e,t)=>{const n=new FileReader;return n.onload=function(){const r=n.result.split(",")[1];t("b"+(r||""))},n.readAsDataURL(e)};function MA(e){return e instanceof Uint8Array?e:e instanceof ArrayBuffer?new Uint8Array(e):new Uint8Array(e.buffer,e.byteOffset,e.byteLength)}let B_;function B5e(e,t){if(ej&&e.data instanceof Blob)return e.data.arrayBuffer().then(MA).then(t);if(tj&&(e.data instanceof ArrayBuffer||nj(e.data)))return t(MA(e.data));i4(e,!1,n=>{B_||(B_=new TextEncoder),t(B_.encode(n))})}const NA="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",Zd=typeof Uint8Array>"u"?[]:new Uint8Array(256);for(let e=0;e{let t=e.length*.75,n=e.length,r,i=0,o,s,a,l;e[e.length-1]==="="&&(t--,e[e.length-2]==="="&&t--);const u=new ArrayBuffer(t),c=new Uint8Array(u);for(r=0;r>4,c[i++]=(s&15)<<4|a>>2,c[i++]=(a&3)<<6|l&63;return u},V5e=typeof ArrayBuffer=="function",o4=(e,t)=>{if(typeof e!="string")return{type:"message",data:rj(e,t)};const n=e.charAt(0);return n==="b"?{type:"message",data:z5e(e.substring(1),t)}:Im[n]?e.length>1?{type:Im[n],data:e.substring(1)}:{type:Im[n]}:F5e},z5e=(e,t)=>{if(V5e){const n=j5e(e);return rj(n,t)}else return{base64:!0,data:e}},rj=(e,t)=>{switch(t){case"blob":return e instanceof Blob?e:new Blob([e]);case"arraybuffer":default:return e instanceof ArrayBuffer?e:e.buffer}},ij=String.fromCharCode(30),U5e=(e,t)=>{const n=e.length,r=new Array(n);let i=0;e.forEach((o,s)=>{i4(o,!1,a=>{r[s]=a,++i===n&&t(r.join(ij))})})},G5e=(e,t)=>{const n=e.split(ij),r=[];for(let i=0;i54;return o4(r?e:j_.decode(e),n)}const oj=4;function sn(e){if(e)return q5e(e)}function q5e(e){for(var t in sn.prototype)e[t]=sn.prototype[t];return e}sn.prototype.on=sn.prototype.addEventListener=function(e,t){return this._callbacks=this._callbacks||{},(this._callbacks["$"+e]=this._callbacks["$"+e]||[]).push(t),this};sn.prototype.once=function(e,t){function n(){this.off(e,n),t.apply(this,arguments)}return n.fn=t,this.on(e,n),this};sn.prototype.off=sn.prototype.removeListener=sn.prototype.removeAllListeners=sn.prototype.removeEventListener=function(e,t){if(this._callbacks=this._callbacks||{},arguments.length==0)return this._callbacks={},this;var n=this._callbacks["$"+e];if(!n)return this;if(arguments.length==1)return delete this._callbacks["$"+e],this;for(var r,i=0;itypeof self<"u"?self:typeof window<"u"?window:Function("return this")())();function sj(e,...t){return t.reduce((n,r)=>(e.hasOwnProperty(r)&&(n[r]=e[r]),n),{})}const W5e=ai.setTimeout,K5e=ai.clearTimeout;function wb(e,t){t.useNativeTimers?(e.setTimeoutFn=W5e.bind(ai),e.clearTimeoutFn=K5e.bind(ai)):(e.setTimeoutFn=ai.setTimeout.bind(ai),e.clearTimeoutFn=ai.clearTimeout.bind(ai))}const Y5e=1.33;function X5e(e){return typeof e=="string"?Q5e(e):Math.ceil((e.byteLength||e.size)*Y5e)}function Q5e(e){let t=0,n=0;for(let r=0,i=e.length;r=57344?n+=3:(r++,n+=4);return n}function Z5e(e){let t="";for(let n in e)e.hasOwnProperty(n)&&(t.length&&(t+="&"),t+=encodeURIComponent(n)+"="+encodeURIComponent(e[n]));return t}function J5e(e){let t={},n=e.split("&");for(let r=0,i=n.length;r0);return t}function lj(){const e=$A(+new Date);return e!==LA?(DA=0,LA=e):e+"."+$A(DA++)}for(;Hg{this.readyState="paused",t()};if(this.polling||!this.writable){let r=0;this.polling&&(r++,this.once("pollComplete",function(){--r||n()})),this.writable||(r++,this.once("drain",function(){--r||n()}))}else n()}poll(){this.polling=!0,this.doPoll(),this.emitReserved("poll")}onData(t){const n=r=>{if(this.readyState==="opening"&&r.type==="open"&&this.onOpen(),r.type==="close")return this.onClose({description:"transport closed by the server"}),!1;this.onPacket(r)};G5e(t,this.socket.binaryType).forEach(n),this.readyState!=="closed"&&(this.polling=!1,this.emitReserved("pollComplete"),this.readyState==="open"&&this.poll())}doClose(){const t=()=>{this.write([{type:"close"}])};this.readyState==="open"?t():this.once("open",t)}write(t){this.writable=!1,U5e(t,n=>{this.doWrite(n,()=>{this.writable=!0,this.emitReserved("drain")})})}uri(){const t=this.opts.secure?"https":"http",n=this.query||{};return this.opts.timestampRequests!==!1&&(n[this.opts.timestampParam]=lj()),!this.supportsBinary&&!n.sid&&(n.b64=1),this.createUri(t,n)}request(t={}){return Object.assign(t,{xd:this.xd,cookieJar:this.cookieJar},this.opts),new cc(this.uri(),t)}doWrite(t,n){const r=this.request({method:"POST",data:t});r.on("success",n),r.on("error",(i,o)=>{this.onError("xhr post error",i,o)})}doPoll(){const t=this.request();t.on("data",this.onData.bind(this)),t.on("error",(n,r)=>{this.onError("xhr poll error",n,r)}),this.pollXhr=t}}let cc=class Mm extends sn{constructor(t,n){super(),wb(this,n),this.opts=n,this.method=n.method||"GET",this.uri=t,this.data=n.data!==void 0?n.data:null,this.create()}create(){var t;const n=sj(this.opts,"agent","pfx","key","passphrase","cert","ca","ciphers","rejectUnauthorized","autoUnref");n.xdomain=!!this.opts.xd;const r=this.xhr=new cj(n);try{r.open(this.method,this.uri,!0);try{if(this.opts.extraHeaders){r.setDisableHeaderCheck&&r.setDisableHeaderCheck(!0);for(let i in this.opts.extraHeaders)this.opts.extraHeaders.hasOwnProperty(i)&&r.setRequestHeader(i,this.opts.extraHeaders[i])}}catch{}if(this.method==="POST")try{r.setRequestHeader("Content-type","text/plain;charset=UTF-8")}catch{}try{r.setRequestHeader("Accept","*/*")}catch{}(t=this.opts.cookieJar)===null||t===void 0||t.addCookies(r),"withCredentials"in r&&(r.withCredentials=this.opts.withCredentials),this.opts.requestTimeout&&(r.timeout=this.opts.requestTimeout),r.onreadystatechange=()=>{var i;r.readyState===3&&((i=this.opts.cookieJar)===null||i===void 0||i.parseCookies(r)),r.readyState===4&&(r.status===200||r.status===1223?this.onLoad():this.setTimeoutFn(()=>{this.onError(typeof r.status=="number"?r.status:0)},0))},r.send(this.data)}catch(i){this.setTimeoutFn(()=>{this.onError(i)},0);return}typeof document<"u"&&(this.index=Mm.requestsCount++,Mm.requests[this.index]=this)}onError(t){this.emitReserved("error",t,this.xhr),this.cleanup(!0)}cleanup(t){if(!(typeof this.xhr>"u"||this.xhr===null)){if(this.xhr.onreadystatechange=r3e,t)try{this.xhr.abort()}catch{}typeof document<"u"&&delete Mm.requests[this.index],this.xhr=null}}onLoad(){const t=this.xhr.responseText;t!==null&&(this.emitReserved("data",t),this.emitReserved("success"),this.cleanup())}abort(){this.cleanup()}};cc.requestsCount=0;cc.requests={};if(typeof document<"u"){if(typeof attachEvent=="function")attachEvent("onunload",FA);else if(typeof addEventListener=="function"){const e="onpagehide"in ai?"pagehide":"unload";addEventListener(e,FA,!1)}}function FA(){for(let e in cc.requests)cc.requests.hasOwnProperty(e)&&cc.requests[e].abort()}const a4=(()=>typeof Promise=="function"&&typeof Promise.resolve=="function"?t=>Promise.resolve().then(t):(t,n)=>n(t,0))(),qg=ai.WebSocket||ai.MozWebSocket,BA=!0,s3e="arraybuffer",jA=typeof navigator<"u"&&typeof navigator.product=="string"&&navigator.product.toLowerCase()==="reactnative";class a3e extends s4{constructor(t){super(t),this.supportsBinary=!t.forceBase64}get name(){return"websocket"}doOpen(){if(!this.check())return;const t=this.uri(),n=this.opts.protocols,r=jA?{}:sj(this.opts,"agent","perMessageDeflate","pfx","key","passphrase","cert","ca","ciphers","rejectUnauthorized","localAddress","protocolVersion","origin","maxPayload","family","checkServerIdentity");this.opts.extraHeaders&&(r.headers=this.opts.extraHeaders);try{this.ws=BA&&!jA?n?new qg(t,n):new qg(t):new qg(t,n,r)}catch(i){return this.emitReserved("error",i)}this.ws.binaryType=this.socket.binaryType||s3e,this.addEventListeners()}addEventListeners(){this.ws.onopen=()=>{this.opts.autoUnref&&this.ws._socket.unref(),this.onOpen()},this.ws.onclose=t=>this.onClose({description:"websocket connection closed",context:t}),this.ws.onmessage=t=>this.onData(t.data),this.ws.onerror=t=>this.onError("websocket error",t)}write(t){this.writable=!1;for(let n=0;n{const s={};try{BA&&this.ws.send(o)}catch{}i&&a4(()=>{this.writable=!0,this.emitReserved("drain")},this.setTimeoutFn)})}}doClose(){typeof this.ws<"u"&&(this.ws.close(),this.ws=null)}uri(){const t=this.opts.secure?"wss":"ws",n=this.query||{};return this.opts.timestampRequests&&(n[this.opts.timestampParam]=lj()),this.supportsBinary||(n.b64=1),this.createUri(t,n)}check(){return!!qg}}function l3e(e,t){return e.type==="message"&&typeof e.data!="string"&&t[0]>=48&&t[0]<=54}class u3e extends s4{get name(){return"webtransport"}doOpen(){typeof WebTransport=="function"&&(this.transport=new WebTransport(this.createUri("https"),this.opts.transportOptions[this.name]),this.transport.closed.then(()=>{this.onClose()}).catch(t=>{this.onError("webtransport error",t)}),this.transport.ready.then(()=>{this.transport.createBidirectionalStream().then(t=>{const n=t.readable.getReader();this.writer=t.writable.getWriter();let r;const i=()=>{n.read().then(({done:s,value:a})=>{s||(!r&&a.byteLength===1&&a[0]===54?r=!0:(this.onPacket(H5e(a,r,"arraybuffer")),r=!1),i())}).catch(s=>{})};i();const o=this.query.sid?`0{"sid":"${this.query.sid}"}`:"0";this.writer.write(new TextEncoder().encode(o)).then(()=>this.onOpen())})}))}write(t){this.writable=!1;for(let n=0;n{l3e(r,o)&&this.writer.write(Uint8Array.of(54)),this.writer.write(o).then(()=>{i&&a4(()=>{this.writable=!0,this.emitReserved("drain")},this.setTimeoutFn)})})}}doClose(){var t;(t=this.transport)===null||t===void 0||t.close()}}const c3e={websocket:a3e,webtransport:u3e,polling:o3e},d3e=/^(?:(?![^:@\/?#]+:[^:@\/]*@)(http|https|ws|wss):\/\/)?((?:(([^:@\/?#]*)(?::([^:@\/?#]*))?)?@)?((?:[a-f0-9]{0,4}:){2,7}[a-f0-9]{0,4}|[^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/,f3e=["source","protocol","authority","userInfo","user","password","host","port","relative","path","directory","file","query","anchor"];function Rx(e){const t=e,n=e.indexOf("["),r=e.indexOf("]");n!=-1&&r!=-1&&(e=e.substring(0,n)+e.substring(n,r).replace(/:/g,";")+e.substring(r,e.length));let i=d3e.exec(e||""),o={},s=14;for(;s--;)o[f3e[s]]=i[s]||"";return n!=-1&&r!=-1&&(o.source=t,o.host=o.host.substring(1,o.host.length-1).replace(/;/g,":"),o.authority=o.authority.replace("[","").replace("]","").replace(/;/g,":"),o.ipv6uri=!0),o.pathNames=h3e(o,o.path),o.queryKey=p3e(o,o.query),o}function h3e(e,t){const n=/\/{2,9}/g,r=t.replace(n,"/").split("/");return(t.slice(0,1)=="/"||t.length===0)&&r.splice(0,1),t.slice(-1)=="/"&&r.splice(r.length-1,1),r}function p3e(e,t){const n={};return t.replace(/(?:^|&)([^&=]*)=?([^&]*)/g,function(r,i,o){i&&(n[i]=o)}),n}let dj=class xu extends sn{constructor(t,n={}){super(),this.writeBuffer=[],t&&typeof t=="object"&&(n=t,t=null),t?(t=Rx(t),n.hostname=t.host,n.secure=t.protocol==="https"||t.protocol==="wss",n.port=t.port,t.query&&(n.query=t.query)):n.host&&(n.hostname=Rx(n.host).host),wb(this,n),this.secure=n.secure!=null?n.secure:typeof location<"u"&&location.protocol==="https:",n.hostname&&!n.port&&(n.port=this.secure?"443":"80"),this.hostname=n.hostname||(typeof location<"u"?location.hostname:"localhost"),this.port=n.port||(typeof location<"u"&&location.port?location.port:this.secure?"443":"80"),this.transports=n.transports||["polling","websocket","webtransport"],this.writeBuffer=[],this.prevBufferLen=0,this.opts=Object.assign({path:"/engine.io",agent:!1,withCredentials:!1,upgrade:!0,timestampParam:"t",rememberUpgrade:!1,addTrailingSlash:!0,rejectUnauthorized:!0,perMessageDeflate:{threshold:1024},transportOptions:{},closeOnBeforeunload:!1},n),this.opts.path=this.opts.path.replace(/\/$/,"")+(this.opts.addTrailingSlash?"/":""),typeof this.opts.query=="string"&&(this.opts.query=J5e(this.opts.query)),this.id=null,this.upgrades=null,this.pingInterval=null,this.pingTimeout=null,this.pingTimeoutTimer=null,typeof addEventListener=="function"&&(this.opts.closeOnBeforeunload&&(this.beforeunloadEventListener=()=>{this.transport&&(this.transport.removeAllListeners(),this.transport.close())},addEventListener("beforeunload",this.beforeunloadEventListener,!1)),this.hostname!=="localhost"&&(this.offlineEventListener=()=>{this.onClose("transport close",{description:"network connection lost"})},addEventListener("offline",this.offlineEventListener,!1))),this.open()}createTransport(t){const n=Object.assign({},this.opts.query);n.EIO=oj,n.transport=t,this.id&&(n.sid=this.id);const r=Object.assign({},this.opts,{query:n,socket:this,hostname:this.hostname,secure:this.secure,port:this.port},this.opts.transportOptions[t]);return new c3e[t](r)}open(){let t;if(this.opts.rememberUpgrade&&xu.priorWebsocketSuccess&&this.transports.indexOf("websocket")!==-1)t="websocket";else if(this.transports.length===0){this.setTimeoutFn(()=>{this.emitReserved("error","No transports available")},0);return}else t=this.transports[0];this.readyState="opening";try{t=this.createTransport(t)}catch{this.transports.shift(),this.open();return}t.open(),this.setTransport(t)}setTransport(t){this.transport&&this.transport.removeAllListeners(),this.transport=t,t.on("drain",this.onDrain.bind(this)).on("packet",this.onPacket.bind(this)).on("error",this.onError.bind(this)).on("close",n=>this.onClose("transport close",n))}probe(t){let n=this.createTransport(t),r=!1;xu.priorWebsocketSuccess=!1;const i=()=>{r||(n.send([{type:"ping",data:"probe"}]),n.once("packet",d=>{if(!r)if(d.type==="pong"&&d.data==="probe"){if(this.upgrading=!0,this.emitReserved("upgrading",n),!n)return;xu.priorWebsocketSuccess=n.name==="websocket",this.transport.pause(()=>{r||this.readyState!=="closed"&&(c(),this.setTransport(n),n.send([{type:"upgrade"}]),this.emitReserved("upgrade",n),n=null,this.upgrading=!1,this.flush())})}else{const f=new Error("probe error");f.transport=n.name,this.emitReserved("upgradeError",f)}}))};function o(){r||(r=!0,c(),n.close(),n=null)}const s=d=>{const f=new Error("probe error: "+d);f.transport=n.name,o(),this.emitReserved("upgradeError",f)};function a(){s("transport closed")}function l(){s("socket closed")}function u(d){n&&d.name!==n.name&&o()}const c=()=>{n.removeListener("open",i),n.removeListener("error",s),n.removeListener("close",a),this.off("close",l),this.off("upgrading",u)};n.once("open",i),n.once("error",s),n.once("close",a),this.once("close",l),this.once("upgrading",u),this.upgrades.indexOf("webtransport")!==-1&&t!=="webtransport"?this.setTimeoutFn(()=>{r||n.open()},200):n.open()}onOpen(){if(this.readyState="open",xu.priorWebsocketSuccess=this.transport.name==="websocket",this.emitReserved("open"),this.flush(),this.readyState==="open"&&this.opts.upgrade){let t=0;const n=this.upgrades.length;for(;t{this.onClose("ping timeout")},this.pingInterval+this.pingTimeout),this.opts.autoUnref&&this.pingTimeoutTimer.unref()}onDrain(){this.writeBuffer.splice(0,this.prevBufferLen),this.prevBufferLen=0,this.writeBuffer.length===0?this.emitReserved("drain"):this.flush()}flush(){if(this.readyState!=="closed"&&this.transport.writable&&!this.upgrading&&this.writeBuffer.length){const t=this.getWritablePackets();this.transport.send(t),this.prevBufferLen=t.length,this.emitReserved("flush")}}getWritablePackets(){if(!(this.maxPayload&&this.transport.name==="polling"&&this.writeBuffer.length>1))return this.writeBuffer;let n=1;for(let r=0;r0&&n>this.maxPayload)return this.writeBuffer.slice(0,r);n+=2}return this.writeBuffer}write(t,n,r){return this.sendPacket("message",t,n,r),this}send(t,n,r){return this.sendPacket("message",t,n,r),this}sendPacket(t,n,r,i){if(typeof n=="function"&&(i=n,n=void 0),typeof r=="function"&&(i=r,r=null),this.readyState==="closing"||this.readyState==="closed")return;r=r||{},r.compress=r.compress!==!1;const o={type:t,data:n,options:r};this.emitReserved("packetCreate",o),this.writeBuffer.push(o),i&&this.once("flush",i),this.flush()}close(){const t=()=>{this.onClose("forced close"),this.transport.close()},n=()=>{this.off("upgrade",n),this.off("upgradeError",n),t()},r=()=>{this.once("upgrade",n),this.once("upgradeError",n)};return(this.readyState==="opening"||this.readyState==="open")&&(this.readyState="closing",this.writeBuffer.length?this.once("drain",()=>{this.upgrading?r():t()}):this.upgrading?r():t()),this}onError(t){xu.priorWebsocketSuccess=!1,this.emitReserved("error",t),this.onClose("transport error",t)}onClose(t,n){(this.readyState==="opening"||this.readyState==="open"||this.readyState==="closing")&&(this.clearTimeoutFn(this.pingTimeoutTimer),this.transport.removeAllListeners("close"),this.transport.close(),this.transport.removeAllListeners(),typeof removeEventListener=="function"&&(removeEventListener("beforeunload",this.beforeunloadEventListener,!1),removeEventListener("offline",this.offlineEventListener,!1)),this.readyState="closed",this.id=null,this.emitReserved("close",t,n),this.writeBuffer=[],this.prevBufferLen=0)}filterUpgrades(t){const n=[];let r=0;const i=t.length;for(;rtypeof ArrayBuffer.isView=="function"?ArrayBuffer.isView(e):e.buffer instanceof ArrayBuffer,fj=Object.prototype.toString,v3e=typeof Blob=="function"||typeof Blob<"u"&&fj.call(Blob)==="[object BlobConstructor]",b3e=typeof File=="function"||typeof File<"u"&&fj.call(File)==="[object FileConstructor]";function l4(e){return m3e&&(e instanceof ArrayBuffer||y3e(e))||v3e&&e instanceof Blob||b3e&&e instanceof File}function Nm(e,t){if(!e||typeof e!="object")return!1;if(Array.isArray(e)){for(let n=0,r=e.length;n=0&&e.num{delete this.acks[t];for(let s=0;s{this.io.clearTimeoutFn(o),n.apply(this,[null,...s])}}emitWithAck(t,...n){const r=this.flags.timeout!==void 0||this._opts.ackTimeout!==void 0;return new Promise((i,o)=>{n.push((s,a)=>r?s?o(s):i(a):i(s)),this.emit(t,...n)})}_addToQueue(t){let n;typeof t[t.length-1]=="function"&&(n=t.pop());const r={id:this._queueSeq++,tryCount:0,pending:!1,args:t,flags:Object.assign({fromQueue:!0},this.flags)};t.push((i,...o)=>r!==this._queue[0]?void 0:(i!==null?r.tryCount>this._opts.retries&&(this._queue.shift(),n&&n(i)):(this._queue.shift(),n&&n(null,...o)),r.pending=!1,this._drainQueue())),this._queue.push(r),this._drainQueue()}_drainQueue(t=!1){if(!this.connected||this._queue.length===0)return;const n=this._queue[0];n.pending&&!t||(n.pending=!0,n.tryCount++,this.flags=n.flags,this.emit.apply(this,n.args))}packet(t){t.nsp=this.nsp,this.io._packet(t)}onopen(){typeof this.auth=="function"?this.auth(t=>{this._sendConnectPacket(t)}):this._sendConnectPacket(this.auth)}_sendConnectPacket(t){this.packet({type:Ge.CONNECT,data:this._pid?Object.assign({pid:this._pid,offset:this._lastOffset},t):t})}onerror(t){this.connected||this.emitReserved("connect_error",t)}onclose(t,n){this.connected=!1,delete this.id,this.emitReserved("disconnect",t,n)}onpacket(t){if(t.nsp===this.nsp)switch(t.type){case Ge.CONNECT:t.data&&t.data.sid?this.onconnect(t.data.sid,t.data.pid):this.emitReserved("connect_error",new Error("It seems you are trying to reach a Socket.IO server in v2.x with a v3.x client, but they are not compatible (more information here: https://socket.io/docs/v3/migrating-from-2-x-to-3-0/)"));break;case Ge.EVENT:case Ge.BINARY_EVENT:this.onevent(t);break;case Ge.ACK:case Ge.BINARY_ACK:this.onack(t);break;case Ge.DISCONNECT:this.ondisconnect();break;case Ge.CONNECT_ERROR:this.destroy();const r=new Error(t.data.message);r.data=t.data.data,this.emitReserved("connect_error",r);break}}onevent(t){const n=t.data||[];t.id!=null&&n.push(this.ack(t.id)),this.connected?this.emitEvent(n):this.receiveBuffer.push(Object.freeze(n))}emitEvent(t){if(this._anyListeners&&this._anyListeners.length){const n=this._anyListeners.slice();for(const r of n)r.apply(this,t)}super.emit.apply(this,t),this._pid&&t.length&&typeof t[t.length-1]=="string"&&(this._lastOffset=t[t.length-1])}ack(t){const n=this;let r=!1;return function(...i){r||(r=!0,n.packet({type:Ge.ACK,id:t,data:i}))}}onack(t){const n=this.acks[t.id];typeof n=="function"&&(n.apply(this,t.data),delete this.acks[t.id])}onconnect(t,n){this.id=t,this.recovered=n&&this._pid===n,this._pid=n,this.connected=!0,this.emitBuffered(),this.emitReserved("connect"),this._drainQueue(!0)}emitBuffered(){this.receiveBuffer.forEach(t=>this.emitEvent(t)),this.receiveBuffer=[],this.sendBuffer.forEach(t=>{this.notifyOutgoingListeners(t),this.packet(t)}),this.sendBuffer=[]}ondisconnect(){this.destroy(),this.onclose("io server disconnect")}destroy(){this.subs&&(this.subs.forEach(t=>t()),this.subs=void 0),this.io._destroy(this)}disconnect(){return this.connected&&this.packet({type:Ge.DISCONNECT}),this.destroy(),this.connected&&this.onclose("io client disconnect"),this}close(){return this.disconnect()}compress(t){return this.flags.compress=t,this}get volatile(){return this.flags.volatile=!0,this}timeout(t){return this.flags.timeout=t,this}onAny(t){return this._anyListeners=this._anyListeners||[],this._anyListeners.push(t),this}prependAny(t){return this._anyListeners=this._anyListeners||[],this._anyListeners.unshift(t),this}offAny(t){if(!this._anyListeners)return this;if(t){const n=this._anyListeners;for(let r=0;r0&&e.jitter<=1?e.jitter:0,this.attempts=0}sd.prototype.duration=function(){var e=this.ms*Math.pow(this.factor,this.attempts++);if(this.jitter){var t=Math.random(),n=Math.floor(t*this.jitter*e);e=Math.floor(t*10)&1?e+n:e-n}return Math.min(e,this.max)|0};sd.prototype.reset=function(){this.attempts=0};sd.prototype.setMin=function(e){this.ms=e};sd.prototype.setMax=function(e){this.max=e};sd.prototype.setJitter=function(e){this.jitter=e};class Nx extends sn{constructor(t,n){var r;super(),this.nsps={},this.subs=[],t&&typeof t=="object"&&(n=t,t=void 0),n=n||{},n.path=n.path||"/socket.io",this.opts=n,wb(this,n),this.reconnection(n.reconnection!==!1),this.reconnectionAttempts(n.reconnectionAttempts||1/0),this.reconnectionDelay(n.reconnectionDelay||1e3),this.reconnectionDelayMax(n.reconnectionDelayMax||5e3),this.randomizationFactor((r=n.randomizationFactor)!==null&&r!==void 0?r:.5),this.backoff=new sd({min:this.reconnectionDelay(),max:this.reconnectionDelayMax(),jitter:this.randomizationFactor()}),this.timeout(n.timeout==null?2e4:n.timeout),this._readyState="closed",this.uri=t;const i=n.parser||E3e;this.encoder=new i.Encoder,this.decoder=new i.Decoder,this._autoConnect=n.autoConnect!==!1,this._autoConnect&&this.open()}reconnection(t){return arguments.length?(this._reconnection=!!t,this):this._reconnection}reconnectionAttempts(t){return t===void 0?this._reconnectionAttempts:(this._reconnectionAttempts=t,this)}reconnectionDelay(t){var n;return t===void 0?this._reconnectionDelay:(this._reconnectionDelay=t,(n=this.backoff)===null||n===void 0||n.setMin(t),this)}randomizationFactor(t){var n;return t===void 0?this._randomizationFactor:(this._randomizationFactor=t,(n=this.backoff)===null||n===void 0||n.setJitter(t),this)}reconnectionDelayMax(t){var n;return t===void 0?this._reconnectionDelayMax:(this._reconnectionDelayMax=t,(n=this.backoff)===null||n===void 0||n.setMax(t),this)}timeout(t){return arguments.length?(this._timeout=t,this):this._timeout}maybeReconnectOnOpen(){!this._reconnecting&&this._reconnection&&this.backoff.attempts===0&&this.reconnect()}open(t){if(~this._readyState.indexOf("open"))return this;this.engine=new dj(this.uri,this.opts);const n=this.engine,r=this;this._readyState="opening",this.skipReconnect=!1;const i=Pi(n,"open",function(){r.onopen(),t&&t()}),o=a=>{this.cleanup(),this._readyState="closed",this.emitReserved("error",a),t?t(a):this.maybeReconnectOnOpen()},s=Pi(n,"error",o);if(this._timeout!==!1){const a=this._timeout,l=this.setTimeoutFn(()=>{i(),o(new Error("timeout")),n.close()},a);this.opts.autoUnref&&l.unref(),this.subs.push(()=>{this.clearTimeoutFn(l)})}return this.subs.push(i),this.subs.push(s),this}connect(t){return this.open(t)}onopen(){this.cleanup(),this._readyState="open",this.emitReserved("open");const t=this.engine;this.subs.push(Pi(t,"ping",this.onping.bind(this)),Pi(t,"data",this.ondata.bind(this)),Pi(t,"error",this.onerror.bind(this)),Pi(t,"close",this.onclose.bind(this)),Pi(this.decoder,"decoded",this.ondecoded.bind(this)))}onping(){this.emitReserved("ping")}ondata(t){try{this.decoder.add(t)}catch(n){this.onclose("parse error",n)}}ondecoded(t){a4(()=>{this.emitReserved("packet",t)},this.setTimeoutFn)}onerror(t){this.emitReserved("error",t)}socket(t,n){let r=this.nsps[t];return r?this._autoConnect&&!r.active&&r.connect():(r=new hj(this,t,n),this.nsps[t]=r),r}_destroy(t){const n=Object.keys(this.nsps);for(const r of n)if(this.nsps[r].active)return;this._close()}_packet(t){const n=this.encoder.encode(t);for(let r=0;rt()),this.subs.length=0,this.decoder.destroy()}_close(){this.skipReconnect=!0,this._reconnecting=!1,this.onclose("forced close"),this.engine&&this.engine.close()}disconnect(){return this._close()}onclose(t,n){this.cleanup(),this.backoff.reset(),this._readyState="closed",this.emitReserved("close",t,n),this._reconnection&&!this.skipReconnect&&this.reconnect()}reconnect(){if(this._reconnecting||this.skipReconnect)return this;const t=this;if(this.backoff.attempts>=this._reconnectionAttempts)this.backoff.reset(),this.emitReserved("reconnect_failed"),this._reconnecting=!1;else{const n=this.backoff.duration();this._reconnecting=!0;const r=this.setTimeoutFn(()=>{t.skipReconnect||(this.emitReserved("reconnect_attempt",t.backoff.attempts),!t.skipReconnect&&t.open(i=>{i?(t._reconnecting=!1,t.reconnect(),this.emitReserved("reconnect_error",i)):t.onreconnect()}))},n);this.opts.autoUnref&&r.unref(),this.subs.push(()=>{this.clearTimeoutFn(r)})}}onreconnect(){const t=this.backoff.attempts;this._reconnecting=!1,this.backoff.reset(),this.emitReserved("reconnect",t)}}const jd={};function Dm(e,t){typeof e=="object"&&(t=e,e=void 0),t=t||{};const n=g3e(e,t.path||"/socket.io"),r=n.source,i=n.id,o=n.path,s=jd[i]&&o in jd[i].nsps,a=t.forceNew||t["force new connection"]||t.multiplex===!1||s;let l;return a?l=new Nx(r,t):(jd[i]||(jd[i]=new Nx(r,t)),l=jd[i]),n.query&&!t.query&&(t.query=n.queryKey),l.socket(n.path,t)}Object.assign(Dm,{Manager:Nx,Socket:hj,io:Dm,connect:Dm});var k3e=/d{1,4}|D{3,4}|m{1,4}|yy(?:yy)?|([HhMsTt])\1?|W{1,2}|[LlopSZN]|"[^"]*"|'[^']*'/g,A3e=/\b(?:[A-Z]{1,3}[A-Z][TC])(?:[-+]\d{4})?|((?:Australian )?(?:Pacific|Mountain|Central|Eastern|Atlantic) (?:Standard|Daylight|Prevailing) Time)\b/g,O3e=/[^-+\dA-Z]/g;function R3e(e,t,n,r){if(arguments.length===1&&typeof e=="string"&&!/\d/.test(e)&&(t=e,e=void 0),e=e||e===0?e:new Date,e instanceof Date||(e=new Date(e)),isNaN(e))throw TypeError("Invalid date");t=String(zA[t]||t||zA.default);var i=t.slice(0,4);(i==="UTC:"||i==="GMT:")&&(t=t.slice(4),n=!0,i==="GMT:"&&(r=!0));var o=function(){return n?"getUTC":"get"},s=function(){return e[o()+"Date"]()},a=function(){return e[o()+"Day"]()},l=function(){return e[o()+"Month"]()},u=function(){return e[o()+"FullYear"]()},c=function(){return e[o()+"Hours"]()},d=function(){return e[o()+"Minutes"]()},f=function(){return e[o()+"Seconds"]()},h=function(){return e[o()+"Milliseconds"]()},p=function(){return n?0:e.getTimezoneOffset()},m=function(){return I3e(e)},S=function(){return M3e(e)},v={d:function(){return s()},dd:function(){return Dr(s())},ddd:function(){return vr.dayNames[a()]},DDD:function(){return UA({y:u(),m:l(),d:s(),_:o(),dayName:vr.dayNames[a()],short:!0})},dddd:function(){return vr.dayNames[a()+7]},DDDD:function(){return UA({y:u(),m:l(),d:s(),_:o(),dayName:vr.dayNames[a()+7]})},m:function(){return l()+1},mm:function(){return Dr(l()+1)},mmm:function(){return vr.monthNames[l()]},mmmm:function(){return vr.monthNames[l()+12]},yy:function(){return String(u()).slice(2)},yyyy:function(){return Dr(u(),4)},h:function(){return c()%12||12},hh:function(){return Dr(c()%12||12)},H:function(){return c()},HH:function(){return Dr(c())},M:function(){return d()},MM:function(){return Dr(d())},s:function(){return f()},ss:function(){return Dr(f())},l:function(){return Dr(h(),3)},L:function(){return Dr(Math.floor(h()/10))},t:function(){return c()<12?vr.timeNames[0]:vr.timeNames[1]},tt:function(){return c()<12?vr.timeNames[2]:vr.timeNames[3]},T:function(){return c()<12?vr.timeNames[4]:vr.timeNames[5]},TT:function(){return c()<12?vr.timeNames[6]:vr.timeNames[7]},Z:function(){return r?"GMT":n?"UTC":N3e(e)},o:function(){return(p()>0?"-":"+")+Dr(Math.floor(Math.abs(p())/60)*100+Math.abs(p())%60,4)},p:function(){return(p()>0?"-":"+")+Dr(Math.floor(Math.abs(p())/60),2)+":"+Dr(Math.floor(Math.abs(p())%60),2)},S:function(){return["th","st","nd","rd"][s()%10>3?0:(s()%100-s()%10!=10)*s()%10]},W:function(){return m()},WW:function(){return Dr(m())},N:function(){return S()}};return t.replace(k3e,function(y){return y in v?v[y]():y.slice(1,y.length-1)})}var zA={default:"ddd mmm dd yyyy HH:MM:ss",shortDate:"m/d/yy",paddedShortDate:"mm/dd/yyyy",mediumDate:"mmm d, yyyy",longDate:"mmmm d, yyyy",fullDate:"dddd, mmmm d, yyyy",shortTime:"h:MM TT",mediumTime:"h:MM:ss TT",longTime:"h:MM:ss TT Z",isoDate:"yyyy-mm-dd",isoTime:"HH:MM:ss",isoDateTime:"yyyy-mm-dd'T'HH:MM:sso",isoUtcDateTime:"UTC:yyyy-mm-dd'T'HH:MM:ss'Z'",expiresHeaderFormat:"ddd, dd mmm yyyy HH:MM:ss Z"},vr={dayNames:["Sun","Mon","Tue","Wed","Thu","Fri","Sat","Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],monthNames:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec","January","February","March","April","May","June","July","August","September","October","November","December"],timeNames:["a","p","am","pm","A","P","AM","PM"]},Dr=function(t){var n=arguments.length>1&&arguments[1]!==void 0?arguments[1]:2;return String(t).padStart(n,"0")},UA=function(t){var n=t.y,r=t.m,i=t.d,o=t._,s=t.dayName,a=t.short,l=a===void 0?!1:a,u=new Date,c=new Date;c.setDate(c[o+"Date"]()-1);var d=new Date;d.setDate(d[o+"Date"]()+1);var f=function(){return u[o+"Date"]()},h=function(){return u[o+"Month"]()},p=function(){return u[o+"FullYear"]()},m=function(){return c[o+"Date"]()},S=function(){return c[o+"Month"]()},v=function(){return c[o+"FullYear"]()},y=function(){return d[o+"Date"]()},g=function(){return d[o+"Month"]()},b=function(){return d[o+"FullYear"]()};return p()===n&&h()===r&&f()===i?l?"Tdy":"Today":v()===n&&S()===r&&m()===i?l?"Ysd":"Yesterday":b()===n&&g()===r&&y()===i?l?"Tmw":"Tomorrow":s},I3e=function(t){var n=new Date(t.getFullYear(),t.getMonth(),t.getDate());n.setDate(n.getDate()-(n.getDay()+6)%7+3);var r=new Date(n.getFullYear(),0,4);r.setDate(r.getDate()-(r.getDay()+6)%7+3);var i=n.getTimezoneOffset()-r.getTimezoneOffset();n.setHours(n.getHours()-i);var o=(n-r)/(864e5*7);return 1+Math.floor(o)},M3e=function(t){var n=t.getDay();return n===0&&(n=7),n},N3e=function(t){return(String(t).match(A3e)||[""]).pop().replace(O3e,"").replace(/GMT\+0000/g,"UTC")};const ni=()=>R3e(new Date,"yyyy-mm-dd'T'HH:MM:ss:lo"),D3e=e=>{const{socket:t,storeApi:n,log:r}=e,{dispatch:i,getState:o}=n;t.on("connect",()=>{r.debug("Connected"),i($L({timestamp:ni()}));const{sessionId:s}=o().system;s&&(t.emit("subscribe",{session:s}),i(b3({sessionId:s,timestamp:ni(),boardId:o().gallery.selectedBoardId})))}),t.on("connect_error",s=>{s&&s.message&&s.data==="ERR_UNAUTHENTICATED"&&i(qt(ho({title:s.message,status:"error",duration:1e4})))}),t.on("disconnect",()=>{i(BL({timestamp:ni()}))}),t.on("invocation_started",s=>{i(GL({data:s,timestamp:ni()}))}),t.on("generator_progress",s=>{i(XL({data:s,timestamp:ni()}))}),t.on("invocation_error",s=>{i(WL({data:s,timestamp:ni()}))}),t.on("invocation_complete",s=>{i(S3({data:s,timestamp:ni()}))}),t.on("graph_execution_state_complete",s=>{i(KL({data:s,timestamp:ni()}))}),t.on("model_load_started",s=>{i(ZL({data:s,timestamp:ni()}))}),t.on("model_load_completed",s=>{i(JL({data:s,timestamp:ni()}))})},L3e=ve.child({namespace:"socketio"}),GA=()=>{let e=!1,t=`ws://${window.location.host}`;const n={timeout:6e4,path:"/ws/socket.io",autoConnect:!1};if(["nodes","package"].includes("production")){const o=wh.get();o&&(t=o.replace(/^https?\:\/\//i,""));const s=_h.get();s&&(n.auth={token:s}),n.transports=["websocket","polling"]}const r=Dm(t,n);return o=>s=>a=>{const{dispatch:l,getState:u}=o;if(e||(D3e({storeApi:o,socket:r,log:L3e}),e=!0,r.connect()),Un.fulfilled.match(a)){const c=a.payload.id,d=u().system.sessionId;d&&(r.emit("unsubscribe",{session:d}),l(zL({sessionId:d,timestamp:ni()}))),r.emit("subscribe",{session:c}),l(b3({sessionId:c,timestamp:ni(),boardId:u().gallery.selectedBoardId}))}s(a)}},xb=typeof window<"u"&&typeof window.document<"u"&&typeof window.document.createElement<"u";function ad(e){const t=Object.prototype.toString.call(e);return t==="[object Window]"||t==="[object global]"}function c4(e){return"nodeType"in e}function mr(e){var t,n;return e?ad(e)?e:c4(e)&&(t=(n=e.ownerDocument)==null?void 0:n.defaultView)!=null?t:window:window}function d4(e){const{Document:t}=mr(e);return e instanceof t}function Fp(e){return ad(e)?!1:e instanceof mr(e).HTMLElement}function $3e(e){return e instanceof mr(e).SVGElement}function ld(e){return e?ad(e)?e.document:c4(e)?d4(e)?e:Fp(e)?e.ownerDocument:document:document:document}const ko=xb?E.useLayoutEffect:E.useEffect;function Cb(e){const t=E.useRef(e);return ko(()=>{t.current=e}),E.useCallback(function(){for(var n=arguments.length,r=new Array(n),i=0;i{e.current=setInterval(r,i)},[]),n=E.useCallback(()=>{e.current!==null&&(clearInterval(e.current),e.current=null)},[]);return[t,n]}function jh(e,t){t===void 0&&(t=[e]);const n=E.useRef(e);return ko(()=>{n.current!==e&&(n.current=e)},t),n}function Bp(e,t){const n=E.useRef();return E.useMemo(()=>{const r=e(n.current);return n.current=r,r},[...t])}function S0(e){const t=Cb(e),n=E.useRef(null),r=E.useCallback(i=>{i!==n.current&&(t==null||t(i,n.current)),n.current=i},[]);return[n,r]}function _0(e){const t=E.useRef();return E.useEffect(()=>{t.current=e},[e]),t.current}let V_={};function Tb(e,t){return E.useMemo(()=>{if(t)return t;const n=V_[e]==null?0:V_[e]+1;return V_[e]=n,e+"-"+n},[e,t])}function pj(e){return function(t){for(var n=arguments.length,r=new Array(n>1?n-1:0),i=1;i{const a=Object.entries(s);for(const[l,u]of a){const c=o[l];c!=null&&(o[l]=c+e*u)}return o},{...t})}}const dc=pj(1),w0=pj(-1);function B3e(e){return"clientX"in e&&"clientY"in e}function f4(e){if(!e)return!1;const{KeyboardEvent:t}=mr(e.target);return t&&e instanceof t}function j3e(e){if(!e)return!1;const{TouchEvent:t}=mr(e.target);return t&&e instanceof t}function Vh(e){if(j3e(e)){if(e.touches&&e.touches.length){const{clientX:t,clientY:n}=e.touches[0];return{x:t,y:n}}else if(e.changedTouches&&e.changedTouches.length){const{clientX:t,clientY:n}=e.changedTouches[0];return{x:t,y:n}}}return B3e(e)?{x:e.clientX,y:e.clientY}:null}const zh=Object.freeze({Translate:{toString(e){if(!e)return;const{x:t,y:n}=e;return"translate3d("+(t?Math.round(t):0)+"px, "+(n?Math.round(n):0)+"px, 0)"}},Scale:{toString(e){if(!e)return;const{scaleX:t,scaleY:n}=e;return"scaleX("+t+") scaleY("+n+")"}},Transform:{toString(e){if(e)return[zh.Translate.toString(e),zh.Scale.toString(e)].join(" ")}},Transition:{toString(e){let{property:t,duration:n,easing:r}=e;return t+" "+n+"ms "+r}}}),HA="a,frame,iframe,input:not([type=hidden]):not(:disabled),select:not(:disabled),textarea:not(:disabled),button:not(:disabled),*[tabindex]";function V3e(e){return e.matches(HA)?e:e.querySelector(HA)}const z3e={display:"none"};function U3e(e){let{id:t,value:n}=e;return Ve.createElement("div",{id:t,style:z3e},n)}const G3e={position:"fixed",width:1,height:1,margin:-1,border:0,padding:0,overflow:"hidden",clip:"rect(0 0 0 0)",clipPath:"inset(100%)",whiteSpace:"nowrap"};function H3e(e){let{id:t,announcement:n}=e;return Ve.createElement("div",{id:t,style:G3e,role:"status","aria-live":"assertive","aria-atomic":!0},n)}function q3e(){const[e,t]=E.useState("");return{announce:E.useCallback(r=>{r!=null&&t(r)},[]),announcement:e}}const gj=E.createContext(null);function W3e(e){const t=E.useContext(gj);E.useEffect(()=>{if(!t)throw new Error("useDndMonitor must be used within a children of ");return t(e)},[e,t])}function K3e(){const[e]=E.useState(()=>new Set),t=E.useCallback(r=>(e.add(r),()=>e.delete(r)),[e]);return[E.useCallback(r=>{let{type:i,event:o}=r;e.forEach(s=>{var a;return(a=s[i])==null?void 0:a.call(s,o)})},[e]),t]}const Y3e={draggable:` + To pick up a draggable item, press the space bar. + While dragging, use the arrow keys to move the item. + Press space again to drop the item in its new position, or press escape to cancel. + `},X3e={onDragStart(e){let{active:t}=e;return"Picked up draggable item "+t.id+"."},onDragOver(e){let{active:t,over:n}=e;return n?"Draggable item "+t.id+" was moved over droppable area "+n.id+".":"Draggable item "+t.id+" is no longer over a droppable area."},onDragEnd(e){let{active:t,over:n}=e;return n?"Draggable item "+t.id+" was dropped over droppable area "+n.id:"Draggable item "+t.id+" was dropped."},onDragCancel(e){let{active:t}=e;return"Dragging was cancelled. Draggable item "+t.id+" was dropped."}};function Q3e(e){let{announcements:t=X3e,container:n,hiddenTextDescribedById:r,screenReaderInstructions:i=Y3e}=e;const{announce:o,announcement:s}=q3e(),a=Tb("DndLiveRegion"),[l,u]=E.useState(!1);if(E.useEffect(()=>{u(!0)},[]),W3e(E.useMemo(()=>({onDragStart(d){let{active:f}=d;o(t.onDragStart({active:f}))},onDragMove(d){let{active:f,over:h}=d;t.onDragMove&&o(t.onDragMove({active:f,over:h}))},onDragOver(d){let{active:f,over:h}=d;o(t.onDragOver({active:f,over:h}))},onDragEnd(d){let{active:f,over:h}=d;o(t.onDragEnd({active:f,over:h}))},onDragCancel(d){let{active:f,over:h}=d;o(t.onDragCancel({active:f,over:h}))}}),[o,t])),!l)return null;const c=Ve.createElement(Ve.Fragment,null,Ve.createElement(U3e,{id:r,value:i.draggable}),Ve.createElement(H3e,{id:a,announcement:s}));return n?li.createPortal(c,n):c}var cn;(function(e){e.DragStart="dragStart",e.DragMove="dragMove",e.DragEnd="dragEnd",e.DragCancel="dragCancel",e.DragOver="dragOver",e.RegisterDroppable="registerDroppable",e.SetDroppableDisabled="setDroppableDisabled",e.UnregisterDroppable="unregisterDroppable"})(cn||(cn={}));function x0(){}function qA(e,t){return E.useMemo(()=>({sensor:e,options:t??{}}),[e,t])}function Z3e(){for(var e=arguments.length,t=new Array(e),n=0;n[...t].filter(r=>r!=null),[...t])}const zi=Object.freeze({x:0,y:0});function J3e(e,t){return Math.sqrt(Math.pow(e.x-t.x,2)+Math.pow(e.y-t.y,2))}function e4e(e,t){const n=Vh(e);if(!n)return"0 0";const r={x:(n.x-t.left)/t.width*100,y:(n.y-t.top)/t.height*100};return r.x+"% "+r.y+"%"}function t4e(e,t){let{data:{value:n}}=e,{data:{value:r}}=t;return n-r}function n4e(e,t){let{data:{value:n}}=e,{data:{value:r}}=t;return r-n}function r4e(e){let{left:t,top:n,height:r,width:i}=e;return[{x:t,y:n},{x:t+i,y:n},{x:t,y:n+r},{x:t+i,y:n+r}]}function i4e(e,t){if(!e||e.length===0)return null;const[n]=e;return t?n[t]:n}function o4e(e,t){const n=Math.max(t.top,e.top),r=Math.max(t.left,e.left),i=Math.min(t.left+t.width,e.left+e.width),o=Math.min(t.top+t.height,e.top+e.height),s=i-r,a=o-n;if(r{let{collisionRect:t,droppableRects:n,droppableContainers:r}=e;const i=[];for(const o of r){const{id:s}=o,a=n.get(s);if(a){const l=o4e(a,t);l>0&&i.push({id:s,data:{droppableContainer:o,value:l}})}}return i.sort(n4e)};function a4e(e,t){const{top:n,left:r,bottom:i,right:o}=t;return n<=e.y&&e.y<=i&&r<=e.x&&e.x<=o}const l4e=e=>{let{droppableContainers:t,droppableRects:n,pointerCoordinates:r}=e;if(!r)return[];const i=[];for(const o of t){const{id:s}=o,a=n.get(s);if(a&&a4e(r,a)){const u=r4e(a).reduce((d,f)=>d+J3e(r,f),0),c=Number((u/4).toFixed(4));i.push({id:s,data:{droppableContainer:o,value:c}})}}return i.sort(t4e)};function u4e(e,t,n){return{...e,scaleX:t&&n?t.width/n.width:1,scaleY:t&&n?t.height/n.height:1}}function mj(e,t){return e&&t?{x:e.left-t.left,y:e.top-t.top}:zi}function c4e(e){return function(n){for(var r=arguments.length,i=new Array(r>1?r-1:0),o=1;o({...s,top:s.top+e*a.y,bottom:s.bottom+e*a.y,left:s.left+e*a.x,right:s.right+e*a.x}),{...n})}}const d4e=c4e(1);function yj(e){if(e.startsWith("matrix3d(")){const t=e.slice(9,-1).split(/, /);return{x:+t[12],y:+t[13],scaleX:+t[0],scaleY:+t[5]}}else if(e.startsWith("matrix(")){const t=e.slice(7,-1).split(/, /);return{x:+t[4],y:+t[5],scaleX:+t[0],scaleY:+t[3]}}return null}function f4e(e,t,n){const r=yj(t);if(!r)return e;const{scaleX:i,scaleY:o,x:s,y:a}=r,l=e.left-s-(1-i)*parseFloat(n),u=e.top-a-(1-o)*parseFloat(n.slice(n.indexOf(" ")+1)),c=i?e.width/i:e.width,d=o?e.height/o:e.height;return{width:c,height:d,top:u,right:l+c,bottom:u+d,left:l}}const h4e={ignoreTransform:!1};function jp(e,t){t===void 0&&(t=h4e);let n=e.getBoundingClientRect();if(t.ignoreTransform){const{transform:u,transformOrigin:c}=mr(e).getComputedStyle(e);u&&(n=f4e(n,u,c))}const{top:r,left:i,width:o,height:s,bottom:a,right:l}=n;return{top:r,left:i,width:o,height:s,bottom:a,right:l}}function WA(e){return jp(e,{ignoreTransform:!0})}function p4e(e){const t=e.innerWidth,n=e.innerHeight;return{top:0,left:0,right:t,bottom:n,width:t,height:n}}function g4e(e,t){return t===void 0&&(t=mr(e).getComputedStyle(e)),t.position==="fixed"}function m4e(e,t){t===void 0&&(t=mr(e).getComputedStyle(e));const n=/(auto|scroll|overlay)/;return["overflow","overflowX","overflowY"].some(i=>{const o=t[i];return typeof o=="string"?n.test(o):!1})}function h4(e,t){const n=[];function r(i){if(t!=null&&n.length>=t||!i)return n;if(d4(i)&&i.scrollingElement!=null&&!n.includes(i.scrollingElement))return n.push(i.scrollingElement),n;if(!Fp(i)||$3e(i)||n.includes(i))return n;const o=mr(e).getComputedStyle(i);return i!==e&&m4e(i,o)&&n.push(i),g4e(i,o)?n:r(i.parentNode)}return e?r(e):n}function vj(e){const[t]=h4(e,1);return t??null}function z_(e){return!xb||!e?null:ad(e)?e:c4(e)?d4(e)||e===ld(e).scrollingElement?window:Fp(e)?e:null:null}function bj(e){return ad(e)?e.scrollX:e.scrollLeft}function Sj(e){return ad(e)?e.scrollY:e.scrollTop}function Dx(e){return{x:bj(e),y:Sj(e)}}var Cn;(function(e){e[e.Forward=1]="Forward",e[e.Backward=-1]="Backward"})(Cn||(Cn={}));function _j(e){return!xb||!e?!1:e===document.scrollingElement}function wj(e){const t={x:0,y:0},n=_j(e)?{height:window.innerHeight,width:window.innerWidth}:{height:e.clientHeight,width:e.clientWidth},r={x:e.scrollWidth-n.width,y:e.scrollHeight-n.height},i=e.scrollTop<=t.y,o=e.scrollLeft<=t.x,s=e.scrollTop>=r.y,a=e.scrollLeft>=r.x;return{isTop:i,isLeft:o,isBottom:s,isRight:a,maxScroll:r,minScroll:t}}const y4e={x:.2,y:.2};function v4e(e,t,n,r,i){let{top:o,left:s,right:a,bottom:l}=n;r===void 0&&(r=10),i===void 0&&(i=y4e);const{isTop:u,isBottom:c,isLeft:d,isRight:f}=wj(e),h={x:0,y:0},p={x:0,y:0},m={height:t.height*i.y,width:t.width*i.x};return!u&&o<=t.top+m.height?(h.y=Cn.Backward,p.y=r*Math.abs((t.top+m.height-o)/m.height)):!c&&l>=t.bottom-m.height&&(h.y=Cn.Forward,p.y=r*Math.abs((t.bottom-m.height-l)/m.height)),!f&&a>=t.right-m.width?(h.x=Cn.Forward,p.x=r*Math.abs((t.right-m.width-a)/m.width)):!d&&s<=t.left+m.width&&(h.x=Cn.Backward,p.x=r*Math.abs((t.left+m.width-s)/m.width)),{direction:h,speed:p}}function b4e(e){if(e===document.scrollingElement){const{innerWidth:o,innerHeight:s}=window;return{top:0,left:0,right:o,bottom:s,width:o,height:s}}const{top:t,left:n,right:r,bottom:i}=e.getBoundingClientRect();return{top:t,left:n,right:r,bottom:i,width:e.clientWidth,height:e.clientHeight}}function xj(e){return e.reduce((t,n)=>dc(t,Dx(n)),zi)}function S4e(e){return e.reduce((t,n)=>t+bj(n),0)}function _4e(e){return e.reduce((t,n)=>t+Sj(n),0)}function Cj(e,t){if(t===void 0&&(t=jp),!e)return;const{top:n,left:r,bottom:i,right:o}=t(e);vj(e)&&(i<=0||o<=0||n>=window.innerHeight||r>=window.innerWidth)&&e.scrollIntoView({block:"center",inline:"center"})}const w4e=[["x",["left","right"],S4e],["y",["top","bottom"],_4e]];class p4{constructor(t,n){this.rect=void 0,this.width=void 0,this.height=void 0,this.top=void 0,this.bottom=void 0,this.right=void 0,this.left=void 0;const r=h4(n),i=xj(r);this.rect={...t},this.width=t.width,this.height=t.height;for(const[o,s,a]of w4e)for(const l of s)Object.defineProperty(this,l,{get:()=>{const u=a(r),c=i[o]-u;return this.rect[l]+c},enumerable:!0});Object.defineProperty(this,"rect",{enumerable:!1})}}class bf{constructor(t){this.target=void 0,this.listeners=[],this.removeAll=()=>{this.listeners.forEach(n=>{var r;return(r=this.target)==null?void 0:r.removeEventListener(...n)})},this.target=t}add(t,n,r){var i;(i=this.target)==null||i.addEventListener(t,n,r),this.listeners.push([t,n,r])}}function x4e(e){const{EventTarget:t}=mr(e);return e instanceof t?e:ld(e)}function U_(e,t){const n=Math.abs(e.x),r=Math.abs(e.y);return typeof t=="number"?Math.sqrt(n**2+r**2)>t:"x"in t&&"y"in t?n>t.x&&r>t.y:"x"in t?n>t.x:"y"in t?r>t.y:!1}var ri;(function(e){e.Click="click",e.DragStart="dragstart",e.Keydown="keydown",e.ContextMenu="contextmenu",e.Resize="resize",e.SelectionChange="selectionchange",e.VisibilityChange="visibilitychange"})(ri||(ri={}));function KA(e){e.preventDefault()}function C4e(e){e.stopPropagation()}var gt;(function(e){e.Space="Space",e.Down="ArrowDown",e.Right="ArrowRight",e.Left="ArrowLeft",e.Up="ArrowUp",e.Esc="Escape",e.Enter="Enter"})(gt||(gt={}));const Tj={start:[gt.Space,gt.Enter],cancel:[gt.Esc],end:[gt.Space,gt.Enter]},T4e=(e,t)=>{let{currentCoordinates:n}=t;switch(e.code){case gt.Right:return{...n,x:n.x+25};case gt.Left:return{...n,x:n.x-25};case gt.Down:return{...n,y:n.y+25};case gt.Up:return{...n,y:n.y-25}}};class Ej{constructor(t){this.props=void 0,this.autoScrollEnabled=!1,this.referenceCoordinates=void 0,this.listeners=void 0,this.windowListeners=void 0,this.props=t;const{event:{target:n}}=t;this.props=t,this.listeners=new bf(ld(n)),this.windowListeners=new bf(mr(n)),this.handleKeyDown=this.handleKeyDown.bind(this),this.handleCancel=this.handleCancel.bind(this),this.attach()}attach(){this.handleStart(),this.windowListeners.add(ri.Resize,this.handleCancel),this.windowListeners.add(ri.VisibilityChange,this.handleCancel),setTimeout(()=>this.listeners.add(ri.Keydown,this.handleKeyDown))}handleStart(){const{activeNode:t,onStart:n}=this.props,r=t.node.current;r&&Cj(r),n(zi)}handleKeyDown(t){if(f4(t)){const{active:n,context:r,options:i}=this.props,{keyboardCodes:o=Tj,coordinateGetter:s=T4e,scrollBehavior:a="smooth"}=i,{code:l}=t;if(o.end.includes(l)){this.handleEnd(t);return}if(o.cancel.includes(l)){this.handleCancel(t);return}const{collisionRect:u}=r.current,c=u?{x:u.left,y:u.top}:zi;this.referenceCoordinates||(this.referenceCoordinates=c);const d=s(t,{active:n,context:r.current,currentCoordinates:c});if(d){const f=w0(d,c),h={x:0,y:0},{scrollableAncestors:p}=r.current;for(const m of p){const S=t.code,{isTop:v,isRight:y,isLeft:g,isBottom:b,maxScroll:_,minScroll:w}=wj(m),x=b4e(m),C={x:Math.min(S===gt.Right?x.right-x.width/2:x.right,Math.max(S===gt.Right?x.left:x.left+x.width/2,d.x)),y:Math.min(S===gt.Down?x.bottom-x.height/2:x.bottom,Math.max(S===gt.Down?x.top:x.top+x.height/2,d.y))},k=S===gt.Right&&!y||S===gt.Left&&!g,P=S===gt.Down&&!b||S===gt.Up&&!v;if(k&&C.x!==d.x){const A=m.scrollLeft+f.x,$=S===gt.Right&&A<=_.x||S===gt.Left&&A>=w.x;if($&&!f.y){m.scrollTo({left:A,behavior:a});return}$?h.x=m.scrollLeft-A:h.x=S===gt.Right?m.scrollLeft-_.x:m.scrollLeft-w.x,h.x&&m.scrollBy({left:-h.x,behavior:a});break}else if(P&&C.y!==d.y){const A=m.scrollTop+f.y,$=S===gt.Down&&A<=_.y||S===gt.Up&&A>=w.y;if($&&!f.x){m.scrollTo({top:A,behavior:a});return}$?h.y=m.scrollTop-A:h.y=S===gt.Down?m.scrollTop-_.y:m.scrollTop-w.y,h.y&&m.scrollBy({top:-h.y,behavior:a});break}}this.handleMove(t,dc(w0(d,this.referenceCoordinates),h))}}}handleMove(t,n){const{onMove:r}=this.props;t.preventDefault(),r(n)}handleEnd(t){const{onEnd:n}=this.props;t.preventDefault(),this.detach(),n()}handleCancel(t){const{onCancel:n}=this.props;t.preventDefault(),this.detach(),n()}detach(){this.listeners.removeAll(),this.windowListeners.removeAll()}}Ej.activators=[{eventName:"onKeyDown",handler:(e,t,n)=>{let{keyboardCodes:r=Tj,onActivation:i}=t,{active:o}=n;const{code:s}=e.nativeEvent;if(r.start.includes(s)){const a=o.activatorNode.current;return a&&e.target!==a?!1:(e.preventDefault(),i==null||i({event:e.nativeEvent}),!0)}return!1}}];function YA(e){return!!(e&&"distance"in e)}function XA(e){return!!(e&&"delay"in e)}class g4{constructor(t,n,r){var i;r===void 0&&(r=x4e(t.event.target)),this.props=void 0,this.events=void 0,this.autoScrollEnabled=!0,this.document=void 0,this.activated=!1,this.initialCoordinates=void 0,this.timeoutId=null,this.listeners=void 0,this.documentListeners=void 0,this.windowListeners=void 0,this.props=t,this.events=n;const{event:o}=t,{target:s}=o;this.props=t,this.events=n,this.document=ld(s),this.documentListeners=new bf(this.document),this.listeners=new bf(r),this.windowListeners=new bf(mr(s)),this.initialCoordinates=(i=Vh(o))!=null?i:zi,this.handleStart=this.handleStart.bind(this),this.handleMove=this.handleMove.bind(this),this.handleEnd=this.handleEnd.bind(this),this.handleCancel=this.handleCancel.bind(this),this.handleKeydown=this.handleKeydown.bind(this),this.removeTextSelection=this.removeTextSelection.bind(this),this.attach()}attach(){const{events:t,props:{options:{activationConstraint:n}}}=this;if(this.listeners.add(t.move.name,this.handleMove,{passive:!1}),this.listeners.add(t.end.name,this.handleEnd),this.windowListeners.add(ri.Resize,this.handleCancel),this.windowListeners.add(ri.DragStart,KA),this.windowListeners.add(ri.VisibilityChange,this.handleCancel),this.windowListeners.add(ri.ContextMenu,KA),this.documentListeners.add(ri.Keydown,this.handleKeydown),n){if(YA(n))return;if(XA(n)){this.timeoutId=setTimeout(this.handleStart,n.delay);return}}this.handleStart()}detach(){this.listeners.removeAll(),this.windowListeners.removeAll(),setTimeout(this.documentListeners.removeAll,50),this.timeoutId!==null&&(clearTimeout(this.timeoutId),this.timeoutId=null)}handleStart(){const{initialCoordinates:t}=this,{onStart:n}=this.props;t&&(this.activated=!0,this.documentListeners.add(ri.Click,C4e,{capture:!0}),this.removeTextSelection(),this.documentListeners.add(ri.SelectionChange,this.removeTextSelection),n(t))}handleMove(t){var n;const{activated:r,initialCoordinates:i,props:o}=this,{onMove:s,options:{activationConstraint:a}}=o;if(!i)return;const l=(n=Vh(t))!=null?n:zi,u=w0(i,l);if(!r&&a){if(XA(a))return U_(u,a.tolerance)?this.handleCancel():void 0;if(YA(a))return a.tolerance!=null&&U_(u,a.tolerance)?this.handleCancel():U_(u,a.distance)?this.handleStart():void 0}t.cancelable&&t.preventDefault(),s(l)}handleEnd(){const{onEnd:t}=this.props;this.detach(),t()}handleCancel(){const{onCancel:t}=this.props;this.detach(),t()}handleKeydown(t){t.code===gt.Esc&&this.handleCancel()}removeTextSelection(){var t;(t=this.document.getSelection())==null||t.removeAllRanges()}}const E4e={move:{name:"pointermove"},end:{name:"pointerup"}};class Pj extends g4{constructor(t){const{event:n}=t,r=ld(n.target);super(t,E4e,r)}}Pj.activators=[{eventName:"onPointerDown",handler:(e,t)=>{let{nativeEvent:n}=e,{onActivation:r}=t;return!n.isPrimary||n.button!==0?!1:(r==null||r({event:n}),!0)}}];const P4e={move:{name:"mousemove"},end:{name:"mouseup"}};var Lx;(function(e){e[e.RightClick=2]="RightClick"})(Lx||(Lx={}));class kj extends g4{constructor(t){super(t,P4e,ld(t.event.target))}}kj.activators=[{eventName:"onMouseDown",handler:(e,t)=>{let{nativeEvent:n}=e,{onActivation:r}=t;return n.button===Lx.RightClick?!1:(r==null||r({event:n}),!0)}}];const G_={move:{name:"touchmove"},end:{name:"touchend"}};class Aj extends g4{constructor(t){super(t,G_)}static setup(){return window.addEventListener(G_.move.name,t,{capture:!1,passive:!1}),function(){window.removeEventListener(G_.move.name,t)};function t(){}}}Aj.activators=[{eventName:"onTouchStart",handler:(e,t)=>{let{nativeEvent:n}=e,{onActivation:r}=t;const{touches:i}=n;return i.length>1?!1:(r==null||r({event:n}),!0)}}];var Sf;(function(e){e[e.Pointer=0]="Pointer",e[e.DraggableRect=1]="DraggableRect"})(Sf||(Sf={}));var C0;(function(e){e[e.TreeOrder=0]="TreeOrder",e[e.ReversedTreeOrder=1]="ReversedTreeOrder"})(C0||(C0={}));function k4e(e){let{acceleration:t,activator:n=Sf.Pointer,canScroll:r,draggingRect:i,enabled:o,interval:s=5,order:a=C0.TreeOrder,pointerCoordinates:l,scrollableAncestors:u,scrollableAncestorRects:c,delta:d,threshold:f}=e;const h=O4e({delta:d,disabled:!o}),[p,m]=F3e(),S=E.useRef({x:0,y:0}),v=E.useRef({x:0,y:0}),y=E.useMemo(()=>{switch(n){case Sf.Pointer:return l?{top:l.y,bottom:l.y,left:l.x,right:l.x}:null;case Sf.DraggableRect:return i}},[n,i,l]),g=E.useRef(null),b=E.useCallback(()=>{const w=g.current;if(!w)return;const x=S.current.x*v.current.x,C=S.current.y*v.current.y;w.scrollBy(x,C)},[]),_=E.useMemo(()=>a===C0.TreeOrder?[...u].reverse():u,[a,u]);E.useEffect(()=>{if(!o||!u.length||!y){m();return}for(const w of _){if((r==null?void 0:r(w))===!1)continue;const x=u.indexOf(w),C=c[x];if(!C)continue;const{direction:k,speed:P}=v4e(w,C,y,t,f);for(const A of["x","y"])h[A][k[A]]||(P[A]=0,k[A]=0);if(P.x>0||P.y>0){m(),g.current=w,p(b,s),S.current=P,v.current=k;return}}S.current={x:0,y:0},v.current={x:0,y:0},m()},[t,b,r,m,o,s,JSON.stringify(y),JSON.stringify(h),p,u,_,c,JSON.stringify(f)])}const A4e={x:{[Cn.Backward]:!1,[Cn.Forward]:!1},y:{[Cn.Backward]:!1,[Cn.Forward]:!1}};function O4e(e){let{delta:t,disabled:n}=e;const r=_0(t);return Bp(i=>{if(n||!r||!i)return A4e;const o={x:Math.sign(t.x-r.x),y:Math.sign(t.y-r.y)};return{x:{[Cn.Backward]:i.x[Cn.Backward]||o.x===-1,[Cn.Forward]:i.x[Cn.Forward]||o.x===1},y:{[Cn.Backward]:i.y[Cn.Backward]||o.y===-1,[Cn.Forward]:i.y[Cn.Forward]||o.y===1}}},[n,t,r])}function R4e(e,t){const n=t!==null?e.get(t):void 0,r=n?n.node.current:null;return Bp(i=>{var o;return t===null?null:(o=r??i)!=null?o:null},[r,t])}function I4e(e,t){return E.useMemo(()=>e.reduce((n,r)=>{const{sensor:i}=r,o=i.activators.map(s=>({eventName:s.eventName,handler:t(s.handler,r)}));return[...n,...o]},[]),[e,t])}var Uh;(function(e){e[e.Always=0]="Always",e[e.BeforeDragging=1]="BeforeDragging",e[e.WhileDragging=2]="WhileDragging"})(Uh||(Uh={}));var $x;(function(e){e.Optimized="optimized"})($x||($x={}));const QA=new Map;function M4e(e,t){let{dragging:n,dependencies:r,config:i}=t;const[o,s]=E.useState(null),{frequency:a,measure:l,strategy:u}=i,c=E.useRef(e),d=S(),f=jh(d),h=E.useCallback(function(v){v===void 0&&(v=[]),!f.current&&s(y=>y===null?v:y.concat(v.filter(g=>!y.includes(g))))},[f]),p=E.useRef(null),m=Bp(v=>{if(d&&!n)return QA;if(!v||v===QA||c.current!==e||o!=null){const y=new Map;for(let g of e){if(!g)continue;if(o&&o.length>0&&!o.includes(g.id)&&g.rect.current){y.set(g.id,g.rect.current);continue}const b=g.node.current,_=b?new p4(l(b),b):null;g.rect.current=_,_&&y.set(g.id,_)}return y}return v},[e,o,n,d,l]);return E.useEffect(()=>{c.current=e},[e]),E.useEffect(()=>{d||h()},[n,d]),E.useEffect(()=>{o&&o.length>0&&s(null)},[JSON.stringify(o)]),E.useEffect(()=>{d||typeof a!="number"||p.current!==null||(p.current=setTimeout(()=>{h(),p.current=null},a))},[a,d,h,...r]),{droppableRects:m,measureDroppableContainers:h,measuringScheduled:o!=null};function S(){switch(u){case Uh.Always:return!1;case Uh.BeforeDragging:return n;default:return!n}}}function m4(e,t){return Bp(n=>e?n||(typeof t=="function"?t(e):e):null,[t,e])}function N4e(e,t){return m4(e,t)}function D4e(e){let{callback:t,disabled:n}=e;const r=Cb(t),i=E.useMemo(()=>{if(n||typeof window>"u"||typeof window.MutationObserver>"u")return;const{MutationObserver:o}=window;return new o(r)},[r,n]);return E.useEffect(()=>()=>i==null?void 0:i.disconnect(),[i]),i}function Eb(e){let{callback:t,disabled:n}=e;const r=Cb(t),i=E.useMemo(()=>{if(n||typeof window>"u"||typeof window.ResizeObserver>"u")return;const{ResizeObserver:o}=window;return new o(r)},[n]);return E.useEffect(()=>()=>i==null?void 0:i.disconnect(),[i]),i}function L4e(e){return new p4(jp(e),e)}function ZA(e,t,n){t===void 0&&(t=L4e);const[r,i]=E.useReducer(a,null),o=D4e({callback(l){if(e)for(const u of l){const{type:c,target:d}=u;if(c==="childList"&&d instanceof HTMLElement&&d.contains(e)){i();break}}}}),s=Eb({callback:i});return ko(()=>{i(),e?(s==null||s.observe(e),o==null||o.observe(document.body,{childList:!0,subtree:!0})):(s==null||s.disconnect(),o==null||o.disconnect())},[e]),r;function a(l){if(!e)return null;if(e.isConnected===!1){var u;return(u=l??n)!=null?u:null}const c=t(e);return JSON.stringify(l)===JSON.stringify(c)?l:c}}function $4e(e){const t=m4(e);return mj(e,t)}const JA=[];function F4e(e){const t=E.useRef(e),n=Bp(r=>e?r&&r!==JA&&e&&t.current&&e.parentNode===t.current.parentNode?r:h4(e):JA,[e]);return E.useEffect(()=>{t.current=e},[e]),n}function B4e(e){const[t,n]=E.useState(null),r=E.useRef(e),i=E.useCallback(o=>{const s=z_(o.target);s&&n(a=>a?(a.set(s,Dx(s)),new Map(a)):null)},[]);return E.useEffect(()=>{const o=r.current;if(e!==o){s(o);const a=e.map(l=>{const u=z_(l);return u?(u.addEventListener("scroll",i,{passive:!0}),[u,Dx(u)]):null}).filter(l=>l!=null);n(a.length?new Map(a):null),r.current=e}return()=>{s(e),s(o)};function s(a){a.forEach(l=>{const u=z_(l);u==null||u.removeEventListener("scroll",i)})}},[i,e]),E.useMemo(()=>e.length?t?Array.from(t.values()).reduce((o,s)=>dc(o,s),zi):xj(e):zi,[e,t])}function e9(e,t){t===void 0&&(t=[]);const n=E.useRef(null);return E.useEffect(()=>{n.current=null},t),E.useEffect(()=>{const r=e!==zi;r&&!n.current&&(n.current=e),!r&&n.current&&(n.current=null)},[e]),n.current?w0(e,n.current):zi}function j4e(e){E.useEffect(()=>{if(!xb)return;const t=e.map(n=>{let{sensor:r}=n;return r.setup==null?void 0:r.setup()});return()=>{for(const n of t)n==null||n()}},e.map(t=>{let{sensor:n}=t;return n}))}function V4e(e,t){return E.useMemo(()=>e.reduce((n,r)=>{let{eventName:i,handler:o}=r;return n[i]=s=>{o(s,t)},n},{}),[e,t])}function Oj(e){return E.useMemo(()=>e?p4e(e):null,[e])}const H_=[];function z4e(e,t){t===void 0&&(t=jp);const[n]=e,r=Oj(n?mr(n):null),[i,o]=E.useReducer(a,H_),s=Eb({callback:o});return e.length>0&&i===H_&&o(),ko(()=>{e.length?e.forEach(l=>s==null?void 0:s.observe(l)):(s==null||s.disconnect(),o())},[e]),i;function a(){return e.length?e.map(l=>_j(l)?r:new p4(t(l),l)):H_}}function Rj(e){if(!e)return null;if(e.children.length>1)return e;const t=e.children[0];return Fp(t)?t:e}function U4e(e){let{measure:t}=e;const[n,r]=E.useState(null),i=E.useCallback(u=>{for(const{target:c}of u)if(Fp(c)){r(d=>{const f=t(c);return d?{...d,width:f.width,height:f.height}:f});break}},[t]),o=Eb({callback:i}),s=E.useCallback(u=>{const c=Rj(u);o==null||o.disconnect(),c&&(o==null||o.observe(c)),r(c?t(c):null)},[t,o]),[a,l]=S0(s);return E.useMemo(()=>({nodeRef:a,rect:n,setRef:l}),[n,a,l])}const G4e=[{sensor:Pj,options:{}},{sensor:Ej,options:{}}],H4e={current:{}},Lm={draggable:{measure:WA},droppable:{measure:WA,strategy:Uh.WhileDragging,frequency:$x.Optimized},dragOverlay:{measure:jp}};class _f extends Map{get(t){var n;return t!=null&&(n=super.get(t))!=null?n:void 0}toArray(){return Array.from(this.values())}getEnabled(){return this.toArray().filter(t=>{let{disabled:n}=t;return!n})}getNodeFor(t){var n,r;return(n=(r=this.get(t))==null?void 0:r.node.current)!=null?n:void 0}}const q4e={activatorEvent:null,active:null,activeNode:null,activeNodeRect:null,collisions:null,containerNodeRect:null,draggableNodes:new Map,droppableRects:new Map,droppableContainers:new _f,over:null,dragOverlay:{nodeRef:{current:null},rect:null,setRef:x0},scrollableAncestors:[],scrollableAncestorRects:[],measuringConfiguration:Lm,measureDroppableContainers:x0,windowRect:null,measuringScheduled:!1},Ij={activatorEvent:null,activators:[],active:null,activeNodeRect:null,ariaDescribedById:{draggable:""},dispatch:x0,draggableNodes:new Map,over:null,measureDroppableContainers:x0},Vp=E.createContext(Ij),Mj=E.createContext(q4e);function W4e(){return{draggable:{active:null,initialCoordinates:{x:0,y:0},nodes:new Map,translate:{x:0,y:0}},droppable:{containers:new _f}}}function K4e(e,t){switch(t.type){case cn.DragStart:return{...e,draggable:{...e.draggable,initialCoordinates:t.initialCoordinates,active:t.active}};case cn.DragMove:return e.draggable.active?{...e,draggable:{...e.draggable,translate:{x:t.coordinates.x-e.draggable.initialCoordinates.x,y:t.coordinates.y-e.draggable.initialCoordinates.y}}}:e;case cn.DragEnd:case cn.DragCancel:return{...e,draggable:{...e.draggable,active:null,initialCoordinates:{x:0,y:0},translate:{x:0,y:0}}};case cn.RegisterDroppable:{const{element:n}=t,{id:r}=n,i=new _f(e.droppable.containers);return i.set(r,n),{...e,droppable:{...e.droppable,containers:i}}}case cn.SetDroppableDisabled:{const{id:n,key:r,disabled:i}=t,o=e.droppable.containers.get(n);if(!o||r!==o.key)return e;const s=new _f(e.droppable.containers);return s.set(n,{...o,disabled:i}),{...e,droppable:{...e.droppable,containers:s}}}case cn.UnregisterDroppable:{const{id:n,key:r}=t,i=e.droppable.containers.get(n);if(!i||r!==i.key)return e;const o=new _f(e.droppable.containers);return o.delete(n),{...e,droppable:{...e.droppable,containers:o}}}default:return e}}function Y4e(e){let{disabled:t}=e;const{active:n,activatorEvent:r,draggableNodes:i}=E.useContext(Vp),o=_0(r),s=_0(n==null?void 0:n.id);return E.useEffect(()=>{if(!t&&!r&&o&&s!=null){if(!f4(o)||document.activeElement===o.target)return;const a=i.get(s);if(!a)return;const{activatorNode:l,node:u}=a;if(!l.current&&!u.current)return;requestAnimationFrame(()=>{for(const c of[l.current,u.current]){if(!c)continue;const d=V3e(c);if(d){d.focus();break}}})}},[r,t,i,s,o]),null}function Nj(e,t){let{transform:n,...r}=t;return e!=null&&e.length?e.reduce((i,o)=>o({transform:i,...r}),n):n}function X4e(e){return E.useMemo(()=>({draggable:{...Lm.draggable,...e==null?void 0:e.draggable},droppable:{...Lm.droppable,...e==null?void 0:e.droppable},dragOverlay:{...Lm.dragOverlay,...e==null?void 0:e.dragOverlay}}),[e==null?void 0:e.draggable,e==null?void 0:e.droppable,e==null?void 0:e.dragOverlay])}function Q4e(e){let{activeNode:t,measure:n,initialRect:r,config:i=!0}=e;const o=E.useRef(!1),{x:s,y:a}=typeof i=="boolean"?{x:i,y:i}:i;ko(()=>{if(!s&&!a||!t){o.current=!1;return}if(o.current||!r)return;const u=t==null?void 0:t.node.current;if(!u||u.isConnected===!1)return;const c=n(u),d=mj(c,r);if(s||(d.x=0),a||(d.y=0),o.current=!0,Math.abs(d.x)>0||Math.abs(d.y)>0){const f=vj(u);f&&f.scrollBy({top:d.y,left:d.x})}},[t,s,a,r,n])}const Pb=E.createContext({...zi,scaleX:1,scaleY:1});var zs;(function(e){e[e.Uninitialized=0]="Uninitialized",e[e.Initializing=1]="Initializing",e[e.Initialized=2]="Initialized"})(zs||(zs={}));const Z4e=E.memo(function(t){var n,r,i,o;let{id:s,accessibility:a,autoScroll:l=!0,children:u,sensors:c=G4e,collisionDetection:d=s4e,measuring:f,modifiers:h,...p}=t;const m=E.useReducer(K4e,void 0,W4e),[S,v]=m,[y,g]=K3e(),[b,_]=E.useState(zs.Uninitialized),w=b===zs.Initialized,{draggable:{active:x,nodes:C,translate:k},droppable:{containers:P}}=S,A=x?C.get(x):null,$=E.useRef({initial:null,translated:null}),N=E.useMemo(()=>{var ct;return x!=null?{id:x,data:(ct=A==null?void 0:A.data)!=null?ct:H4e,rect:$}:null},[x,A]),T=E.useRef(null),[O,I]=E.useState(null),[M,R]=E.useState(null),D=jh(p,Object.values(p)),L=Tb("DndDescribedBy",s),V=E.useMemo(()=>P.getEnabled(),[P]),z=X4e(f),{droppableRects:U,measureDroppableContainers:K,measuringScheduled:W}=M4e(V,{dragging:w,dependencies:[k.x,k.y],config:z.droppable}),X=R4e(C,x),F=E.useMemo(()=>M?Vh(M):null,[M]),q=$o(),Q=N4e(X,z.draggable.measure);Q4e({activeNode:x?C.get(x):null,config:q.layoutShiftCompensation,initialRect:Q,measure:z.draggable.measure});const J=ZA(X,z.draggable.measure,Q),ne=ZA(X?X.parentElement:null),Z=E.useRef({activatorEvent:null,active:null,activeNode:X,collisionRect:null,collisions:null,droppableRects:U,draggableNodes:C,draggingNode:null,draggingNodeRect:null,droppableContainers:P,over:null,scrollableAncestors:[],scrollAdjustedTranslate:null}),me=P.getNodeFor((n=Z.current.over)==null?void 0:n.id),ae=U4e({measure:z.dragOverlay.measure}),oe=(r=ae.nodeRef.current)!=null?r:X,Ce=w?(i=ae.rect)!=null?i:J:null,se=!!(ae.nodeRef.current&&ae.rect),qe=$4e(se?null:J),yt=Oj(oe?mr(oe):null),$e=F4e(w?me??X:null),Fe=z4e($e),Ie=Nj(h,{transform:{x:k.x-qe.x,y:k.y-qe.y,scaleX:1,scaleY:1},activatorEvent:M,active:N,activeNodeRect:J,containerNodeRect:ne,draggingNodeRect:Ce,over:Z.current.over,overlayNodeRect:ae.rect,scrollableAncestors:$e,scrollableAncestorRects:Fe,windowRect:yt}),nt=F?dc(F,k):null,xt=B4e($e),yn=e9(xt),an=e9(xt,[J]),Ot=dc(Ie,yn),ee=Ce?d4e(Ce,Ie):null,Se=N&&ee?d({active:N,collisionRect:ee,droppableRects:U,droppableContainers:V,pointerCoordinates:nt}):null,Te=i4e(Se,"id"),[Me,ie]=E.useState(null),pe=se?Ie:dc(Ie,an),Qt=u4e(pe,(o=Me==null?void 0:Me.rect)!=null?o:null,J),Rt=E.useCallback((ct,We)=>{let{sensor:On,options:vn}=We;if(T.current==null)return;const Hn=C.get(T.current);if(!Hn)return;const rr=ct.nativeEvent,yr=new On({active:T.current,activeNode:Hn,event:rr,options:vn,context:Z,onStart(ir){const Rn=T.current;if(Rn==null)return;const Fo=C.get(Rn);if(!Fo)return;const{onDragStart:Es}=D.current,Ps={active:{id:Rn,data:Fo.data,rect:$}};li.unstable_batchedUpdates(()=>{Es==null||Es(Ps),_(zs.Initializing),v({type:cn.DragStart,initialCoordinates:ir,active:Rn}),y({type:"onDragStart",event:Ps})})},onMove(ir){v({type:cn.DragMove,coordinates:ir})},onEnd:Hi(cn.DragEnd),onCancel:Hi(cn.DragCancel)});li.unstable_batchedUpdates(()=>{I(yr),R(ct.nativeEvent)});function Hi(ir){return async function(){const{active:Fo,collisions:Es,over:Ps,scrollAdjustedTranslate:Zl}=Z.current;let Bo=null;if(Fo&&Zl){const{cancelDrop:or}=D.current;Bo={activatorEvent:rr,active:Fo,collisions:Es,delta:Zl,over:Ps},ir===cn.DragEnd&&typeof or=="function"&&await Promise.resolve(or(Bo))&&(ir=cn.DragCancel)}T.current=null,li.unstable_batchedUpdates(()=>{v({type:ir}),_(zs.Uninitialized),ie(null),I(null),R(null);const or=ir===cn.DragEnd?"onDragEnd":"onDragCancel";if(Bo){const Fa=D.current[or];Fa==null||Fa(Bo),y({type:or,event:Bo})}})}}},[C]),ut=E.useCallback((ct,We)=>(On,vn)=>{const Hn=On.nativeEvent,rr=C.get(vn);if(T.current!==null||!rr||Hn.dndKit||Hn.defaultPrevented)return;const yr={active:rr};ct(On,We.options,yr)===!0&&(Hn.dndKit={capturedBy:We.sensor},T.current=vn,Rt(On,We))},[C,Rt]),nr=I4e(c,ut);j4e(c),ko(()=>{J&&b===zs.Initializing&&_(zs.Initialized)},[J,b]),E.useEffect(()=>{const{onDragMove:ct}=D.current,{active:We,activatorEvent:On,collisions:vn,over:Hn}=Z.current;if(!We||!On)return;const rr={active:We,activatorEvent:On,collisions:vn,delta:{x:Ot.x,y:Ot.y},over:Hn};li.unstable_batchedUpdates(()=>{ct==null||ct(rr),y({type:"onDragMove",event:rr})})},[Ot.x,Ot.y]),E.useEffect(()=>{const{active:ct,activatorEvent:We,collisions:On,droppableContainers:vn,scrollAdjustedTranslate:Hn}=Z.current;if(!ct||T.current==null||!We||!Hn)return;const{onDragOver:rr}=D.current,yr=vn.get(Te),Hi=yr&&yr.rect.current?{id:yr.id,rect:yr.rect.current,data:yr.data,disabled:yr.disabled}:null,ir={active:ct,activatorEvent:We,collisions:On,delta:{x:Hn.x,y:Hn.y},over:Hi};li.unstable_batchedUpdates(()=>{ie(Hi),rr==null||rr(ir),y({type:"onDragOver",event:ir})})},[Te]),ko(()=>{Z.current={activatorEvent:M,active:N,activeNode:X,collisionRect:ee,collisions:Se,droppableRects:U,draggableNodes:C,draggingNode:oe,draggingNodeRect:Ce,droppableContainers:P,over:Me,scrollableAncestors:$e,scrollAdjustedTranslate:Ot},$.current={initial:Ce,translated:ee}},[N,X,Se,ee,C,oe,Ce,U,P,Me,$e,Ot]),k4e({...q,delta:k,draggingRect:ee,pointerCoordinates:nt,scrollableAncestors:$e,scrollableAncestorRects:Fe});const Lo=E.useMemo(()=>({active:N,activeNode:X,activeNodeRect:J,activatorEvent:M,collisions:Se,containerNodeRect:ne,dragOverlay:ae,draggableNodes:C,droppableContainers:P,droppableRects:U,over:Me,measureDroppableContainers:K,scrollableAncestors:$e,scrollableAncestorRects:Fe,measuringConfiguration:z,measuringScheduled:W,windowRect:yt}),[N,X,J,M,Se,ne,ae,C,P,U,Me,K,$e,Fe,z,W,yt]),Xr=E.useMemo(()=>({activatorEvent:M,activators:nr,active:N,activeNodeRect:J,ariaDescribedById:{draggable:L},dispatch:v,draggableNodes:C,over:Me,measureDroppableContainers:K}),[M,nr,N,J,v,L,C,Me,K]);return Ve.createElement(gj.Provider,{value:g},Ve.createElement(Vp.Provider,{value:Xr},Ve.createElement(Mj.Provider,{value:Lo},Ve.createElement(Pb.Provider,{value:Qt},u)),Ve.createElement(Y4e,{disabled:(a==null?void 0:a.restoreFocus)===!1})),Ve.createElement(Q3e,{...a,hiddenTextDescribedById:L}));function $o(){const ct=(O==null?void 0:O.autoScrollEnabled)===!1,We=typeof l=="object"?l.enabled===!1:l===!1,On=w&&!ct&&!We;return typeof l=="object"?{...l,enabled:On}:{enabled:On}}}),J4e=E.createContext(null),t9="button",eTe="Droppable";function tTe(e){let{id:t,data:n,disabled:r=!1,attributes:i}=e;const o=Tb(eTe),{activators:s,activatorEvent:a,active:l,activeNodeRect:u,ariaDescribedById:c,draggableNodes:d,over:f}=E.useContext(Vp),{role:h=t9,roleDescription:p="draggable",tabIndex:m=0}=i??{},S=(l==null?void 0:l.id)===t,v=E.useContext(S?Pb:J4e),[y,g]=S0(),[b,_]=S0(),w=V4e(s,t),x=jh(n);ko(()=>(d.set(t,{id:t,key:o,node:y,activatorNode:b,data:x}),()=>{const k=d.get(t);k&&k.key===o&&d.delete(t)}),[d,t]);const C=E.useMemo(()=>({role:h,tabIndex:m,"aria-disabled":r,"aria-pressed":S&&h===t9?!0:void 0,"aria-roledescription":p,"aria-describedby":c.draggable}),[r,h,m,S,p,c.draggable]);return{active:l,activatorEvent:a,activeNodeRect:u,attributes:C,isDragging:S,listeners:r?void 0:w,node:y,over:f,setNodeRef:g,setActivatorNodeRef:_,transform:v}}function nTe(){return E.useContext(Mj)}const rTe="Droppable",iTe={timeout:25};function oTe(e){let{data:t,disabled:n=!1,id:r,resizeObserverConfig:i}=e;const o=Tb(rTe),{active:s,dispatch:a,over:l,measureDroppableContainers:u}=E.useContext(Vp),c=E.useRef({disabled:n}),d=E.useRef(!1),f=E.useRef(null),h=E.useRef(null),{disabled:p,updateMeasurementsFor:m,timeout:S}={...iTe,...i},v=jh(m??r),y=E.useCallback(()=>{if(!d.current){d.current=!0;return}h.current!=null&&clearTimeout(h.current),h.current=setTimeout(()=>{u(Array.isArray(v.current)?v.current:[v.current]),h.current=null},S)},[S]),g=Eb({callback:y,disabled:p||!s}),b=E.useCallback((C,k)=>{g&&(k&&(g.unobserve(k),d.current=!1),C&&g.observe(C))},[g]),[_,w]=S0(b),x=jh(t);return E.useEffect(()=>{!g||!_.current||(g.disconnect(),d.current=!1,g.observe(_.current))},[_,g]),ko(()=>(a({type:cn.RegisterDroppable,element:{id:r,key:o,disabled:n,node:_,rect:f,data:x}}),()=>a({type:cn.UnregisterDroppable,key:o,id:r})),[r]),E.useEffect(()=>{n!==c.current.disabled&&(a({type:cn.SetDroppableDisabled,id:r,key:o,disabled:n}),c.current.disabled=n)},[r,o,n,a]),{active:s,rect:f,isOver:(l==null?void 0:l.id)===r,node:_,over:l,setNodeRef:w}}function sTe(e){let{animation:t,children:n}=e;const[r,i]=E.useState(null),[o,s]=E.useState(null),a=_0(n);return!n&&!r&&a&&i(a),ko(()=>{if(!o)return;const l=r==null?void 0:r.key,u=r==null?void 0:r.props.id;if(l==null||u==null){i(null);return}Promise.resolve(t(u,o)).then(()=>{i(null)})},[t,r,o]),Ve.createElement(Ve.Fragment,null,n,r?E.cloneElement(r,{ref:s}):null)}const aTe={x:0,y:0,scaleX:1,scaleY:1};function lTe(e){let{children:t}=e;return Ve.createElement(Vp.Provider,{value:Ij},Ve.createElement(Pb.Provider,{value:aTe},t))}const uTe={position:"fixed",touchAction:"none"},cTe=e=>f4(e)?"transform 250ms ease":void 0,dTe=E.forwardRef((e,t)=>{let{as:n,activatorEvent:r,adjustScale:i,children:o,className:s,rect:a,style:l,transform:u,transition:c=cTe}=e;if(!a)return null;const d=i?u:{...u,scaleX:1,scaleY:1},f={...uTe,width:a.width,height:a.height,top:a.top,left:a.left,transform:zh.Transform.toString(d),transformOrigin:i&&r?e4e(r,a):void 0,transition:typeof c=="function"?c(r):c,...l};return Ve.createElement(n,{className:s,style:f,ref:t},o)}),fTe=e=>t=>{let{active:n,dragOverlay:r}=t;const i={},{styles:o,className:s}=e;if(o!=null&&o.active)for(const[a,l]of Object.entries(o.active))l!==void 0&&(i[a]=n.node.style.getPropertyValue(a),n.node.style.setProperty(a,l));if(o!=null&&o.dragOverlay)for(const[a,l]of Object.entries(o.dragOverlay))l!==void 0&&r.node.style.setProperty(a,l);return s!=null&&s.active&&n.node.classList.add(s.active),s!=null&&s.dragOverlay&&r.node.classList.add(s.dragOverlay),function(){for(const[l,u]of Object.entries(i))n.node.style.setProperty(l,u);s!=null&&s.active&&n.node.classList.remove(s.active)}},hTe=e=>{let{transform:{initial:t,final:n}}=e;return[{transform:zh.Transform.toString(t)},{transform:zh.Transform.toString(n)}]},pTe={duration:250,easing:"ease",keyframes:hTe,sideEffects:fTe({styles:{active:{opacity:"0"}}})};function gTe(e){let{config:t,draggableNodes:n,droppableContainers:r,measuringConfiguration:i}=e;return Cb((o,s)=>{if(t===null)return;const a=n.get(o);if(!a)return;const l=a.node.current;if(!l)return;const u=Rj(s);if(!u)return;const{transform:c}=mr(s).getComputedStyle(s),d=yj(c);if(!d)return;const f=typeof t=="function"?t:mTe(t);return Cj(l,i.draggable.measure),f({active:{id:o,data:a.data,node:l,rect:i.draggable.measure(l)},draggableNodes:n,dragOverlay:{node:s,rect:i.dragOverlay.measure(u)},droppableContainers:r,measuringConfiguration:i,transform:d})})}function mTe(e){const{duration:t,easing:n,sideEffects:r,keyframes:i}={...pTe,...e};return o=>{let{active:s,dragOverlay:a,transform:l,...u}=o;if(!t)return;const c={x:a.rect.left-s.rect.left,y:a.rect.top-s.rect.top},d={scaleX:l.scaleX!==1?s.rect.width*l.scaleX/a.rect.width:1,scaleY:l.scaleY!==1?s.rect.height*l.scaleY/a.rect.height:1},f={x:l.x-c.x,y:l.y-c.y,...d},h=i({...u,active:s,dragOverlay:a,transform:{initial:l,final:f}}),[p]=h,m=h[h.length-1];if(JSON.stringify(p)===JSON.stringify(m))return;const S=r==null?void 0:r({active:s,dragOverlay:a,...u}),v=a.node.animate(h,{duration:t,easing:n,fill:"forwards"});return new Promise(y=>{v.onfinish=()=>{S==null||S(),y()}})}}let n9=0;function yTe(e){return E.useMemo(()=>{if(e!=null)return n9++,n9},[e])}const vTe=Ve.memo(e=>{let{adjustScale:t=!1,children:n,dropAnimation:r,style:i,transition:o,modifiers:s,wrapperElement:a="div",className:l,zIndex:u=999}=e;const{activatorEvent:c,active:d,activeNodeRect:f,containerNodeRect:h,draggableNodes:p,droppableContainers:m,dragOverlay:S,over:v,measuringConfiguration:y,scrollableAncestors:g,scrollableAncestorRects:b,windowRect:_}=nTe(),w=E.useContext(Pb),x=yTe(d==null?void 0:d.id),C=Nj(s,{activatorEvent:c,active:d,activeNodeRect:f,containerNodeRect:h,draggingNodeRect:S.rect,over:v,overlayNodeRect:S.rect,scrollableAncestors:g,scrollableAncestorRects:b,transform:w,windowRect:_}),k=m4(f),P=gTe({config:r,draggableNodes:p,droppableContainers:m,measuringConfiguration:y}),A=k?S.setRef:void 0;return Ve.createElement(lTe,null,Ve.createElement(sTe,{animation:P},d&&x?Ve.createElement(dTe,{key:x,id:d.id,ref:A,as:a,activatorEvent:c,adjustScale:t,className:l,transition:o,rect:k,style:{zIndex:u,...i},transform:C},n):null))}),bTe=e=>{let{activatorEvent:t,draggingNodeRect:n,transform:r}=e;if(n&&t){const i=Vh(t);if(!i)return r;const o=i.x-n.left,s=i.y-n.top;return{...r,x:r.x+o-n.width/2,y:r.y+s-n.height/2}}return r},Wg=28,r9={w:Wg,h:Wg,maxW:Wg,maxH:Wg,shadow:"dark-lg",borderRadius:"lg",borderWidth:2,borderStyle:"dashed",borderColor:"base.100",opacity:.5,bg:"base.800",color:"base.50",_dark:{borderColor:"base.200",bg:"base.900",color:"base.100"}},STe=e=>{if(e.dragData){if(e.dragData.payloadType==="IMAGE_DTO"){const{thumbnail_url:t,width:n,height:r}=e.dragData.payload.imageDTO;return j.jsx(X5,{sx:{position:"relative",width:"100%",height:"100%",display:"flex",alignItems:"center",justifyContent:"center",userSelect:"none",cursor:"none"},children:j.jsx(K5,{sx:{...r9},objectFit:"contain",src:t,width:n,height:r})})}return e.dragData.payloadType==="IMAGE_NAMES"?j.jsxs(Q5,{sx:{cursor:"none",userSelect:"none",position:"relative",alignItems:"center",justifyContent:"center",flexDir:"column",...r9},children:[j.jsx(Iw,{children:e.dragData.payload.image_names.length}),j.jsx(Iw,{size:"sm",children:"Images"})]}):null}},_Te=E.memo(STe);function N8e(e){return oTe(e)}function D8e(e){return tTe(e)}const L8e=(e,t)=>{if(!e||!(t!=null&&t.data.current))return!1;const{actionType:n}=e,{payloadType:r}=t.data.current;if(e.id===t.data.current.id)return!1;switch(n){case"SET_CURRENT_IMAGE":return r==="IMAGE_DTO";case"SET_INITIAL_IMAGE":return r==="IMAGE_DTO";case"SET_CONTROLNET_IMAGE":return r==="IMAGE_DTO";case"SET_CANVAS_INITIAL_IMAGE":return r==="IMAGE_DTO";case"SET_NODES_IMAGE":return r==="IMAGE_DTO";case"SET_MULTI_NODES_IMAGE":return r==="IMAGE_DTO"||"IMAGE_NAMES";case"ADD_TO_BATCH":return r==="IMAGE_DTO"||"IMAGE_NAMES";case"MOVE_BOARD":return r==="IMAGE_DTO"||"IMAGE_NAMES";default:return!1}};function wTe(e){return j.jsx(Z4e,{...e})}const xTe=e=>{const[t,n]=E.useState(null),r=Zc(),i=E.useCallback(u=>{const c=u.active.data.current;c&&n(c)},[]),o=E.useCallback(u=>{var f;const c=u.active.data.current,d=(f=u.over)==null?void 0:f.data.current;!c||!d||(r(YF({overData:d,activeData:c})),n(null))},[r]),s=qA(kj,{activationConstraint:{distance:10}}),a=qA(Aj,{activationConstraint:{distance:10}}),l=Z3e(s,a);return j.jsxs(wTe,{onDragStart:i,onDragEnd:o,sensors:l,collisionDetection:l4e,children:[e.children,j.jsx(vTe,{dropAnimation:null,modifiers:[bTe],children:j.jsx(H5,{children:t&&j.jsx(G5.div,{layout:!0,initial:{opacity:0,scale:.7},animate:{opacity:1,scale:1,transition:{duration:.1}},children:j.jsx(_Te,{dragData:t})},"overlay-drag-image")})})]})},CTe=E.memo(xTe),TTe=E.createContext({isOpen:!1,onClose:()=>{},onClickAddToBoard:()=>{},handleAddToBoard:()=>{}}),ETe=e=>{const[t,n]=E.useState(),{isOpen:r,onOpen:i,onClose:o}=jN(),[s,a]=Rbe(),l=E.useCallback(()=>{n(void 0),o()},[o]),u=E.useCallback(d=>{d&&(n(d),i())},[n,i]),c=E.useCallback(d=>{t&&(s({board_id:d,image_name:t.image_name}),l())},[s,l,t]);return j.jsx(TTe.Provider,{value:{isOpen:r,image:t,onClose:l,onClickAddToBoard:u,handleAddToBoard:c},children:e.children})},PTe=at(e=>e.ui,e=>ID[e.activeTab],{memoizeOptions:{equalityCheck:ap}}),$8e=at(e=>e.ui,e=>e.activeTab,{memoizeOptions:{equalityCheck:ap}}),F8e=at(e=>e.ui,e=>e,{memoizeOptions:{equalityCheck:ap}}),Dj=e=>e.canvas,B8e=at([Dj,PTe,Sp],(e,t,n)=>e.layerState.stagingArea.images.length>0||t==="unifiedCanvas"&&n.isProcessing),j8e=e=>e.canvas.layerState.objects.find(Hw),kTe=e=>e.generation,ATe=at([e=>e,kTe,Dj,A1e,Hpe,(e,t)=>t],(e,t,n,r,i,o)=>{const s=t.initialImage?Qa(e,t.initialImage.imageName):void 0,a=(s==null?void 0:s.board_id)===o,l=n.layerState.objects.some(f=>{if(f.kind==="image"){const h=Qa(e,f.imageName);return(h==null?void 0:h.board_id)===o}return!1}),u=r.nodes.some(f=>Xs(f.data.inputs,h=>{if(h.type==="image"&&h.value){const p=Qa(e,h.value.image_name);return(p==null?void 0:p.board_id)===o}return!1})),c=Xs(i.controlNets,f=>{const h=f.controlImage?Qa(e,f.controlImage):void 0,p=f.processedControlImage?Qa(e,f.processedControlImage):void 0;return(h==null?void 0:h.board_id)===o||(p==null?void 0:p.board_id)===o});return{isInitialImage:a,isCanvasImage:l,isNodesImage:u,isControlNetImage:c}},_s),OTe=E.createContext({isOpen:!1,onClose:()=>{},onClickDeleteBoardImages:()=>{},handleDeleteBoardImages:()=>{},handleDeleteBoardOnly:()=>{}}),RTe=e=>{const[t,n]=E.useState(),{isOpen:r,onOpen:i,onClose:o}=jN(),s=Zc(),a=Qf(h=>ATe(h,t==null?void 0:t.board_id)),[l]=Spe(),u=E.useCallback(()=>{n(void 0),o()},[o]),c=E.useCallback(h=>{console.log({board:h}),h&&(n(h),i())},[n,i]),d=E.useCallback(h=>{t&&(s(UF({board:t,imagesUsage:a})),u())},[s,u,t,a]),f=E.useCallback(h=>{t&&(l(h),u())},[l,u,t]);return j.jsx(OTe.Provider,{value:{isOpen:r,board:t,onClose:u,onClickDeleteBoardImages:c,handleDeleteBoardImages:d,handleDeleteBoardOnly:f,imagesUsage:a},children:e.children})},ITe=E.lazy(()=>vR(()=>import("./App-9c3ea767.js"),["./App-9c3ea767.js","./MantineProvider-bb0be923.js","./App-6125620a.css"],import.meta.url)),MTe=E.lazy(()=>vR(()=>import("./ThemeLocaleProvider-529591b4.js"),["./ThemeLocaleProvider-529591b4.js","./MantineProvider-bb0be923.js","./ThemeLocaleProvider-5b992bc7.css"],import.meta.url)),NTe=({apiUrl:e,token:t,config:n,headerComponent:r,middleware:i})=>(E.useEffect(()=>(t&&_h.set(t),e&&wh.set(e),CI(),i&&i.length>0?H2(GA(),...i):H2(GA()),()=>{wh.set(void 0),_h.set(void 0)}),[e,t,i]),j.jsx(Ve.StrictMode,{children:j.jsx(CG,{store:S5e,children:j.jsx(Ve.Suspense,{fallback:j.jsx(x5e,{}),children:j.jsx(MTe,{children:j.jsx(CTe,{children:j.jsx(ETe,{children:j.jsx(RTe,{children:j.jsx(ITe,{config:n,headerComponent:r})})})})})})})})),DTe=E.memo(NTe);q_.createRoot(document.getElementById("root")).render(j.jsx(DTe,{}));export{nEe as $,Tse as A,Ln as B,KTe as C,H5 as D,G5 as E,Mv as F,Oo as G,sEe as H,jl as I,DN as J,Bn as K,nh as L,xy as M,Lu as N,kJ as O,YTe as P,mm as Q,tc as R,Xf as S,lo as T,Rl as U,jG as V,Ve as W,Bse as X,v6 as Y,hte as Z,ay as _,ZC as a,Tue as a$,Ase as a0,aEe as a1,$l as a2,zN as a3,Hse as a4,uEe as a5,lEe as a6,gle as a7,hle as a8,Av as a9,er as aA,Ai as aB,L0e as aC,B0e as aD,Mr as aE,ca as aF,Xi as aG,Eke as aH,Q$ as aI,Q0e as aJ,Pve as aK,qme as aL,Bc as aM,X5 as aN,Q5 as aO,Iw as aP,at as aQ,Sp as aR,PTe as aS,Zc as aT,Qf as aU,Vke as aV,yD as aW,Br as aX,a6e as aY,li as aZ,S5 as a_,up as aa,qie as ab,PN as ac,Fn as ad,vo as ae,zv as af,ZTe as ag,cw as ah,WTe as ai,gm as aj,m6 as ak,Kle as al,$se as am,y6 as an,Ple as ao,Gle as ap,e_ as aq,iu as ar,t_ as as,vg as at,kle as au,cEe as av,vp as aw,_i as ax,Kt as ay,lc as az,r5 as b,hl as b$,s3 as b0,AN as b1,G6e as b2,FCe as b3,N8e as b4,L8e as b5,DR as b6,xk as b7,M8e as b8,cV as b9,yEe as bA,$Ee as bB,gEe as bC,WEe as bD,bEe as bE,AEe as bF,SEe as bG,OEe as bH,CEe as bI,IEe as bJ,d8e as bK,Qbe as bL,TTe as bM,O8e as bN,Qpe as bO,f8e as bP,l8e as bQ,a8e as bR,hL as bS,YPe as bT,zce as bU,Kw as bV,qTe as bW,kue as bX,rke as bY,Q6e as bZ,Z6e as b_,BTe as ba,$Te as bb,FTe as bc,Ne as bd,A8e as be,OTe as bf,H6e as bg,Spe as bh,K5 as bi,_s as bj,U6e as bk,ON as bl,bke as bm,LTe as bn,Hs as bo,D8e as bp,hEe as bq,pEe as br,DEe as bs,LEe as bt,vEe as bu,zEe as bv,mEe as bw,kEe as bx,_Ee as by,Zbe as bz,lW as c,mke as c$,Vv as c0,v1 as c1,h8e as c2,ua as c3,g1 as c4,m1 as c5,W6e as c6,jN as c7,tke as c8,Oue as c9,A4 as cA,D6 as cB,jTe as cC,VTe as cD,vPe as cE,Jke as cF,I8e as cG,e5e as cH,Zke as cI,Gce as cJ,Hke as cK,Uce as cL,lPe as cM,yPe as cN,t8e as cO,wPe as cP,Wke as cQ,OD as cR,iPe as cS,Bke as cT,_Pe as cU,ZCe as cV,sPe as cW,Qa as cX,oke as cY,vke as cZ,gke as c_,eke as ca,J6e as cb,hPe as cc,F8e as cd,ike as ce,B8e as cf,ap as cg,dPe as ch,Jo as ci,IN as cj,MN as ck,Xs as cl,Jpe as cm,Uke as cn,_ke as co,a$ as cp,l$ as cq,o8e as cr,_5e as cs,tr as ct,SPe as cu,n8e as cv,gJ as cw,v5 as cx,N7 as cy,yJ as cz,KQ as d,RD as d$,yke as d0,xke as d1,Cke as d2,c$ as d3,m8e as d4,_l as d5,wke as d6,p5 as d7,fEe as d8,ve as d9,KEe as dA,ePe as dB,NEe as dC,kTe as dD,tPe as dE,nPe as dF,ZEe as dG,JEe as dH,QEe as dI,XEe as dJ,HEe as dK,UEe as dL,Kke as dM,zl as dN,Xke as dO,Ow as dP,eD as dQ,nD as dR,tD as dS,oD as dT,iD as dU,dEe as dV,MEe as dW,Yv as dX,p8e as dY,$ce as dZ,v8e as d_,xEe as da,g8e as db,Ak as dc,dke as dd,x3 as de,zpe as df,wu as dg,Ok as dh,fke as di,hke as dj,UN as dk,pke as dl,Upe as dm,t$ as dn,lke as dp,cke as dq,ske as dr,Hpe as ds,y_e as dt,ake as du,y8e as dv,oo as dw,TEe as dx,Op as dy,rPe as dz,s7 as e,o6e as e$,DD as e0,no as e1,REe as e2,GEe as e3,zTe as e4,FZ as e5,qEe as e6,E8e as e7,w8e as e8,qt as e9,h5 as eA,NF as eB,A1e as eC,Ake as eD,jCe as eE,Pke as eF,kke as eG,Rke as eH,Oke as eI,Ike as eJ,Lke as eK,C1e as eL,OF as eM,fB as eN,IV as eO,De as eP,Dj as eQ,p6e as eR,M6e as eS,I6e as eT,WPe as eU,x6e as eV,D6e as eW,hbe as eX,BPe as eY,u6e as eZ,Bd as e_,ho as ea,i8e as eb,_8e as ec,T8e as ed,r8e as ee,C8e as ef,dZ as eg,x8e as eh,b8e as ei,S8e as ej,SF as ek,Tv as el,P8e as em,s0 as en,ye as eo,k8e as ep,hx as eq,DZ as er,wEe as es,UTe as et,Mke as eu,Nke as ev,Dke as ew,$ke as ex,Fke as ey,Nh as ez,LI as f,s8e as f$,jPe as f0,E1 as f1,l6e as f2,LPe as f3,s6e as f4,$Pe as f5,UPe as f6,EPe as f7,TPe as f8,CPe as f9,XPe as fA,m6e as fB,w6e as fC,y6e as fD,qPe as fE,FPe as fF,A6e as fG,k6e as fH,S6e as fI,v6e as fJ,b6e as fK,j6e as fL,E6e as fM,V6e as fN,r6e as fO,n6e as fP,DPe as fQ,NPe as fR,F6e as fS,KPe as fT,dbe as fU,lbe as fV,ube as fW,cbe as fX,APe as fY,fL as fZ,oPe as f_,N6e as fa,uL as fb,_h as fc,Hw as fd,RPe as fe,IPe as ff,MPe as fg,R6e as fh,HPe as fi,GPe as fj,yhe as fk,O6e as fl,fbe as fm,VPe as fn,QPe as fo,ZPe as fp,qd as fq,g6e as fr,h6e as fs,c6e as ft,PPe as fu,kPe as fv,u8e as fw,c8e as fx,j8e as fy,i6e as fz,VQ as g,jce as g0,YEe as g1,OPe as g2,e6e as g3,B6e as g4,FEe as g5,BEe as g6,jEe as g7,VEe as g8,t6e as g9,$8e as ga,fPe as gb,gPe as gc,pPe as gd,mPe as ge,xPe as gf,BZ as gg,ibe as gh,jke as gi,HTe as gj,j7 as gk,tEe as gl,ite as gm,JTe as gn,XTe as go,eEe as gp,uo as gq,QTe as gr,GTe as gs,dte as gt,Jee as gu,IJ as gv,iEe as gw,oEe as gx,HI as h,Pn as i,Kc as j,sp as k,pn as l,Qc as m,ip as n,ji as o,Aa as p,$I as q,Ao as r,E as s,RS as t,Qe as u,j as v,Si as w,fi as x,ke as y,Gn as z}; diff --git a/invokeai/frontend/web/dist/index.html b/invokeai/frontend/web/dist/index.html index 3e321cd11c..7a405636fe 100644 --- a/invokeai/frontend/web/dist/index.html +++ b/invokeai/frontend/web/dist/index.html @@ -12,7 +12,7 @@ margin: 0; } - + diff --git a/invokeai/frontend/web/dist/locales/en.json b/invokeai/frontend/web/dist/locales/en.json index f3436df5a7..32ff574925 100644 --- a/invokeai/frontend/web/dist/locales/en.json +++ b/invokeai/frontend/web/dist/locales/en.json @@ -119,7 +119,7 @@ "pinGallery": "Pin Gallery", "allImagesLoaded": "All Images Loaded", "loadMore": "Load More", - "noImagesInGallery": "No Images In Gallery", + "noImagesInGallery": "No Images to Display", "deleteImage": "Delete Image", "deleteImageBin": "Deleted images will be sent to your operating system's Bin.", "deleteImagePermanent": "Deleted images cannot be restored.", @@ -343,6 +343,7 @@ "safetensorModels": "SafeTensors", "modelAdded": "Model Added", "modelUpdated": "Model Updated", + "modelUpdateFailed": "Model Update Failed", "modelEntryDeleted": "Model Entry Deleted", "cannotUseSpaces": "Cannot Use Spaces", "addNew": "Add New", @@ -397,8 +398,10 @@ "delete": "Delete", "deleteModel": "Delete Model", "deleteConfig": "Delete Config", - "deleteMsg1": "Are you sure you want to delete this model entry from InvokeAI?", - "deleteMsg2": "This will not delete the model checkpoint file from your disk. You can readd them if you wish to.", + "deleteMsg1": "Are you sure you want to delete this model from InvokeAI?", + "modelDeleted": "Model Deleted", + "modelDeleteFailed": "Failed to delete model", + "deleteMsg2": "This WILL delete the model from disk if it is in the InvokeAI root folder. If you are using a custom location, then the model WILL NOT be deleted from disk.", "formMessageDiffusersModelLocation": "Diffusers Model Location", "formMessageDiffusersModelLocationDesc": "Please enter at least one.", "formMessageDiffusersVAELocation": "VAE Location", @@ -407,11 +410,13 @@ "convertToDiffusers": "Convert To Diffusers", "convertToDiffusersHelpText1": "This model will be converted to the 🧨 Diffusers format.", "convertToDiffusersHelpText2": "This process will replace your Model Manager entry with the Diffusers version of the same model.", - "convertToDiffusersHelpText3": "Your checkpoint file on the disk will NOT be deleted or modified in anyway. You can add your checkpoint to the Model Manager again if you want to.", + "convertToDiffusersHelpText3": "Your checkpoint file on disk WILL be deleted if it is in InvokeAI root folder. If it is in a custom location, then it WILL NOT be deleted.", "convertToDiffusersHelpText4": "This is a one time process only. It might take around 30s-60s depending on the specifications of your computer.", - "convertToDiffusersHelpText5": "Please make sure you have enough disk space. Models generally vary between 4GB-7GB in size.", + "convertToDiffusersHelpText5": "Please make sure you have enough disk space. Models generally vary between 2GB-7GB in size.", "convertToDiffusersHelpText6": "Do you wish to convert this model?", "convertToDiffusersSaveLocation": "Save Location", + "noCustomLocationProvided": "No Custom Location Provided", + "convertingModelBegin": "Converting Model. Please wait.", "v1": "v1", "v2_base": "v2 (512px)", "v2_768": "v2 (768px)", @@ -420,12 +425,14 @@ "pathToCustomConfig": "Path To Custom Config", "statusConverting": "Converting", "modelConverted": "Model Converted", + "modelConversionFailed": "Model Conversion Failed", "sameFolder": "Same folder", "invokeRoot": "InvokeAI folder", "custom": "Custom", "customSaveLocation": "Custom Save Location", "merge": "Merge", "modelsMerged": "Models Merged", + "modelsMergeFailed": "Model Merge Failed", "mergeModels": "Merge Models", "modelOne": "Model 1", "modelTwo": "Model 2", @@ -446,7 +453,9 @@ "weightedSum": "Weighted Sum", "none": "none", "addDifference": "Add Difference", - "pickModelType": "Pick Model Type" + "pickModelType": "Pick Model Type", + "selectModel": "Select Model", + "importModels": "Import Models" }, "parameters": { "general": "General", @@ -568,6 +577,7 @@ "uploadFailedInvalidUploadDesc": "Must be single PNG or JPEG image", "downloadImageStarted": "Image Download Started", "imageCopied": "Image Copied", + "problemCopyingImage": "Unable to Copy Image", "imageLinkCopied": "Image Link Copied", "problemCopyingImageLink": "Unable to Copy Image Link", "imageNotLoaded": "No Image Loaded", @@ -684,6 +694,15 @@ "reloadSchema": "Reload Schema", "saveNodes": "Save Nodes", "loadNodes": "Load Nodes", - "clearNodes": "Clear Nodes" + "clearNodes": "Clear Nodes", + "zoomInNodes": "Zoom In", + "zoomOutNodes": "Zoom Out", + "fitViewportNodes": "Fit View", + "hideGraphNodes": "Hide Graph Overlay", + "showGraphNodes": "Show Graph Overlay", + "hideLegendNodes": "Hide Field Type Legend", + "showLegendNodes": "Show Field Type Legend", + "hideMinimapnodes": "Hide MiniMap", + "showMinimapnodes": "Show MiniMap" } } diff --git a/invokeai/frontend/web/public/locales/en.json b/invokeai/frontend/web/public/locales/en.json index f3436df5a7..32ff574925 100644 --- a/invokeai/frontend/web/public/locales/en.json +++ b/invokeai/frontend/web/public/locales/en.json @@ -119,7 +119,7 @@ "pinGallery": "Pin Gallery", "allImagesLoaded": "All Images Loaded", "loadMore": "Load More", - "noImagesInGallery": "No Images In Gallery", + "noImagesInGallery": "No Images to Display", "deleteImage": "Delete Image", "deleteImageBin": "Deleted images will be sent to your operating system's Bin.", "deleteImagePermanent": "Deleted images cannot be restored.", @@ -343,6 +343,7 @@ "safetensorModels": "SafeTensors", "modelAdded": "Model Added", "modelUpdated": "Model Updated", + "modelUpdateFailed": "Model Update Failed", "modelEntryDeleted": "Model Entry Deleted", "cannotUseSpaces": "Cannot Use Spaces", "addNew": "Add New", @@ -397,8 +398,10 @@ "delete": "Delete", "deleteModel": "Delete Model", "deleteConfig": "Delete Config", - "deleteMsg1": "Are you sure you want to delete this model entry from InvokeAI?", - "deleteMsg2": "This will not delete the model checkpoint file from your disk. You can readd them if you wish to.", + "deleteMsg1": "Are you sure you want to delete this model from InvokeAI?", + "modelDeleted": "Model Deleted", + "modelDeleteFailed": "Failed to delete model", + "deleteMsg2": "This WILL delete the model from disk if it is in the InvokeAI root folder. If you are using a custom location, then the model WILL NOT be deleted from disk.", "formMessageDiffusersModelLocation": "Diffusers Model Location", "formMessageDiffusersModelLocationDesc": "Please enter at least one.", "formMessageDiffusersVAELocation": "VAE Location", @@ -407,11 +410,13 @@ "convertToDiffusers": "Convert To Diffusers", "convertToDiffusersHelpText1": "This model will be converted to the 🧨 Diffusers format.", "convertToDiffusersHelpText2": "This process will replace your Model Manager entry with the Diffusers version of the same model.", - "convertToDiffusersHelpText3": "Your checkpoint file on the disk will NOT be deleted or modified in anyway. You can add your checkpoint to the Model Manager again if you want to.", + "convertToDiffusersHelpText3": "Your checkpoint file on disk WILL be deleted if it is in InvokeAI root folder. If it is in a custom location, then it WILL NOT be deleted.", "convertToDiffusersHelpText4": "This is a one time process only. It might take around 30s-60s depending on the specifications of your computer.", - "convertToDiffusersHelpText5": "Please make sure you have enough disk space. Models generally vary between 4GB-7GB in size.", + "convertToDiffusersHelpText5": "Please make sure you have enough disk space. Models generally vary between 2GB-7GB in size.", "convertToDiffusersHelpText6": "Do you wish to convert this model?", "convertToDiffusersSaveLocation": "Save Location", + "noCustomLocationProvided": "No Custom Location Provided", + "convertingModelBegin": "Converting Model. Please wait.", "v1": "v1", "v2_base": "v2 (512px)", "v2_768": "v2 (768px)", @@ -420,12 +425,14 @@ "pathToCustomConfig": "Path To Custom Config", "statusConverting": "Converting", "modelConverted": "Model Converted", + "modelConversionFailed": "Model Conversion Failed", "sameFolder": "Same folder", "invokeRoot": "InvokeAI folder", "custom": "Custom", "customSaveLocation": "Custom Save Location", "merge": "Merge", "modelsMerged": "Models Merged", + "modelsMergeFailed": "Model Merge Failed", "mergeModels": "Merge Models", "modelOne": "Model 1", "modelTwo": "Model 2", @@ -446,7 +453,9 @@ "weightedSum": "Weighted Sum", "none": "none", "addDifference": "Add Difference", - "pickModelType": "Pick Model Type" + "pickModelType": "Pick Model Type", + "selectModel": "Select Model", + "importModels": "Import Models" }, "parameters": { "general": "General", @@ -568,6 +577,7 @@ "uploadFailedInvalidUploadDesc": "Must be single PNG or JPEG image", "downloadImageStarted": "Image Download Started", "imageCopied": "Image Copied", + "problemCopyingImage": "Unable to Copy Image", "imageLinkCopied": "Image Link Copied", "problemCopyingImageLink": "Unable to Copy Image Link", "imageNotLoaded": "No Image Loaded", @@ -684,6 +694,15 @@ "reloadSchema": "Reload Schema", "saveNodes": "Save Nodes", "loadNodes": "Load Nodes", - "clearNodes": "Clear Nodes" + "clearNodes": "Clear Nodes", + "zoomInNodes": "Zoom In", + "zoomOutNodes": "Zoom Out", + "fitViewportNodes": "Fit View", + "hideGraphNodes": "Hide Graph Overlay", + "showGraphNodes": "Show Graph Overlay", + "hideLegendNodes": "Hide Field Type Legend", + "showLegendNodes": "Show Field Type Legend", + "hideMinimapnodes": "Hide MiniMap", + "showMinimapnodes": "Show MiniMap" } } diff --git a/invokeai/frontend/web/src/app/components/App.tsx b/invokeai/frontend/web/src/app/components/App.tsx index 8628360160..a05266d5f2 100644 --- a/invokeai/frontend/web/src/app/components/App.tsx +++ b/invokeai/frontend/web/src/app/components/App.tsx @@ -6,9 +6,7 @@ import { PartialAppConfig } from 'app/types/invokeai'; import ImageUploader from 'common/components/ImageUploader'; import GalleryDrawer from 'features/gallery/components/GalleryPanel'; import DeleteImageModal from 'features/imageDeletion/components/DeleteImageModal'; -import Lightbox from 'features/lightbox/components/Lightbox'; import SiteHeader from 'features/system/components/SiteHeader'; -import { useFeatureStatus } from 'features/system/hooks/useFeatureStatus'; import { configChanged } from 'features/system/store/configSlice'; import { languageSelector } from 'features/system/store/systemSelectors'; import FloatingGalleryButton from 'features/ui/components/FloatingGalleryButton'; @@ -34,8 +32,6 @@ const App = ({ config = DEFAULT_CONFIG, headerComponent }: Props) => { const log = useLogger(); - const isLightboxEnabled = useFeatureStatus('lightbox').isFeatureEnabled; - const dispatch = useAppDispatch(); useEffect(() => { @@ -54,7 +50,6 @@ const App = ({ config = DEFAULT_CONFIG, headerComponent }: Props) => { return ( <> - {isLightboxEnabled && } state.hotkeys, - (hotkeys) => { + [(state: RootState) => state.hotkeys, (state: RootState) => state.ui], + (hotkeys, ui) => { const { shift } = hotkeys; - return { shift }; + const { shouldPinParametersPanel, shouldPinGallery } = ui; + return { shift, shouldPinGallery, shouldPinParametersPanel }; }, { memoizeOptions: { @@ -34,7 +37,10 @@ const globalHotkeysSelector = createSelector( */ const GlobalHotkeys: React.FC = () => { const dispatch = useAppDispatch(); - const { shift } = useAppSelector(globalHotkeysSelector); + const { shift, shouldPinParametersPanel, shouldPinGallery } = useAppSelector( + globalHotkeysSelector + ); + const activeTabName = useAppSelector(activeTabNameSelector); useHotkeys( '*', @@ -51,18 +57,30 @@ const GlobalHotkeys: React.FC = () => { useHotkeys('o', () => { dispatch(toggleParametersPanel()); + if (activeTabName === 'unifiedCanvas' && shouldPinParametersPanel) { + dispatch(requestCanvasRescale()); + } }); useHotkeys(['shift+o'], () => { dispatch(togglePinParametersPanel()); + if (activeTabName === 'unifiedCanvas') { + dispatch(requestCanvasRescale()); + } }); useHotkeys('g', () => { dispatch(toggleGalleryPanel()); + if (activeTabName === 'unifiedCanvas' && shouldPinGallery) { + dispatch(requestCanvasRescale()); + } }); useHotkeys(['shift+g'], () => { dispatch(togglePinGalleryPanel()); + if (activeTabName === 'unifiedCanvas') { + dispatch(requestCanvasRescale()); + } }); useHotkeys('1', () => { diff --git a/invokeai/frontend/web/src/app/components/ImageDnd/DragPreview.tsx b/invokeai/frontend/web/src/app/components/ImageDnd/DragPreview.tsx index 9fb4bef595..942365848e 100644 --- a/invokeai/frontend/web/src/app/components/ImageDnd/DragPreview.tsx +++ b/invokeai/frontend/web/src/app/components/ImageDnd/DragPreview.tsx @@ -1,8 +1,4 @@ import { Box, ChakraProps, Flex, Heading, Image } from '@chakra-ui/react'; -import { createSelector } from '@reduxjs/toolkit'; -import { stateSelector } from 'app/store/store'; -import { useAppSelector } from 'app/store/storeHooks'; -import { defaultSelectorOptions } from 'app/store/util/defaultMemoizeOptions'; import { memo } from 'react'; import { TypesafeDraggableData } from './typesafeDnd'; @@ -32,24 +28,7 @@ const STYLES: ChakraProps['sx'] = { }, }; -const selector = createSelector( - stateSelector, - (state) => { - const gallerySelectionCount = state.gallery.selection.length; - const batchSelectionCount = state.batch.selection.length; - - return { - gallerySelectionCount, - batchSelectionCount, - }; - }, - defaultSelectorOptions -); - const DragPreview = (props: OverlayDragImageProps) => { - const { gallerySelectionCount, batchSelectionCount } = - useAppSelector(selector); - if (!props.dragData) { return; } @@ -82,7 +61,7 @@ const DragPreview = (props: OverlayDragImageProps) => { ); } - if (props.dragData.payloadType === 'BATCH_SELECTION') { + if (props.dragData.payloadType === 'IMAGE_NAMES') { return ( { ...STYLES, }} > - {batchSelectionCount} - Images - - ); - } - - if (props.dragData.payloadType === 'GALLERY_SELECTION') { - return ( - - {gallerySelectionCount} + {props.dragData.payload.image_names.length} Images ); diff --git a/invokeai/frontend/web/src/app/components/ImageDnd/ImageDndContext.tsx b/invokeai/frontend/web/src/app/components/ImageDnd/ImageDndContext.tsx index 1b8687bf8e..6ce9b06bd9 100644 --- a/invokeai/frontend/web/src/app/components/ImageDnd/ImageDndContext.tsx +++ b/invokeai/frontend/web/src/app/components/ImageDnd/ImageDndContext.tsx @@ -6,18 +6,18 @@ import { useSensor, useSensors, } from '@dnd-kit/core'; +import { snapCenterToCursor } from '@dnd-kit/modifiers'; +import { dndDropped } from 'app/store/middleware/listenerMiddleware/listeners/imageDropped'; +import { useAppDispatch } from 'app/store/storeHooks'; +import { AnimatePresence, motion } from 'framer-motion'; import { PropsWithChildren, memo, useCallback, useState } from 'react'; import DragPreview from './DragPreview'; -import { snapCenterToCursor } from '@dnd-kit/modifiers'; -import { AnimatePresence, motion } from 'framer-motion'; import { DndContext, DragEndEvent, DragStartEvent, TypesafeDraggableData, } from './typesafeDnd'; -import { useAppDispatch } from 'app/store/storeHooks'; -import { imageDropped } from 'app/store/middleware/listenerMiddleware/listeners/imageDropped'; type ImageDndContextProps = PropsWithChildren; @@ -42,18 +42,18 @@ const ImageDndContext = (props: ImageDndContextProps) => { if (!activeData || !overData) { return; } - dispatch(imageDropped({ overData, activeData })); + dispatch(dndDropped({ overData, activeData })); setActiveDragData(null); }, [dispatch] ); const mouseSensor = useSensor(MouseSensor, { - activationConstraint: { delay: 150, tolerance: 5 }, + activationConstraint: { distance: 10 }, }); const touchSensor = useSensor(TouchSensor, { - activationConstraint: { delay: 150, tolerance: 5 }, + activationConstraint: { distance: 10 }, }); // TODO: Use KeyboardSensor - needs composition of multiple collisionDetection algos diff --git a/invokeai/frontend/web/src/app/components/ImageDnd/typesafeDnd.tsx b/invokeai/frontend/web/src/app/components/ImageDnd/typesafeDnd.tsx index 1478ace748..003142390f 100644 --- a/invokeai/frontend/web/src/app/components/ImageDnd/typesafeDnd.tsx +++ b/invokeai/frontend/web/src/app/components/ImageDnd/typesafeDnd.tsx @@ -77,18 +77,14 @@ export type ImageDraggableData = BaseDragData & { payload: { imageDTO: ImageDTO }; }; -export type GallerySelectionDraggableData = BaseDragData & { - payloadType: 'GALLERY_SELECTION'; -}; - -export type BatchSelectionDraggableData = BaseDragData & { - payloadType: 'BATCH_SELECTION'; +export type ImageNamesDraggableData = BaseDragData & { + payloadType: 'IMAGE_NAMES'; + payload: { image_names: string[] }; }; export type TypesafeDraggableData = | ImageDraggableData - | GallerySelectionDraggableData - | BatchSelectionDraggableData; + | ImageNamesDraggableData; interface UseDroppableTypesafeArguments extends Omit { @@ -159,13 +155,11 @@ export const isValidDrop = ( case 'SET_NODES_IMAGE': return payloadType === 'IMAGE_DTO'; case 'SET_MULTI_NODES_IMAGE': - return payloadType === 'IMAGE_DTO' || 'GALLERY_SELECTION'; + return payloadType === 'IMAGE_DTO' || 'IMAGE_NAMES'; case 'ADD_TO_BATCH': - return payloadType === 'IMAGE_DTO' || 'GALLERY_SELECTION'; + return payloadType === 'IMAGE_DTO' || 'IMAGE_NAMES'; case 'MOVE_BOARD': - return ( - payloadType === 'IMAGE_DTO' || 'GALLERY_SELECTION' || 'BATCH_SELECTION' - ); + return payloadType === 'IMAGE_DTO' || 'IMAGE_NAMES'; default: return false; } diff --git a/invokeai/frontend/web/src/app/components/ThemeLocaleProvider.tsx b/invokeai/frontend/web/src/app/components/ThemeLocaleProvider.tsx index 1e86e0ce1b..621b196ae0 100644 --- a/invokeai/frontend/web/src/app/components/ThemeLocaleProvider.tsx +++ b/invokeai/frontend/web/src/app/components/ThemeLocaleProvider.tsx @@ -9,9 +9,9 @@ import { theme as invokeAITheme } from 'theme/theme'; import '@fontsource-variable/inter'; import { MantineProvider } from '@mantine/core'; -import { mantineTheme } from 'mantine-theme/theme'; import 'overlayscrollbars/overlayscrollbars.css'; import 'theme/css/overlayscrollbars.css'; +import { useMantineTheme } from 'mantine-theme/theme'; type ThemeLocaleProviderProps = { children: ReactNode; @@ -35,8 +35,10 @@ function ThemeLocaleProvider({ children }: ThemeLocaleProviderProps) { document.body.dir = direction; }, [direction]); + const mantineTheme = useMantineTheme(); + return ( - + {children} diff --git a/invokeai/frontend/web/src/app/constants.ts b/invokeai/frontend/web/src/app/constants.ts index 5fd413d915..c52e3bd48f 100644 --- a/invokeai/frontend/web/src/app/constants.ts +++ b/invokeai/frontend/web/src/app/constants.ts @@ -1,6 +1,7 @@ -import { SchedulerParam } from 'features/parameters/store/parameterZodSchemas'; - // zod needs the array to be `as const` to infer the type correctly + +import { SchedulerParam } from 'features/parameters/types/parameterSchemas'; + // this is the source of the `SchedulerParam` type, which is generated by zod export const SCHEDULER_NAMES_AS_CONST = [ 'euler', @@ -58,15 +59,8 @@ export const SCHEDULER_LABEL_MAP: Record = { export type Scheduler = (typeof SCHEDULER_NAMES)[number]; -// Valid upscaling levels -export const UPSCALING_LEVELS: Array<{ label: string; value: string }> = [ - { label: '2x', value: '2' }, - { label: '4x', value: '4' }, -]; export const NUMPY_RAND_MIN = 0; export const NUMPY_RAND_MAX = 2147483647; -export const FACETOOL_TYPES = ['gfpgan', 'codeformer'] as const; - export const NODE_MIN_WIDTH = 250; diff --git a/invokeai/frontend/web/src/app/socketio/actions.ts b/invokeai/frontend/web/src/app/socketio/actions.ts deleted file mode 100644 index bb2a0dd0cb..0000000000 --- a/invokeai/frontend/web/src/app/socketio/actions.ts +++ /dev/null @@ -1,67 +0,0 @@ -// import { createAction } from '@reduxjs/toolkit'; -// import * as InvokeAI from 'app/types/invokeai'; -// import { GalleryCategory } from 'features/gallery/store/gallerySlice'; -// import { InvokeTabName } from 'features/ui/store/tabMap'; - -// /** -// * We can't use redux-toolkit's createSlice() to make these actions, -// * because they have no associated reducer. They only exist to dispatch -// * requests to the server via socketio. These actions will be handled -// * by the middleware. -// */ - -// export const generateImage = createAction( -// 'socketio/generateImage' -// ); -// export const runESRGAN = createAction('socketio/runESRGAN'); -// export const runFacetool = createAction( -// 'socketio/runFacetool' -// ); -// export const deleteImage = createAction( -// 'socketio/deleteImage' -// ); -// export const requestImages = createAction( -// 'socketio/requestImages' -// ); -// export const requestNewImages = createAction( -// 'socketio/requestNewImages' -// ); -// export const cancelProcessing = createAction( -// 'socketio/cancelProcessing' -// ); - -// export const requestSystemConfig = createAction( -// 'socketio/requestSystemConfig' -// ); - -// export const searchForModels = createAction('socketio/searchForModels'); - -// export const addNewModel = createAction< -// InvokeAI.InvokeModelConfigProps | InvokeAI.InvokeDiffusersModelConfigProps -// >('socketio/addNewModel'); - -// export const deleteModel = createAction('socketio/deleteModel'); - -// export const convertToDiffusers = -// createAction( -// 'socketio/convertToDiffusers' -// ); - -// export const mergeDiffusersModels = -// createAction( -// 'socketio/mergeDiffusersModels' -// ); - -// export const requestModelChange = createAction( -// 'socketio/requestModelChange' -// ); - -// export const saveStagingAreaImageToGallery = createAction( -// 'socketio/saveStagingAreaImageToGallery' -// ); - -// export const emptyTempFolder = createAction( -// 'socketio/requestEmptyTempFolder' -// ); - -export default {}; diff --git a/invokeai/frontend/web/src/app/socketio/emitters.ts b/invokeai/frontend/web/src/app/socketio/emitters.ts deleted file mode 100644 index 8ed46cbc82..0000000000 --- a/invokeai/frontend/web/src/app/socketio/emitters.ts +++ /dev/null @@ -1,209 +0,0 @@ -import { AnyAction, Dispatch, MiddlewareAPI } from '@reduxjs/toolkit'; -import * as InvokeAI from 'app/types/invokeai'; -import type { RootState } from 'app/store/store'; -import { - frontendToBackendParameters, - FrontendToBackendParametersConfig, -} from 'common/util/parameterTranslation'; -import dateFormat from 'dateformat'; -import { - GalleryCategory, - GalleryState, - removeImage, -} from 'features/gallery/store/gallerySlice'; -import { - generationRequested, - modelChangeRequested, - modelConvertRequested, - modelMergingRequested, - setIsProcessing, -} from 'features/system/store/systemSlice'; -import { InvokeTabName } from 'features/ui/store/tabMap'; -import { Socket } from 'socket.io-client'; - -/** - * Returns an object containing all functions which use `socketio.emit()`. - * i.e. those which make server requests. - */ -const makeSocketIOEmitters = ( - store: MiddlewareAPI, RootState>, - socketio: Socket -) => { - // We need to dispatch actions to redux and get pieces of state from the store. - const { dispatch, getState } = store; - - return { - emitGenerateImage: (generationMode: InvokeTabName) => { - dispatch(setIsProcessing(true)); - - const state: RootState = getState(); - - const { - generation: generationState, - postprocessing: postprocessingState, - system: systemState, - canvas: canvasState, - } = state; - - const frontendToBackendParametersConfig: FrontendToBackendParametersConfig = - { - generationMode, - generationState, - postprocessingState, - canvasState, - systemState, - }; - - dispatch(generationRequested()); - - const { generationParameters, esrganParameters, facetoolParameters } = - frontendToBackendParameters(frontendToBackendParametersConfig); - - socketio.emit( - 'generateImage', - generationParameters, - esrganParameters, - facetoolParameters - ); - - // we need to truncate the init_mask base64 else it takes up the whole log - // TODO: handle maintaining masks for reproducibility in future - if (generationParameters.init_mask) { - generationParameters.init_mask = generationParameters.init_mask - .substr(0, 64) - .concat('...'); - } - if (generationParameters.init_img) { - generationParameters.init_img = generationParameters.init_img - .substr(0, 64) - .concat('...'); - } - - dispatch( - addLogEntry({ - timestamp: dateFormat(new Date(), 'isoDateTime'), - message: `Image generation requested: ${JSON.stringify({ - ...generationParameters, - ...esrganParameters, - ...facetoolParameters, - })}`, - }) - ); - }, - emitRunESRGAN: (imageToProcess: InvokeAI._Image) => { - dispatch(setIsProcessing(true)); - - const { - postprocessing: { - upscalingLevel, - upscalingDenoising, - upscalingStrength, - }, - } = getState(); - - const esrganParameters = { - upscale: [upscalingLevel, upscalingDenoising, upscalingStrength], - }; - socketio.emit('runPostprocessing', imageToProcess, { - type: 'esrgan', - ...esrganParameters, - }); - dispatch( - addLogEntry({ - timestamp: dateFormat(new Date(), 'isoDateTime'), - message: `ESRGAN upscale requested: ${JSON.stringify({ - file: imageToProcess.url, - ...esrganParameters, - })}`, - }) - ); - }, - emitRunFacetool: (imageToProcess: InvokeAI._Image) => { - dispatch(setIsProcessing(true)); - - const { - postprocessing: { facetoolType, facetoolStrength, codeformerFidelity }, - } = getState(); - - const facetoolParameters: Record = { - facetool_strength: facetoolStrength, - }; - - if (facetoolType === 'codeformer') { - facetoolParameters.codeformer_fidelity = codeformerFidelity; - } - - socketio.emit('runPostprocessing', imageToProcess, { - type: facetoolType, - ...facetoolParameters, - }); - dispatch( - addLogEntry({ - timestamp: dateFormat(new Date(), 'isoDateTime'), - message: `Face restoration (${facetoolType}) requested: ${JSON.stringify( - { - file: imageToProcess.url, - ...facetoolParameters, - } - )}`, - }) - ); - }, - emitDeleteImage: (imageToDelete: InvokeAI._Image) => { - const { url, uuid, category, thumbnail } = imageToDelete; - dispatch(removeImage(imageToDelete)); - socketio.emit('deleteImage', url, thumbnail, uuid, category); - }, - emitRequestImages: (category: GalleryCategory) => { - const gallery: GalleryState = getState().gallery; - const { earliest_mtime } = gallery.categories[category]; - socketio.emit('requestImages', category, earliest_mtime); - }, - emitRequestNewImages: (category: GalleryCategory) => { - const gallery: GalleryState = getState().gallery; - const { latest_mtime } = gallery.categories[category]; - socketio.emit('requestLatestImages', category, latest_mtime); - }, - emitCancelProcessing: () => { - socketio.emit('cancel'); - }, - emitRequestSystemConfig: () => { - socketio.emit('requestSystemConfig'); - }, - emitSearchForModels: (modelFolder: string) => { - socketio.emit('searchForModels', modelFolder); - }, - emitAddNewModel: (modelConfig: InvokeAI.InvokeModelConfigProps) => { - socketio.emit('addNewModel', modelConfig); - }, - emitDeleteModel: (modelName: string) => { - socketio.emit('deleteModel', modelName); - }, - emitConvertToDiffusers: ( - modelToConvert: InvokeAI.InvokeModelConversionProps - ) => { - dispatch(modelConvertRequested()); - socketio.emit('convertToDiffusers', modelToConvert); - }, - emitMergeDiffusersModels: ( - modelMergeInfo: InvokeAI.InvokeModelMergingProps - ) => { - dispatch(modelMergingRequested()); - socketio.emit('mergeDiffusersModels', modelMergeInfo); - }, - emitRequestModelChange: (modelName: string) => { - dispatch(modelChangeRequested()); - socketio.emit('requestModelChange', modelName); - }, - emitSaveStagingAreaImageToGallery: (url: string) => { - socketio.emit('requestSaveStagingAreaImageToGallery', url); - }, - emitRequestEmptyTempFolder: () => { - socketio.emit('requestEmptyTempFolder'); - }, - }; -}; - -export default makeSocketIOEmitters; - -export default {}; diff --git a/invokeai/frontend/web/src/app/socketio/listeners.ts b/invokeai/frontend/web/src/app/socketio/listeners.ts deleted file mode 100644 index cb6db260fc..0000000000 --- a/invokeai/frontend/web/src/app/socketio/listeners.ts +++ /dev/null @@ -1,502 +0,0 @@ -// import { AnyAction, Dispatch, MiddlewareAPI } from '@reduxjs/toolkit'; -// import dateFormat from 'dateformat'; -// import i18n from 'i18n'; -// import { v4 as uuidv4 } from 'uuid'; - -// import * as InvokeAI from 'app/types/invokeai'; - -// import { -// addToast, -// errorOccurred, -// processingCanceled, -// setCurrentStatus, -// setFoundModels, -// setIsCancelable, -// setIsConnected, -// setIsProcessing, -// setModelList, -// setSearchFolder, -// setSystemConfig, -// setSystemStatus, -// } from 'features/system/store/systemSlice'; - -// import { -// addGalleryImages, -// addImage, -// clearIntermediateImage, -// GalleryState, -// removeImage, -// setIntermediateImage, -// } from 'features/gallery/store/gallerySlice'; - -// import type { RootState } from 'app/store/store'; -// import { addImageToStagingArea } from 'features/canvas/store/canvasSlice'; -// import { -// clearInitialImage, -// initialImageSelected, -// setInfillMethod, -// // setInitialImage, -// setMaskPath, -// } from 'features/parameters/store/generationSlice'; -// import { tabMap } from 'features/ui/store/tabMap'; -// import { -// requestImages, -// requestNewImages, -// requestSystemConfig, -// } from './actions'; - -// /** -// * Returns an object containing listener callbacks for socketio events. -// * TODO: This file is large, but simple. Should it be split up further? -// */ -// const makeSocketIOListeners = ( -// store: MiddlewareAPI, RootState> -// ) => { -// const { dispatch, getState } = store; - -// return { -// /** -// * Callback to run when we receive a 'connect' event. -// */ -// onConnect: () => { -// try { -// dispatch(setIsConnected(true)); -// dispatch(setCurrentStatus(i18n.t('common.statusConnected'))); -// dispatch(requestSystemConfig()); -// const gallery: GalleryState = getState().gallery; - -// if (gallery.categories.result.latest_mtime) { -// dispatch(requestNewImages('result')); -// } else { -// dispatch(requestImages('result')); -// } - -// if (gallery.categories.user.latest_mtime) { -// dispatch(requestNewImages('user')); -// } else { -// dispatch(requestImages('user')); -// } -// } catch (e) { -// console.error(e); -// } -// }, -// /** -// * Callback to run when we receive a 'disconnect' event. -// */ -// onDisconnect: () => { -// try { -// dispatch(setIsConnected(false)); -// dispatch(setCurrentStatus(i18n.t('common.statusDisconnected'))); - -// dispatch( -// addLogEntry({ -// timestamp: dateFormat(new Date(), 'isoDateTime'), -// message: `Disconnected from server`, -// level: 'warning', -// }) -// ); -// } catch (e) { -// console.error(e); -// } -// }, -// /** -// * Callback to run when we receive a 'generationResult' event. -// */ -// onGenerationResult: (data: InvokeAI.ImageResultResponse) => { -// try { -// const state = getState(); -// const { activeTab } = state.ui; -// const { shouldLoopback } = state.postprocessing; -// const { boundingBox: _, generationMode, ...rest } = data; - -// const newImage = { -// uuid: uuidv4(), -// ...rest, -// }; - -// if (['txt2img', 'img2img'].includes(generationMode)) { -// dispatch( -// addImage({ -// category: 'result', -// image: { ...newImage, category: 'result' }, -// }) -// ); -// } - -// if (generationMode === 'unifiedCanvas' && data.boundingBox) { -// const { boundingBox } = data; -// dispatch( -// addImageToStagingArea({ -// image: { ...newImage, category: 'temp' }, -// boundingBox, -// }) -// ); - -// if (state.canvas.shouldAutoSave) { -// dispatch( -// addImage({ -// image: { ...newImage, category: 'result' }, -// category: 'result', -// }) -// ); -// } -// } - -// // TODO: fix -// // if (shouldLoopback) { -// // const activeTabName = tabMap[activeTab]; -// // switch (activeTabName) { -// // case 'img2img': { -// // dispatch(initialImageSelected(newImage.uuid)); -// // // dispatch(setInitialImage(newImage)); -// // break; -// // } -// // } -// // } - -// dispatch(clearIntermediateImage()); - -// dispatch( -// addLogEntry({ -// timestamp: dateFormat(new Date(), 'isoDateTime'), -// message: `Image generated: ${data.url}`, -// }) -// ); -// } catch (e) { -// console.error(e); -// } -// }, -// /** -// * Callback to run when we receive a 'intermediateResult' event. -// */ -// onIntermediateResult: (data: InvokeAI.ImageResultResponse) => { -// try { -// dispatch( -// setIntermediateImage({ -// uuid: uuidv4(), -// ...data, -// category: 'result', -// }) -// ); -// if (!data.isBase64) { -// dispatch( -// addLogEntry({ -// timestamp: dateFormat(new Date(), 'isoDateTime'), -// message: `Intermediate image generated: ${data.url}`, -// }) -// ); -// } -// } catch (e) { -// console.error(e); -// } -// }, -// /** -// * Callback to run when we receive an 'esrganResult' event. -// */ -// onPostprocessingResult: (data: InvokeAI.ImageResultResponse) => { -// try { -// dispatch( -// addImage({ -// category: 'result', -// image: { -// uuid: uuidv4(), -// ...data, -// category: 'result', -// }, -// }) -// ); - -// dispatch( -// addLogEntry({ -// timestamp: dateFormat(new Date(), 'isoDateTime'), -// message: `Postprocessed: ${data.url}`, -// }) -// ); -// } catch (e) { -// console.error(e); -// } -// }, -// /** -// * Callback to run when we receive a 'progressUpdate' event. -// * TODO: Add additional progress phases -// */ -// onProgressUpdate: (data: InvokeAI.SystemStatus) => { -// try { -// dispatch(setIsProcessing(true)); -// dispatch(setSystemStatus(data)); -// } catch (e) { -// console.error(e); -// } -// }, -// /** -// * Callback to run when we receive a 'progressUpdate' event. -// */ -// onError: (data: InvokeAI.ErrorResponse) => { -// const { message, additionalData } = data; - -// if (additionalData) { -// // TODO: handle more data than short message -// } - -// try { -// dispatch( -// addLogEntry({ -// timestamp: dateFormat(new Date(), 'isoDateTime'), -// message: `Server error: ${message}`, -// level: 'error', -// }) -// ); -// dispatch(errorOccurred()); -// dispatch(clearIntermediateImage()); -// } catch (e) { -// console.error(e); -// } -// }, -// /** -// * Callback to run when we receive a 'galleryImages' event. -// */ -// onGalleryImages: (data: InvokeAI.GalleryImagesResponse) => { -// const { images, areMoreImagesAvailable, category } = data; - -// /** -// * the logic here ideally would be in the reducer but we have a side effect: -// * generating a uuid. so the logic needs to be here, outside redux. -// */ - -// // Generate a UUID for each image -// const preparedImages = images.map((image): InvokeAI._Image => { -// return { -// uuid: uuidv4(), -// ...image, -// }; -// }); - -// dispatch( -// addGalleryImages({ -// images: preparedImages, -// areMoreImagesAvailable, -// category, -// }) -// ); - -// dispatch( -// addLogEntry({ -// timestamp: dateFormat(new Date(), 'isoDateTime'), -// message: `Loaded ${images.length} images`, -// }) -// ); -// }, -// /** -// * Callback to run when we receive a 'processingCanceled' event. -// */ -// onProcessingCanceled: () => { -// dispatch(processingCanceled()); - -// const { intermediateImage } = getState().gallery; - -// if (intermediateImage) { -// if (!intermediateImage.isBase64) { -// dispatch( -// addImage({ -// category: 'result', -// image: intermediateImage, -// }) -// ); -// dispatch( -// addLogEntry({ -// timestamp: dateFormat(new Date(), 'isoDateTime'), -// message: `Intermediate image saved: ${intermediateImage.url}`, -// }) -// ); -// } -// dispatch(clearIntermediateImage()); -// } - -// dispatch( -// addLogEntry({ -// timestamp: dateFormat(new Date(), 'isoDateTime'), -// message: `Processing canceled`, -// level: 'warning', -// }) -// ); -// }, -// /** -// * Callback to run when we receive a 'imageDeleted' event. -// */ -// onImageDeleted: (data: InvokeAI.ImageDeletedResponse) => { -// const { url } = data; - -// // remove image from gallery -// dispatch(removeImage(data)); - -// // remove references to image in options -// const { -// generation: { initialImage, maskPath }, -// } = getState(); - -// if ( -// initialImage === url || -// (initialImage as InvokeAI._Image)?.url === url -// ) { -// dispatch(clearInitialImage()); -// } - -// if (maskPath === url) { -// dispatch(setMaskPath('')); -// } - -// dispatch( -// addLogEntry({ -// timestamp: dateFormat(new Date(), 'isoDateTime'), -// message: `Image deleted: ${url}`, -// }) -// ); -// }, -// onSystemConfig: (data: InvokeAI.SystemConfig) => { -// dispatch(setSystemConfig(data)); -// if (!data.infill_methods.includes('patchmatch')) { -// dispatch(setInfillMethod(data.infill_methods[0])); -// } -// }, -// onFoundModels: (data: InvokeAI.FoundModelResponse) => { -// const { search_folder, found_models } = data; -// dispatch(setSearchFolder(search_folder)); -// dispatch(setFoundModels(found_models)); -// }, -// onNewModelAdded: (data: InvokeAI.ModelAddedResponse) => { -// const { new_model_name, model_list, update } = data; -// dispatch(setModelList(model_list)); -// dispatch(setIsProcessing(false)); -// dispatch(setCurrentStatus(i18n.t('modelManager.modelAdded'))); -// dispatch( -// addLogEntry({ -// timestamp: dateFormat(new Date(), 'isoDateTime'), -// message: `Model Added: ${new_model_name}`, -// level: 'info', -// }) -// ); -// dispatch( -// addToast({ -// title: !update -// ? `${i18n.t('modelManager.modelAdded')}: ${new_model_name}` -// : `${i18n.t('modelManager.modelUpdated')}: ${new_model_name}`, -// status: 'success', -// duration: 2500, -// isClosable: true, -// }) -// ); -// }, -// onModelDeleted: (data: InvokeAI.ModelDeletedResponse) => { -// const { deleted_model_name, model_list } = data; -// dispatch(setModelList(model_list)); -// dispatch(setIsProcessing(false)); -// dispatch( -// addLogEntry({ -// timestamp: dateFormat(new Date(), 'isoDateTime'), -// message: `${i18n.t( -// 'modelManager.modelAdded' -// )}: ${deleted_model_name}`, -// level: 'info', -// }) -// ); -// dispatch( -// addToast({ -// title: `${i18n.t( -// 'modelManager.modelEntryDeleted' -// )}: ${deleted_model_name}`, -// status: 'success', -// duration: 2500, -// isClosable: true, -// }) -// ); -// }, -// onModelConverted: (data: InvokeAI.ModelConvertedResponse) => { -// const { converted_model_name, model_list } = data; -// dispatch(setModelList(model_list)); -// dispatch(setCurrentStatus(i18n.t('common.statusModelConverted'))); -// dispatch(setIsProcessing(false)); -// dispatch(setIsCancelable(true)); -// dispatch( -// addLogEntry({ -// timestamp: dateFormat(new Date(), 'isoDateTime'), -// message: `Model converted: ${converted_model_name}`, -// level: 'info', -// }) -// ); -// dispatch( -// addToast({ -// title: `${i18n.t( -// 'modelManager.modelConverted' -// )}: ${converted_model_name}`, -// status: 'success', -// duration: 2500, -// isClosable: true, -// }) -// ); -// }, -// onModelsMerged: (data: InvokeAI.ModelsMergedResponse) => { -// const { merged_models, merged_model_name, model_list } = data; -// dispatch(setModelList(model_list)); -// dispatch(setCurrentStatus(i18n.t('common.statusMergedModels'))); -// dispatch(setIsProcessing(false)); -// dispatch(setIsCancelable(true)); -// dispatch( -// addLogEntry({ -// timestamp: dateFormat(new Date(), 'isoDateTime'), -// message: `Models merged: ${merged_models}`, -// level: 'info', -// }) -// ); -// dispatch( -// addToast({ -// title: `${i18n.t('modelManager.modelsMerged')}: ${merged_model_name}`, -// status: 'success', -// duration: 2500, -// isClosable: true, -// }) -// ); -// }, -// onModelChanged: (data: InvokeAI.ModelChangeResponse) => { -// const { model_name, model_list } = data; -// dispatch(setModelList(model_list)); -// dispatch(setCurrentStatus(i18n.t('common.statusModelChanged'))); -// dispatch(setIsProcessing(false)); -// dispatch(setIsCancelable(true)); -// dispatch( -// addLogEntry({ -// timestamp: dateFormat(new Date(), 'isoDateTime'), -// message: `Model changed: ${model_name}`, -// level: 'info', -// }) -// ); -// }, -// onModelChangeFailed: (data: InvokeAI.ModelChangeResponse) => { -// const { model_name, model_list } = data; -// dispatch(setModelList(model_list)); -// dispatch(setIsProcessing(false)); -// dispatch(setIsCancelable(true)); -// dispatch(errorOccurred()); -// dispatch( -// addLogEntry({ -// timestamp: dateFormat(new Date(), 'isoDateTime'), -// message: `Model change failed: ${model_name}`, -// level: 'error', -// }) -// ); -// }, -// onTempFolderEmptied: () => { -// dispatch( -// addToast({ -// title: i18n.t('toast.tempFoldersEmptied'), -// status: 'success', -// duration: 2500, -// isClosable: true, -// }) -// ); -// }, -// }; -// }; - -// export default makeSocketIOListeners; - -export default {}; diff --git a/invokeai/frontend/web/src/app/socketio/middleware.ts b/invokeai/frontend/web/src/app/socketio/middleware.ts deleted file mode 100644 index 88013ea222..0000000000 --- a/invokeai/frontend/web/src/app/socketio/middleware.ts +++ /dev/null @@ -1,248 +0,0 @@ -// import { Middleware } from '@reduxjs/toolkit'; -// import { io } from 'socket.io-client'; - -// import makeSocketIOEmitters from './emitters'; -// import makeSocketIOListeners from './listeners'; - -// import * as InvokeAI from 'app/types/invokeai'; - -// /** -// * Creates a socketio middleware to handle communication with server. -// * -// * Special `socketio/actionName` actions are created in actions.ts and -// * exported for use by the application, which treats them like any old -// * action, using `dispatch` to dispatch them. -// * -// * These actions are intercepted here, where `socketio.emit()` calls are -// * made on their behalf - see `emitters.ts`. The emitter functions -// * are the outbound communication to the server. -// * -// * Listeners are also established here - see `listeners.ts`. The listener -// * functions receive communication from the server and usually dispatch -// * some new action to handle whatever data was sent from the server. -// */ -// export const socketioMiddleware = () => { -// const { origin } = new URL(window.location.href); - -// const socketio = io(origin, { -// timeout: 60000, -// path: `${window.location.pathname}socket.io`, -// }); - -// socketio.disconnect(); - -// let areListenersSet = false; - -// const middleware: Middleware = (store) => (next) => (action) => { -// const { -// onConnect, -// onDisconnect, -// onError, -// onPostprocessingResult, -// onGenerationResult, -// onIntermediateResult, -// onProgressUpdate, -// onGalleryImages, -// onProcessingCanceled, -// onImageDeleted, -// onSystemConfig, -// onModelChanged, -// onFoundModels, -// onNewModelAdded, -// onModelDeleted, -// onModelConverted, -// onModelsMerged, -// onModelChangeFailed, -// onTempFolderEmptied, -// } = makeSocketIOListeners(store); - -// const { -// emitGenerateImage, -// emitRunESRGAN, -// emitRunFacetool, -// emitDeleteImage, -// emitRequestImages, -// emitRequestNewImages, -// emitCancelProcessing, -// emitRequestSystemConfig, -// emitSearchForModels, -// emitAddNewModel, -// emitDeleteModel, -// emitConvertToDiffusers, -// emitMergeDiffusersModels, -// emitRequestModelChange, -// emitSaveStagingAreaImageToGallery, -// emitRequestEmptyTempFolder, -// } = makeSocketIOEmitters(store, socketio); - -// /** -// * If this is the first time the middleware has been called (e.g. during store setup), -// * initialize all our socket.io listeners. -// */ -// if (!areListenersSet) { -// socketio.on('connect', () => onConnect()); - -// socketio.on('disconnect', () => onDisconnect()); - -// socketio.on('error', (data: InvokeAI.ErrorResponse) => onError(data)); - -// socketio.on('generationResult', (data: InvokeAI.ImageResultResponse) => -// onGenerationResult(data) -// ); - -// socketio.on( -// 'postprocessingResult', -// (data: InvokeAI.ImageResultResponse) => onPostprocessingResult(data) -// ); - -// socketio.on('intermediateResult', (data: InvokeAI.ImageResultResponse) => -// onIntermediateResult(data) -// ); - -// socketio.on('progressUpdate', (data: InvokeAI.SystemStatus) => -// onProgressUpdate(data) -// ); - -// socketio.on('galleryImages', (data: InvokeAI.GalleryImagesResponse) => -// onGalleryImages(data) -// ); - -// socketio.on('processingCanceled', () => { -// onProcessingCanceled(); -// }); - -// socketio.on('imageDeleted', (data: InvokeAI.ImageDeletedResponse) => { -// onImageDeleted(data); -// }); - -// socketio.on('systemConfig', (data: InvokeAI.SystemConfig) => { -// onSystemConfig(data); -// }); - -// socketio.on('foundModels', (data: InvokeAI.FoundModelResponse) => { -// onFoundModels(data); -// }); - -// socketio.on('newModelAdded', (data: InvokeAI.ModelAddedResponse) => { -// onNewModelAdded(data); -// }); - -// socketio.on('modelDeleted', (data: InvokeAI.ModelDeletedResponse) => { -// onModelDeleted(data); -// }); - -// socketio.on('modelConverted', (data: InvokeAI.ModelConvertedResponse) => { -// onModelConverted(data); -// }); - -// socketio.on('modelsMerged', (data: InvokeAI.ModelsMergedResponse) => { -// onModelsMerged(data); -// }); - -// socketio.on('modelChanged', (data: InvokeAI.ModelChangeResponse) => { -// onModelChanged(data); -// }); - -// socketio.on('modelChangeFailed', (data: InvokeAI.ModelChangeResponse) => { -// onModelChangeFailed(data); -// }); - -// socketio.on('tempFolderEmptied', () => { -// onTempFolderEmptied(); -// }); - -// areListenersSet = true; -// } - -// /** -// * Handle redux actions caught by middleware. -// */ -// switch (action.type) { -// case 'socketio/generateImage': { -// emitGenerateImage(action.payload); -// break; -// } - -// case 'socketio/runESRGAN': { -// emitRunESRGAN(action.payload); -// break; -// } - -// case 'socketio/runFacetool': { -// emitRunFacetool(action.payload); -// break; -// } - -// case 'socketio/deleteImage': { -// emitDeleteImage(action.payload); -// break; -// } - -// case 'socketio/requestImages': { -// emitRequestImages(action.payload); -// break; -// } - -// case 'socketio/requestNewImages': { -// emitRequestNewImages(action.payload); -// break; -// } - -// case 'socketio/cancelProcessing': { -// emitCancelProcessing(); -// break; -// } - -// case 'socketio/requestSystemConfig': { -// emitRequestSystemConfig(); -// break; -// } - -// case 'socketio/searchForModels': { -// emitSearchForModels(action.payload); -// break; -// } - -// case 'socketio/addNewModel': { -// emitAddNewModel(action.payload); -// break; -// } - -// case 'socketio/deleteModel': { -// emitDeleteModel(action.payload); -// break; -// } - -// case 'socketio/convertToDiffusers': { -// emitConvertToDiffusers(action.payload); -// break; -// } - -// case 'socketio/mergeDiffusersModels': { -// emitMergeDiffusersModels(action.payload); -// break; -// } - -// case 'socketio/requestModelChange': { -// emitRequestModelChange(action.payload); -// break; -// } - -// case 'socketio/saveStagingAreaImageToGallery': { -// emitSaveStagingAreaImageToGallery(action.payload); -// break; -// } - -// case 'socketio/requestEmptyTempFolder': { -// emitRequestEmptyTempFolder(); -// break; -// } -// } - -// next(action); -// }; - -// return middleware; -// }; - -export default {}; diff --git a/invokeai/frontend/web/src/app/store/enhancers/reduxRemember/serialize.ts b/invokeai/frontend/web/src/app/store/enhancers/reduxRemember/serialize.ts index ac1b9c5205..3407b3f7de 100644 --- a/invokeai/frontend/web/src/app/store/enhancers/reduxRemember/serialize.ts +++ b/invokeai/frontend/web/src/app/store/enhancers/reduxRemember/serialize.ts @@ -1,7 +1,6 @@ import { canvasPersistDenylist } from 'features/canvas/store/canvasPersistDenylist'; import { controlNetDenylist } from 'features/controlNet/store/controlNetDenylist'; import { galleryPersistDenylist } from 'features/gallery/store/galleryPersistDenylist'; -import { lightboxPersistDenylist } from 'features/lightbox/store/lightboxPersistDenylist'; import { nodesPersistDenylist } from 'features/nodes/store/nodesPersistDenylist'; import { generationPersistDenylist } from 'features/parameters/store/generationPersistDenylist'; import { postprocessingPersistDenylist } from 'features/parameters/store/postprocessingPersistDenylist'; @@ -16,7 +15,6 @@ const serializationDenylist: { canvas: canvasPersistDenylist, gallery: galleryPersistDenylist, generation: generationPersistDenylist, - lightbox: lightboxPersistDenylist, nodes: nodesPersistDenylist, postprocessing: postprocessingPersistDenylist, system: systemPersistDenylist, diff --git a/invokeai/frontend/web/src/app/store/enhancers/reduxRemember/unserialize.ts b/invokeai/frontend/web/src/app/store/enhancers/reduxRemember/unserialize.ts index 23e6448987..5d94abd738 100644 --- a/invokeai/frontend/web/src/app/store/enhancers/reduxRemember/unserialize.ts +++ b/invokeai/frontend/web/src/app/store/enhancers/reduxRemember/unserialize.ts @@ -1,7 +1,6 @@ import { initialCanvasState } from 'features/canvas/store/canvasSlice'; import { initialControlNetState } from 'features/controlNet/store/controlNetSlice'; import { initialGalleryState } from 'features/gallery/store/gallerySlice'; -import { initialLightboxState } from 'features/lightbox/store/lightboxSlice'; import { initialNodesState } from 'features/nodes/store/nodesSlice'; import { initialGenerationState } from 'features/parameters/store/generationSlice'; import { initialPostprocessingState } from 'features/parameters/store/postprocessingSlice'; @@ -18,7 +17,6 @@ const initialStates: { canvas: initialCanvasState, gallery: initialGalleryState, generation: initialGenerationState, - lightbox: initialLightboxState, nodes: initialNodesState, postprocessing: initialPostprocessingState, system: initialSystemState, diff --git a/invokeai/frontend/web/src/app/store/middleware/devtools/actionsDenylist.ts b/invokeai/frontend/web/src/app/store/middleware/devtools/actionsDenylist.ts index 8a6e112d27..6d41d488c8 100644 --- a/invokeai/frontend/web/src/app/store/middleware/devtools/actionsDenylist.ts +++ b/invokeai/frontend/web/src/app/store/middleware/devtools/actionsDenylist.ts @@ -1,4 +1,8 @@ +/** + * This is a list of actions that should be excluded in the Redux DevTools. + */ export const actionsDenylist = [ + // very spammy canvas actions 'canvas/setCursorPosition', 'canvas/setStageCoordinates', 'canvas/setStageScale', @@ -7,7 +11,11 @@ export const actionsDenylist = [ 'canvas/setBoundingBoxDimensions', 'canvas/setIsDrawing', 'canvas/addPointToCurrentLine', + // bazillions during generation 'socket/socketGeneratorProgress', 'socket/appSocketGeneratorProgress', + // every time user presses shift 'hotkeys/shiftKeyPressed', + // this happens after every state change + '@@REMEMBER_PERSISTED', ]; diff --git a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/index.ts b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/index.ts index 8c5873903c..35bfde2bff 100644 --- a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/index.ts +++ b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/index.ts @@ -58,7 +58,6 @@ import { addReceivedPageOfImagesFulfilledListener, addReceivedPageOfImagesRejectedListener, } from './listeners/receivedPageOfImages'; -import { addSelectionAddedToBatchListener } from './listeners/selectionAddedToBatch'; import { addSessionCanceledFulfilledListener, addSessionCanceledPendingListener, @@ -89,6 +88,9 @@ import { addUserInvokedCanvasListener } from './listeners/userInvokedCanvas'; import { addUserInvokedImageToImageListener } from './listeners/userInvokedImageToImage'; import { addUserInvokedNodesListener } from './listeners/userInvokedNodes'; import { addUserInvokedTextToImageListener } from './listeners/userInvokedTextToImage'; +import { addModelLoadStartedEventListener } from './listeners/socketio/socketModelLoadStarted'; +import { addModelLoadCompletedEventListener } from './listeners/socketio/socketModelLoadCompleted'; +import { addUpscaleRequestedListener } from './listeners/upscaleRequested'; export const listenerMiddleware = createListenerMiddleware(); @@ -178,6 +180,8 @@ addSocketConnectedListener(); addSocketDisconnectedListener(); addSocketSubscribedListener(); addSocketUnsubscribedListener(); +addModelLoadStartedEventListener(); +addModelLoadCompletedEventListener(); // Session Created addSessionCreatedPendingListener(); @@ -215,9 +219,6 @@ addBoardIdSelectedListener(); // Node schemas addReceivedOpenAPISchemaListener(); -// Batches -addSelectionAddedToBatchListener(); - // DND addImageDroppedListener(); @@ -228,3 +229,5 @@ addModelSelectedListener(); addAppStartedListener(); addModelsLoadedListener(); addAppConfigReceivedListener(); + +addUpscaleRequestedListener(); diff --git a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/appStarted.ts b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/appStarted.ts index dc38ba911a..9f7085db6f 100644 --- a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/appStarted.ts +++ b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/appStarted.ts @@ -1,5 +1,7 @@ import { createAction } from '@reduxjs/toolkit'; import { + ASSETS_CATEGORIES, + IMAGE_CATEGORIES, INITIAL_IMAGE_LIMIT, isLoadingChanged, } from 'features/gallery/store/gallerySlice'; @@ -20,7 +22,7 @@ export const addAppStartedListener = () => { // fill up the gallery tab with images await dispatch( receivedPageOfImages({ - categories: ['general'], + categories: IMAGE_CATEGORIES, is_intermediate: false, offset: 0, limit: INITIAL_IMAGE_LIMIT, @@ -30,7 +32,7 @@ export const addAppStartedListener = () => { // fill up the assets tab with images await dispatch( receivedPageOfImages({ - categories: ['control', 'mask', 'user', 'other'], + categories: ASSETS_CATEGORIES, is_intermediate: false, offset: 0, limit: INITIAL_IMAGE_LIMIT, diff --git a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/boardIdSelected.ts b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/boardIdSelected.ts index 6ce6665cc5..9ce17e3099 100644 --- a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/boardIdSelected.ts +++ b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/boardIdSelected.ts @@ -1,15 +1,18 @@ import { log } from 'app/logging/useLogger'; -import { startAppListening } from '..'; +import { selectFilteredImages } from 'features/gallery/store/gallerySelectors'; import { + ASSETS_CATEGORIES, + IMAGE_CATEGORIES, + boardIdSelected, imageSelected, selectImagesAll, - boardIdSelected, } from 'features/gallery/store/gallerySlice'; +import { boardsApi } from 'services/api/endpoints/boards'; import { IMAGES_PER_PAGE, receivedPageOfImages, } from 'services/api/thunks/image'; -import { boardsApi } from 'services/api/endpoints/boards'; +import { startAppListening } from '..'; const moduleLog = log.child({ namespace: 'boards' }); @@ -24,19 +27,24 @@ export const addBoardIdSelectedListener = () => { const state = getState(); const allImages = selectImagesAll(state); - if (!board_id) { - // a board was unselected - dispatch(imageSelected(allImages[0]?.image_name)); + if (board_id === 'all') { + // Selected all images + dispatch(imageSelected(allImages[0]?.image_name ?? null)); return; } - const { categories } = state.gallery; + if (board_id === 'batch') { + // Selected the batch + dispatch(imageSelected(state.gallery.batchImageNames[0] ?? null)); + return; + } - const filteredImages = allImages.filter((i) => { - const isInCategory = categories.includes(i.image_category); - const isInSelectedBoard = board_id ? i.board_id === board_id : true; - return isInCategory && isInSelectedBoard; - }); + const filteredImages = selectFilteredImages(state); + + const categories = + state.gallery.galleryView === 'images' + ? IMAGE_CATEGORIES + : ASSETS_CATEGORIES; // get the board from the cache const { data: boards } = @@ -45,7 +53,7 @@ export const addBoardIdSelectedListener = () => { if (!board) { // can't find the board in cache... - dispatch(imageSelected(allImages[0]?.image_name)); + dispatch(boardIdSelected('all')); return; } @@ -63,48 +71,3 @@ export const addBoardIdSelectedListener = () => { }, }); }; - -export const addBoardIdSelected_changeSelectedImage_listener = () => { - startAppListening({ - actionCreator: boardIdSelected, - effect: (action, { getState, dispatch }) => { - const board_id = action.payload; - - const state = getState(); - - // we need to check if we need to fetch more images - - if (!board_id) { - // a board was unselected - we don't need to do anything - return; - } - - const { categories } = state.gallery; - - const filteredImages = selectImagesAll(state).filter((i) => { - const isInCategory = categories.includes(i.image_category); - const isInSelectedBoard = board_id ? i.board_id === board_id : true; - return isInCategory && isInSelectedBoard; - }); - - // get the board from the cache - const { data: boards } = - boardsApi.endpoints.listAllBoards.select()(state); - const board = boards?.find((b) => b.board_id === board_id); - if (!board) { - // can't find the board in cache... - return; - } - - // if we haven't loaded one full page of images from this board, load more - if ( - filteredImages.length < board.image_count && - filteredImages.length < IMAGES_PER_PAGE - ) { - dispatch( - receivedPageOfImages({ categories, board_id, is_intermediate: false }) - ); - } - }, - }); -}; diff --git a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/controlNetAutoProcess.ts b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/controlNetAutoProcess.ts index dd2fb6f469..a923bd0b60 100644 --- a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/controlNetAutoProcess.ts +++ b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/controlNetAutoProcess.ts @@ -13,7 +13,11 @@ import { RootState } from 'app/store/store'; const moduleLog = log.child({ namespace: 'controlNet' }); -const predicate: AnyListenerPredicate = (action, state) => { +const predicate: AnyListenerPredicate = ( + action, + state, + prevState +) => { const isActionMatched = controlNetProcessorParamsChanged.match(action) || controlNetModelChanged.match(action) || @@ -25,6 +29,16 @@ const predicate: AnyListenerPredicate = (action, state) => { return false; } + if (controlNetAutoConfigToggled.match(action)) { + // do not process if the user just disabled auto-config + if ( + prevState.controlNet.controlNets[action.payload.controlNetId] + .shouldAutoConfig === true + ) { + return false; + } + } + const { controlImage, processorType, shouldAutoConfig } = state.controlNet.controlNets[action.payload.controlNetId]; diff --git a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/imageAddedToBoard.ts b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/imageAddedToBoard.ts index e4d8c74bf9..c92eeac0db 100644 --- a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/imageAddedToBoard.ts +++ b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/imageAddedToBoard.ts @@ -1,6 +1,5 @@ import { log } from 'app/logging/useLogger'; import { boardImagesApi } from 'services/api/endpoints/boardImages'; -import { imageDTOReceived } from 'services/api/thunks/image'; import { startAppListening } from '..'; const moduleLog = log.child({ namespace: 'boards' }); @@ -15,12 +14,6 @@ export const addImageAddedToBoardFulfilledListener = () => { { data: { board_id, image_name } }, 'Image added to board' ); - - dispatch( - imageDTOReceived({ - image_name, - }) - ); }, }); }; diff --git a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/imageDeleted.ts b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/imageDeleted.ts index f083a716a4..c90c08d94a 100644 --- a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/imageDeleted.ts +++ b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/imageDeleted.ts @@ -1,10 +1,10 @@ import { log } from 'app/logging/useLogger'; import { resetCanvas } from 'features/canvas/store/canvasSlice'; import { controlNetReset } from 'features/controlNet/store/controlNetSlice'; +import { selectNextImageToSelect } from 'features/gallery/store/gallerySelectors'; import { imageRemoved, imageSelected, - selectFilteredImages, } from 'features/gallery/store/gallerySlice'; import { imageDeletionConfirmed, @@ -12,7 +12,6 @@ import { } from 'features/imageDeletion/store/imageDeletionSlice'; import { nodeEditorReset } from 'features/nodes/store/nodesSlice'; import { clearInitialImage } from 'features/parameters/store/generationSlice'; -import { clamp } from 'lodash-es'; import { api } from 'services/api'; import { imageDeleted } from 'services/api/thunks/image'; import { startAppListening } from '..'; @@ -37,26 +36,10 @@ export const addRequestedImageDeletionListener = () => { state.gallery.selection[state.gallery.selection.length - 1]; if (lastSelectedImage === image_name) { - const filteredImages = selectFilteredImages(state); - - const ids = filteredImages.map((i) => i.image_name); - - const deletedImageIndex = ids.findIndex( - (result) => result.toString() === image_name - ); - - const filteredIds = ids.filter((id) => id.toString() !== image_name); - - const newSelectedImageIndex = clamp( - deletedImageIndex, - 0, - filteredIds.length - 1 - ); - - const newSelectedImageId = filteredIds[newSelectedImageIndex]; + const newSelectedImageId = selectNextImageToSelect(state, image_name); if (newSelectedImageId) { - dispatch(imageSelected(newSelectedImageId as string)); + dispatch(imageSelected(newSelectedImageId)); } else { dispatch(imageSelected(null)); } diff --git a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/imageDropped.ts b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/imageDropped.ts index 24a5bffec7..51894d50de 100644 --- a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/imageDropped.ts +++ b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/imageDropped.ts @@ -4,13 +4,12 @@ import { TypesafeDroppableData, } from 'app/components/ImageDnd/typesafeDnd'; import { log } from 'app/logging/useLogger'; -import { - imageAddedToBatch, - imagesAddedToBatch, -} from 'features/batch/store/batchSlice'; import { setInitialCanvasImage } from 'features/canvas/store/canvasSlice'; import { controlNetImageChanged } from 'features/controlNet/store/controlNetSlice'; -import { imageSelected } from 'features/gallery/store/gallerySlice'; +import { + imageSelected, + imagesAddedToBatch, +} from 'features/gallery/store/gallerySlice'; import { fieldValueChanged, imageCollectionFieldValueChanged, @@ -21,57 +20,66 @@ import { startAppListening } from '../'; const moduleLog = log.child({ namespace: 'dnd' }); -export const imageDropped = createAction<{ +export const dndDropped = createAction<{ overData: TypesafeDroppableData; activeData: TypesafeDraggableData; -}>('dnd/imageDropped'); +}>('dnd/dndDropped'); export const addImageDroppedListener = () => { startAppListening({ - actionCreator: imageDropped, - effect: (action, { dispatch, getState }) => { + actionCreator: dndDropped, + effect: async (action, { dispatch, getState, take }) => { const { activeData, overData } = action.payload; - const { actionType } = overData; const state = getState(); + moduleLog.debug( + { data: { activeData, overData } }, + 'Image or selection dropped' + ); + // set current image if ( - actionType === 'SET_CURRENT_IMAGE' && + overData.actionType === 'SET_CURRENT_IMAGE' && activeData.payloadType === 'IMAGE_DTO' && activeData.payload.imageDTO ) { dispatch(imageSelected(activeData.payload.imageDTO.image_name)); + return; } // set initial image if ( - actionType === 'SET_INITIAL_IMAGE' && + overData.actionType === 'SET_INITIAL_IMAGE' && activeData.payloadType === 'IMAGE_DTO' && activeData.payload.imageDTO ) { dispatch(initialImageChanged(activeData.payload.imageDTO)); + return; } // add image to batch if ( - actionType === 'ADD_TO_BATCH' && + overData.actionType === 'ADD_TO_BATCH' && activeData.payloadType === 'IMAGE_DTO' && activeData.payload.imageDTO ) { - dispatch(imageAddedToBatch(activeData.payload.imageDTO.image_name)); + dispatch(imagesAddedToBatch([activeData.payload.imageDTO.image_name])); + return; } // add multiple images to batch if ( - actionType === 'ADD_TO_BATCH' && - activeData.payloadType === 'GALLERY_SELECTION' + overData.actionType === 'ADD_TO_BATCH' && + activeData.payloadType === 'IMAGE_NAMES' ) { - dispatch(imagesAddedToBatch(state.gallery.selection)); + dispatch(imagesAddedToBatch(activeData.payload.image_names)); + + return; } // set control image if ( - actionType === 'SET_CONTROLNET_IMAGE' && + overData.actionType === 'SET_CONTROLNET_IMAGE' && activeData.payloadType === 'IMAGE_DTO' && activeData.payload.imageDTO ) { @@ -82,20 +90,22 @@ export const addImageDroppedListener = () => { controlNetId, }) ); + return; } // set canvas image if ( - actionType === 'SET_CANVAS_INITIAL_IMAGE' && + overData.actionType === 'SET_CANVAS_INITIAL_IMAGE' && activeData.payloadType === 'IMAGE_DTO' && activeData.payload.imageDTO ) { dispatch(setInitialCanvasImage(activeData.payload.imageDTO)); + return; } // set nodes image if ( - actionType === 'SET_NODES_IMAGE' && + overData.actionType === 'SET_NODES_IMAGE' && activeData.payloadType === 'IMAGE_DTO' && activeData.payload.imageDTO ) { @@ -107,11 +117,12 @@ export const addImageDroppedListener = () => { value: activeData.payload.imageDTO, }) ); + return; } // set multiple nodes images (single image handler) if ( - actionType === 'SET_MULTI_NODES_IMAGE' && + overData.actionType === 'SET_MULTI_NODES_IMAGE' && activeData.payloadType === 'IMAGE_DTO' && activeData.payload.imageDTO ) { @@ -123,43 +134,30 @@ export const addImageDroppedListener = () => { value: [activeData.payload.imageDTO], }) ); + return; } // set multiple nodes images (multiple images handler) if ( - actionType === 'SET_MULTI_NODES_IMAGE' && - activeData.payloadType === 'GALLERY_SELECTION' + overData.actionType === 'SET_MULTI_NODES_IMAGE' && + activeData.payloadType === 'IMAGE_NAMES' ) { const { fieldName, nodeId } = overData.context; dispatch( imageCollectionFieldValueChanged({ nodeId, fieldName, - value: state.gallery.selection.map((image_name) => ({ + value: activeData.payload.image_names.map((image_name) => ({ image_name, })), }) ); + return; } - // remove image from board - // TODO: remove board_id from `removeImageFromBoard()` endpoint - // TODO: handle multiple images - // if ( - // actionType === 'MOVE_BOARD' && - // activeData.payloadType === 'IMAGE_DTO' && - // activeData.payload.imageDTO && - // overData.boardId !== null - // ) { - // const { image_name } = activeData.payload.imageDTO; - // dispatch( - // boardImagesApi.endpoints.removeImageFromBoard.initiate({ image_name }) - // ); - // } - // add image to board if ( - actionType === 'MOVE_BOARD' && + overData.actionType === 'MOVE_BOARD' && activeData.payloadType === 'IMAGE_DTO' && activeData.payload.imageDTO && overData.context.boardId @@ -172,17 +170,89 @@ export const addImageDroppedListener = () => { board_id: boardId, }) ); + return; } - // add multiple images to board - // TODO: add endpoint - // if ( - // actionType === 'ADD_TO_BATCH' && - // activeData.payloadType === 'IMAGE_NAMES' && - // activeData.payload.imageDTONames - // ) { - // dispatch(boardImagesApi.endpoints.addImagesToBoard.intiate({})); - // } + // remove image from board + if ( + overData.actionType === 'MOVE_BOARD' && + activeData.payloadType === 'IMAGE_DTO' && + activeData.payload.imageDTO && + overData.context.boardId === null + ) { + const { image_name, board_id } = activeData.payload.imageDTO; + if (board_id) { + dispatch( + boardImagesApi.endpoints.removeImageFromBoard.initiate({ + image_name, + board_id, + }) + ); + } + return; + } + + // add gallery selection to board + if ( + overData.actionType === 'MOVE_BOARD' && + activeData.payloadType === 'IMAGE_NAMES' && + overData.context.boardId + ) { + console.log('adding gallery selection to board'); + const board_id = overData.context.boardId; + dispatch( + boardImagesApi.endpoints.addManyBoardImages.initiate({ + board_id, + image_names: activeData.payload.image_names, + }) + ); + return; + } + + // remove gallery selection from board + if ( + overData.actionType === 'MOVE_BOARD' && + activeData.payloadType === 'IMAGE_NAMES' && + overData.context.boardId === null + ) { + console.log('removing gallery selection to board'); + dispatch( + boardImagesApi.endpoints.deleteManyBoardImages.initiate({ + image_names: activeData.payload.image_names, + }) + ); + return; + } + + // add batch selection to board + if ( + overData.actionType === 'MOVE_BOARD' && + activeData.payloadType === 'IMAGE_NAMES' && + overData.context.boardId + ) { + const board_id = overData.context.boardId; + dispatch( + boardImagesApi.endpoints.addManyBoardImages.initiate({ + board_id, + image_names: activeData.payload.image_names, + }) + ); + return; + } + + // remove batch selection from board + if ( + overData.actionType === 'MOVE_BOARD' && + activeData.payloadType === 'IMAGE_NAMES' && + overData.context.boardId === null + ) { + dispatch( + boardImagesApi.endpoints.deleteManyBoardImages.initiate({ + image_names: activeData.payload.image_names, + }) + ); + return; + } }, }); }; diff --git a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/imageRemovedFromBoard.ts b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/imageRemovedFromBoard.ts index 4cf144211c..3c6731bb31 100644 --- a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/imageRemovedFromBoard.ts +++ b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/imageRemovedFromBoard.ts @@ -1,6 +1,5 @@ import { log } from 'app/logging/useLogger'; import { boardImagesApi } from 'services/api/endpoints/boardImages'; -import { imageDTOReceived } from 'services/api/thunks/image'; import { startAppListening } from '..'; const moduleLog = log.child({ namespace: 'boards' }); @@ -15,12 +14,6 @@ export const addImageRemovedFromBoardFulfilledListener = () => { { data: { board_id, image_name } }, 'Image added to board' ); - - dispatch( - imageDTOReceived({ - image_name, - }) - ); }, }); }; diff --git a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/imageUploaded.ts b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/imageUploaded.ts index 0cd852c3de..cca01354b5 100644 --- a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/imageUploaded.ts +++ b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/imageUploaded.ts @@ -1,13 +1,15 @@ -import { startAppListening } from '..'; -import { imageUploaded } from 'services/api/thunks/image'; -import { addToast } from 'features/system/store/systemSlice'; import { log } from 'app/logging/useLogger'; -import { imageUpserted } from 'features/gallery/store/gallerySlice'; import { setInitialCanvasImage } from 'features/canvas/store/canvasSlice'; import { controlNetImageChanged } from 'features/controlNet/store/controlNetSlice'; -import { initialImageChanged } from 'features/parameters/store/generationSlice'; +import { + imageUpserted, + imagesAddedToBatch, +} from 'features/gallery/store/gallerySlice'; import { fieldValueChanged } from 'features/nodes/store/nodesSlice'; -import { imageAddedToBatch } from 'features/batch/store/batchSlice'; +import { initialImageChanged } from 'features/parameters/store/generationSlice'; +import { addToast } from 'features/system/store/systemSlice'; +import { imageUploaded } from 'services/api/thunks/image'; +import { startAppListening } from '..'; const moduleLog = log.child({ namespace: 'image' }); @@ -73,7 +75,7 @@ export const addImageUploadedFulfilledListener = () => { } if (postUploadAction?.type === 'ADD_TO_BATCH') { - dispatch(imageAddedToBatch(image.image_name)); + dispatch(imagesAddedToBatch([image.image_name])); return; } }, diff --git a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/modelSelected.ts b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/modelSelected.ts index 5ab30570d9..05076960fb 100644 --- a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/modelSelected.ts +++ b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/modelSelected.ts @@ -1,36 +1,78 @@ import { makeToast } from 'app/components/Toaster'; +import { log } from 'app/logging/useLogger'; +import { loraRemoved } from 'features/lora/store/loraSlice'; import { modelSelected } from 'features/parameters/store/actions'; import { modelChanged, vaeSelected, } from 'features/parameters/store/generationSlice'; -import { zMainModel } from 'features/parameters/store/parameterZodSchemas'; +import { zMainModel } from 'features/parameters/types/parameterSchemas'; import { addToast } from 'features/system/store/systemSlice'; +import { forEach } from 'lodash-es'; import { startAppListening } from '..'; -import { lorasCleared } from '../../../../../features/lora/store/loraSlice'; +import { controlNetRemoved } from 'features/controlNet/store/controlNetSlice'; + +const moduleLog = log.child({ module: 'models' }); export const addModelSelectedListener = () => { startAppListening({ actionCreator: modelSelected, effect: (action, { getState, dispatch }) => { const state = getState(); - const { base_model, model_name } = action.payload; + const result = zMainModel.safeParse(action.payload); - if (state.generation.model?.base_model !== base_model) { - dispatch( - addToast( - makeToast({ - title: 'Base model changed, clearing submodels', - status: 'warning', - }) - ) + if (!result.success) { + moduleLog.error( + { error: result.error.format() }, + 'Failed to parse main model' ); - dispatch(vaeSelected(null)); - dispatch(lorasCleared()); - // TODO: controlnet cleared + return; } - const newModel = zMainModel.parse(action.payload); + const newModel = result.data; + + const { base_model } = newModel; + + if (state.generation.model?.base_model !== base_model) { + // we may need to reset some incompatible submodels + let modelsCleared = 0; + + // handle incompatible loras + forEach(state.lora.loras, (lora, id) => { + if (lora.base_model !== base_model) { + dispatch(loraRemoved(id)); + modelsCleared += 1; + } + }); + + // handle incompatible vae + const { vae } = state.generation; + if (vae && vae.base_model !== base_model) { + dispatch(vaeSelected(null)); + modelsCleared += 1; + } + + const { controlNets } = state.controlNet; + forEach(controlNets, (controlNet, controlNetId) => { + if (controlNet.model?.base_model !== base_model) { + dispatch(controlNetRemoved({ controlNetId })); + modelsCleared += 1; + } + }); + + if (modelsCleared > 0) { + dispatch( + addToast( + makeToast({ + title: `Base model changed, cleared ${modelsCleared} incompatible submodel${ + modelsCleared === 1 ? '' : 's' + }`, + status: 'warning', + }) + ) + ); + } + } dispatch(modelChanged(newModel)); }, diff --git a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/modelsLoaded.ts b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/modelsLoaded.ts index ee02028848..5e3caa7c99 100644 --- a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/modelsLoaded.ts +++ b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/modelsLoaded.ts @@ -1,7 +1,19 @@ -import { modelChanged } from 'features/parameters/store/generationSlice'; -import { some } from 'lodash-es'; +import { log } from 'app/logging/useLogger'; +import { loraRemoved } from 'features/lora/store/loraSlice'; +import { + modelChanged, + vaeSelected, +} from 'features/parameters/store/generationSlice'; +import { + zMainModel, + zVaeModel, +} from 'features/parameters/types/parameterSchemas'; +import { forEach, some } from 'lodash-es'; import { modelsApi } from 'services/api/endpoints/models'; import { startAppListening } from '..'; +import { controlNetRemoved } from 'features/controlNet/store/controlNetSlice'; + +const moduleLog = log.child({ module: 'models' }); export const addModelsLoadedListener = () => { startAppListening({ @@ -31,12 +43,107 @@ export const addModelsLoadedListener = () => { return; } - dispatch( - modelChanged({ - base_model: firstModel.base_model, - model_name: firstModel.model_name, - }) + const result = zMainModel.safeParse(firstModel); + + if (!result.success) { + moduleLog.error( + { error: result.error.format() }, + 'Failed to parse main model' + ); + return; + } + + dispatch(modelChanged(result.data)); + }, + }); + startAppListening({ + matcher: modelsApi.endpoints.getVaeModels.matchFulfilled, + effect: async (action, { getState, dispatch }) => { + // VAEs loaded, need to reset the VAE is it's no longer available + + const currentVae = getState().generation.vae; + + if (currentVae === null) { + // null is a valid VAE! it means "use the default with the main model" + return; + } + + const isCurrentVAEAvailable = some( + action.payload.entities, + (m) => + m?.model_name === currentVae?.model_name && + m?.base_model === currentVae?.base_model ); + + if (isCurrentVAEAvailable) { + return; + } + + const firstModelId = action.payload.ids[0]; + const firstModel = action.payload.entities[firstModelId]; + + if (!firstModel) { + // No custom VAEs loaded at all; use the default + dispatch(modelChanged(null)); + return; + } + + const result = zVaeModel.safeParse(firstModel); + + if (!result.success) { + moduleLog.error( + { error: result.error.format() }, + 'Failed to parse VAE model' + ); + return; + } + + dispatch(vaeSelected(result.data)); + }, + }); + startAppListening({ + matcher: modelsApi.endpoints.getLoRAModels.matchFulfilled, + effect: async (action, { getState, dispatch }) => { + // LoRA models loaded - need to remove missing LoRAs from state + + const loras = getState().lora.loras; + + forEach(loras, (lora, id) => { + const isLoRAAvailable = some( + action.payload.entities, + (m) => + m?.model_name === lora?.model_name && + m?.base_model === lora?.base_model + ); + + if (isLoRAAvailable) { + return; + } + + dispatch(loraRemoved(id)); + }); + }, + }); + startAppListening({ + matcher: modelsApi.endpoints.getControlNetModels.matchFulfilled, + effect: async (action, { getState, dispatch }) => { + // ControlNet models loaded - need to remove missing ControlNets from state + const controlNets = getState().controlNet.controlNets; + + forEach(controlNets, (controlNet, controlNetId) => { + const isControlNetAvailable = some( + action.payload.entities, + (m) => + m?.model_name === controlNet?.model?.model_name && + m?.base_model === controlNet?.model?.base_model + ); + + if (isControlNetAvailable) { + return; + } + + dispatch(controlNetRemoved({ controlNetId })); + }); }, }); }; diff --git a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/selectionAddedToBatch.ts b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/selectionAddedToBatch.ts deleted file mode 100644 index dae72d92e7..0000000000 --- a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/selectionAddedToBatch.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { startAppListening } from '..'; -import { log } from 'app/logging/useLogger'; -import { - imagesAddedToBatch, - selectionAddedToBatch, -} from 'features/batch/store/batchSlice'; - -const moduleLog = log.child({ namespace: 'batch' }); - -export const addSelectionAddedToBatchListener = () => { - startAppListening({ - actionCreator: selectionAddedToBatch, - effect: (action, { dispatch, getState }) => { - const { selection } = getState().gallery; - - dispatch(imagesAddedToBatch(selection)); - }, - }); -}; diff --git a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/sessionCreated.ts b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/sessionCreated.ts index a55bd07c4d..9ae7105378 100644 --- a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/sessionCreated.ts +++ b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/sessionCreated.ts @@ -1,7 +1,7 @@ import { log } from 'app/logging/useLogger'; -import { startAppListening } from '..'; -import { sessionCreated } from 'services/api/thunks/session'; import { serializeError } from 'serialize-error'; +import { sessionCreated } from 'services/api/thunks/session'; +import { startAppListening } from '..'; const moduleLog = log.child({ namespace: 'session' }); diff --git a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/socketio/socketConnected.ts b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/socketio/socketConnected.ts index fe4bce682b..f01c3911da 100644 --- a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/socketio/socketConnected.ts +++ b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/socketio/socketConnected.ts @@ -1,6 +1,7 @@ import { log } from 'app/logging/useLogger'; -import { appSocketConnected, socketConnected } from 'services/events/actions'; +import { modelsApi } from 'services/api/endpoints/models'; import { receivedOpenAPISchema } from 'services/api/thunks/schema'; +import { appSocketConnected, socketConnected } from 'services/events/actions'; import { startAppListening } from '../..'; const moduleLog = log.child({ namespace: 'socketio' }); @@ -23,6 +24,13 @@ export const addSocketConnectedEventListener = () => { // pass along the socket event as an application action dispatch(appSocketConnected(action.payload)); + + // update all server state + dispatch(modelsApi.endpoints.getMainModels.initiate()); + dispatch(modelsApi.endpoints.getControlNetModels.initiate()); + dispatch(modelsApi.endpoints.getLoRAModels.initiate()); + dispatch(modelsApi.endpoints.getTextualInversionModels.initiate()); + dispatch(modelsApi.endpoints.getVaeModels.initiate()); }, }); }; diff --git a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/socketio/socketModelLoadCompleted.ts b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/socketio/socketModelLoadCompleted.ts new file mode 100644 index 0000000000..bc533b9178 --- /dev/null +++ b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/socketio/socketModelLoadCompleted.ts @@ -0,0 +1,28 @@ +import { log } from 'app/logging/useLogger'; +import { + appSocketModelLoadCompleted, + socketModelLoadCompleted, +} from 'services/events/actions'; +import { startAppListening } from '../..'; + +const moduleLog = log.child({ namespace: 'socketio' }); + +export const addModelLoadCompletedEventListener = () => { + startAppListening({ + actionCreator: socketModelLoadCompleted, + effect: (action, { dispatch, getState }) => { + const { model_name, model_type, submodel } = action.payload.data; + + let modelString = `${model_type} model: ${model_name}`; + + if (submodel) { + modelString = modelString.concat(`, submodel: ${submodel}`); + } + + moduleLog.debug(action.payload, `Model load completed (${modelString})`); + + // pass along the socket event as an application action + dispatch(appSocketModelLoadCompleted(action.payload)); + }, + }); +}; diff --git a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/socketio/socketModelLoadStarted.ts b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/socketio/socketModelLoadStarted.ts new file mode 100644 index 0000000000..aa53a70cee --- /dev/null +++ b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/socketio/socketModelLoadStarted.ts @@ -0,0 +1,28 @@ +import { log } from 'app/logging/useLogger'; +import { + appSocketModelLoadStarted, + socketModelLoadStarted, +} from 'services/events/actions'; +import { startAppListening } from '../..'; + +const moduleLog = log.child({ namespace: 'socketio' }); + +export const addModelLoadStartedEventListener = () => { + startAppListening({ + actionCreator: socketModelLoadStarted, + effect: (action, { dispatch, getState }) => { + const { model_name, model_type, submodel } = action.payload.data; + + let modelString = `${model_type} model: ${model_name}`; + + if (submodel) { + modelString = modelString.concat(`, submodel: ${submodel}`); + } + + moduleLog.debug(action.payload, `Model load started (${modelString})`); + + // pass along the socket event as an application action + dispatch(appSocketModelLoadStarted(action.payload)); + }, + }); +}; diff --git a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/upscaleRequested.ts b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/upscaleRequested.ts new file mode 100644 index 0000000000..4b8ac59b88 --- /dev/null +++ b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/upscaleRequested.ts @@ -0,0 +1,37 @@ +import { createAction } from '@reduxjs/toolkit'; +import { log } from 'app/logging/useLogger'; +import { buildAdHocUpscaleGraph } from 'features/nodes/util/graphBuilders/buildAdHocUpscaleGraph'; +import { sessionReadyToInvoke } from 'features/system/store/actions'; +import { sessionCreated } from 'services/api/thunks/session'; +import { startAppListening } from '..'; + +const moduleLog = log.child({ namespace: 'upscale' }); + +export const upscaleRequested = createAction<{ image_name: string }>( + `upscale/upscaleRequested` +); + +export const addUpscaleRequestedListener = () => { + startAppListening({ + actionCreator: upscaleRequested, + effect: async ( + action, + { dispatch, getState, take, unsubscribe, subscribe } + ) => { + const { image_name } = action.payload; + const { esrganModelName } = getState().postprocessing; + + const graph = buildAdHocUpscaleGraph({ + image_name, + esrganModelName, + }); + + // Create a session to run the graph & wait til it's ready to invoke + dispatch(sessionCreated({ graph })); + + await take(sessionCreated.fulfilled.match); + + dispatch(sessionReadyToInvoke()); + }, + }); +}; diff --git a/invokeai/frontend/web/src/app/store/store.ts b/invokeai/frontend/web/src/app/store/store.ts index 80688a1585..4725a2f921 100644 --- a/invokeai/frontend/web/src/app/store/store.ts +++ b/invokeai/frontend/web/src/app/store/store.ts @@ -9,20 +9,19 @@ import { import dynamicMiddlewares from 'redux-dynamic-middlewares'; import { rememberEnhancer, rememberReducer } from 'redux-remember'; -import batchReducer from 'features/batch/store/batchSlice'; import canvasReducer from 'features/canvas/store/canvasSlice'; import controlNetReducer from 'features/controlNet/store/controlNetSlice'; import dynamicPromptsReducer from 'features/dynamicPrompts/store/slice'; import boardsReducer from 'features/gallery/store/boardSlice'; import galleryReducer from 'features/gallery/store/gallerySlice'; import imageDeletionReducer from 'features/imageDeletion/store/imageDeletionSlice'; -import lightboxReducer from 'features/lightbox/store/lightboxSlice'; import loraReducer from 'features/lora/store/loraSlice'; import nodesReducer from 'features/nodes/store/nodesSlice'; import generationReducer from 'features/parameters/store/generationSlice'; import postprocessingReducer from 'features/parameters/store/postprocessingSlice'; import configReducer from 'features/system/store/configSlice'; import systemReducer from 'features/system/store/systemSlice'; +import modelmanagerReducer from 'features/ui/components/tabs/ModelManager/store/modelManagerSlice'; import hotkeysReducer from 'features/ui/store/hotkeysSlice'; import uiReducer from 'features/ui/store/uiSlice'; @@ -40,7 +39,6 @@ const allReducers = { canvas: canvasReducer, gallery: galleryReducer, generation: generationReducer, - lightbox: lightboxReducer, nodes: nodesReducer, postprocessing: postprocessingReducer, system: systemReducer, @@ -50,9 +48,9 @@ const allReducers = { controlNet: controlNetReducer, boards: boardsReducer, dynamicPrompts: dynamicPromptsReducer, - batch: batchReducer, imageDeletion: imageDeletionReducer, lora: loraReducer, + modelmanager: modelmanagerReducer, [api.reducerPath]: api.reducer, }; @@ -64,18 +62,14 @@ const rememberedKeys: (keyof typeof allReducers)[] = [ 'canvas', 'gallery', 'generation', - 'lightbox', 'nodes', 'postprocessing', 'system', 'ui', 'controlNet', 'dynamicPrompts', - 'batch', 'lora', - // 'boards', - // 'hotkeys', - // 'config', + 'modelmanager', ]; export const store = configureStore({ @@ -101,10 +95,27 @@ export const store = configureStore({ .concat(dynamicMiddlewares) .prepend(listenerMiddleware.middleware), devTools: { - actionsDenylist, actionSanitizer, stateSanitizer, trace: true, + predicate: (state, action) => { + // TODO: hook up to the log level param in system slice + // manually type state, cannot type the arg + // const typedState = state as ReturnType; + + // TODO: doing this breaks the rtk query devtools, commenting out for now + // if (action.type.startsWith('api/')) { + // // don't log api actions, with manual cache updates they are extremely noisy + // return false; + // } + + if (actionsDenylist.includes(action.type)) { + // don't log other noisy actions + return false; + } + + return true; + }, }, }); diff --git a/invokeai/frontend/web/src/app/types/invokeai.ts b/invokeai/frontend/web/src/app/types/invokeai.ts index 229761dabb..be642a6435 100644 --- a/invokeai/frontend/web/src/app/types/invokeai.ts +++ b/invokeai/frontend/web/src/app/types/invokeai.ts @@ -1,5 +1,5 @@ import { - CONTROLNET_MODELS, + // CONTROLNET_MODELS, CONTROLNET_PROCESSORS, } from 'features/controlNet/store/constants'; import { InvokeTabName } from 'features/ui/store/tabMap'; @@ -94,7 +94,8 @@ export type AppFeature = | 'bugLink' | 'localization' | 'consoleLogging' - | 'dynamicPrompting'; + | 'dynamicPrompting' + | 'batches'; /** * A disable-able Stable Diffusion feature @@ -127,7 +128,7 @@ export type AppConfig = { canRestoreDeletedImagesFromBin: boolean; sd: { defaultModel?: string; - disabledControlNetModels: (keyof typeof CONTROLNET_MODELS)[]; + disabledControlNetModels: string[]; disabledControlNetProcessors: (keyof typeof CONTROLNET_PROCESSORS)[]; iterations: { initial: number; diff --git a/invokeai/frontend/web/src/common/components/IAIDndImage.tsx b/invokeai/frontend/web/src/common/components/IAIDndImage.tsx index 959a70bc29..c024622d2e 100644 --- a/invokeai/frontend/web/src/common/components/IAIDndImage.tsx +++ b/invokeai/frontend/web/src/common/components/IAIDndImage.tsx @@ -6,30 +6,22 @@ import { useColorMode, useColorModeValue, } from '@chakra-ui/react'; -import { useCombinedRefs } from '@dnd-kit/utilities'; -import IAIIconButton from 'common/components/IAIIconButton'; -import { - IAILoadingImageFallback, - IAINoContentFallback, -} from 'common/components/IAIImageFallback'; -import ImageMetadataOverlay from 'common/components/ImageMetadataOverlay'; -import { AnimatePresence } from 'framer-motion'; -import { MouseEvent, ReactElement, SyntheticEvent } from 'react'; -import { memo, useRef } from 'react'; -import { FaImage, FaUndo, FaUpload } from 'react-icons/fa'; -import { ImageDTO } from 'services/api/types'; -import { v4 as uuidv4 } from 'uuid'; -import IAIDropOverlay from './IAIDropOverlay'; -import { PostUploadAction } from 'services/api/thunks/image'; -import { useImageUploadButton } from 'common/hooks/useImageUploadButton'; -import { mode } from 'theme/util/mode'; import { TypesafeDraggableData, TypesafeDroppableData, - isValidDrop, - useDraggable, - useDroppable, } from 'app/components/ImageDnd/typesafeDnd'; +import IAIIconButton from 'common/components/IAIIconButton'; +import { IAINoContentFallback } from 'common/components/IAIImageFallback'; +import ImageMetadataOverlay from 'common/components/ImageMetadataOverlay'; +import { useImageUploadButton } from 'common/hooks/useImageUploadButton'; +import { MouseEvent, ReactElement, SyntheticEvent, memo } from 'react'; +import { FaImage, FaUndo, FaUpload } from 'react-icons/fa'; +import { PostUploadAction } from 'services/api/thunks/image'; +import { ImageDTO } from 'services/api/types'; +import { mode } from 'theme/util/mode'; +import IAIDraggable from './IAIDraggable'; +import IAIDroppable from './IAIDroppable'; +import ImageContextMenu from 'features/gallery/components/ImageContextMenu/ImageContextMenu'; type IAIDndImageProps = { imageDTO: ImageDTO | undefined; @@ -83,28 +75,6 @@ const IAIDndImage = (props: IAIDndImageProps) => { const { colorMode } = useColorMode(); - const dndId = useRef(uuidv4()); - - const { - attributes, - listeners, - setNodeRef: setDraggableRef, - isDragging, - active, - } = useDraggable({ - id: dndId.current, - disabled: isDragDisabled || !imageDTO, - data: draggableData, - }); - - const { isOver, setNodeRef: setDroppableRef } = useDroppable({ - id: dndId.current, - disabled: isDropDisabled, - data: droppableData, - }); - - const setDndRef = useCombinedRefs(setDroppableRef, setDraggableRef); - const { getUploadButtonProps, getUploadInputProps } = useImageUploadButton({ postUploadAction, isDisabled: isUploadDisabled, @@ -127,51 +97,98 @@ const IAIDndImage = (props: IAIDndImageProps) => { }; return ( - - {imageDTO && ( + + {(ref) => ( - } - onError={onError} - draggable={false} - sx={{ - objectFit: 'contain', - maxW: 'full', - maxH: 'full', - borderRadius: 'base', - shadow: isSelected ? 'selected.light' : undefined, - _dark: { shadow: isSelected ? 'selected.dark' : undefined }, - ...imageSx, - }} - /> - {withMetadataOverlay && } - {onClickReset && withResetIcon && ( + {imageDTO && ( + + } + width={imageDTO.width} + height={imageDTO.height} + onError={onError} + draggable={false} + sx={{ + objectFit: 'contain', + maxW: 'full', + maxH: 'full', + borderRadius: 'base', + shadow: isSelected ? 'selected.light' : undefined, + _dark: { shadow: isSelected ? 'selected.dark' : undefined }, + ...imageSx, + }} + /> + {withMetadataOverlay && } + + )} + {!imageDTO && !isUploadDisabled && ( + <> + + + + + + )} + {!imageDTO && isUploadDisabled && noContentFallback} + {!isDropDisabled && ( + + )} + {imageDTO && !isDragDisabled && ( + + )} + {onClickReset && withResetIcon && imageDTO && ( { )} )} - {!imageDTO && !isUploadDisabled && ( - <> - - - - - - )} - {!imageDTO && isUploadDisabled && noContentFallback} - - {isValidDrop(droppableData, active) && !isDragging && ( - - )} - - + ); }; diff --git a/invokeai/frontend/web/src/common/components/IAIDraggable.tsx b/invokeai/frontend/web/src/common/components/IAIDraggable.tsx new file mode 100644 index 0000000000..482a8ac604 --- /dev/null +++ b/invokeai/frontend/web/src/common/components/IAIDraggable.tsx @@ -0,0 +1,40 @@ +import { Box } from '@chakra-ui/react'; +import { + TypesafeDraggableData, + useDraggable, +} from 'app/components/ImageDnd/typesafeDnd'; +import { MouseEvent, memo, useRef } from 'react'; +import { v4 as uuidv4 } from 'uuid'; + +type IAIDraggableProps = { + disabled?: boolean; + data?: TypesafeDraggableData; + onClick?: (event: MouseEvent) => void; +}; + +const IAIDraggable = (props: IAIDraggableProps) => { + const { data, disabled, onClick } = props; + const dndId = useRef(uuidv4()); + + const { attributes, listeners, setNodeRef } = useDraggable({ + id: dndId.current, + disabled, + data, + }); + + return ( + + ); +}; + +export default memo(IAIDraggable); diff --git a/invokeai/frontend/web/src/common/components/IAIDroppable.tsx b/invokeai/frontend/web/src/common/components/IAIDroppable.tsx new file mode 100644 index 0000000000..98093d04e4 --- /dev/null +++ b/invokeai/frontend/web/src/common/components/IAIDroppable.tsx @@ -0,0 +1,47 @@ +import { Box } from '@chakra-ui/react'; +import { + TypesafeDroppableData, + isValidDrop, + useDroppable, +} from 'app/components/ImageDnd/typesafeDnd'; +import { AnimatePresence } from 'framer-motion'; +import { memo, useRef } from 'react'; +import { v4 as uuidv4 } from 'uuid'; +import IAIDropOverlay from './IAIDropOverlay'; + +type IAIDroppableProps = { + dropLabel?: string; + disabled?: boolean; + data?: TypesafeDroppableData; +}; + +const IAIDroppable = (props: IAIDroppableProps) => { + const { dropLabel, data, disabled } = props; + const dndId = useRef(uuidv4()); + + const { isOver, setNodeRef, active } = useDroppable({ + id: dndId.current, + disabled, + data, + }); + + return ( + + + {isValidDrop(data, active) && ( + + )} + + + ); +}; + +export default memo(IAIDroppable); diff --git a/invokeai/frontend/web/src/common/components/IAIErrorLoadingImageFallback.tsx b/invokeai/frontend/web/src/common/components/IAIErrorLoadingImageFallback.tsx new file mode 100644 index 0000000000..2136acc3c3 --- /dev/null +++ b/invokeai/frontend/web/src/common/components/IAIErrorLoadingImageFallback.tsx @@ -0,0 +1,42 @@ +import { Box, Flex, Icon } from '@chakra-ui/react'; +import { FaExclamation } from 'react-icons/fa'; + +const IAIErrorLoadingImageFallback = () => { + return ( + + + + + + ); +}; + +export default IAIErrorLoadingImageFallback; diff --git a/invokeai/frontend/web/src/common/components/IAIFillSkeleton.tsx b/invokeai/frontend/web/src/common/components/IAIFillSkeleton.tsx new file mode 100644 index 0000000000..a3c83cb734 --- /dev/null +++ b/invokeai/frontend/web/src/common/components/IAIFillSkeleton.tsx @@ -0,0 +1,30 @@ +import { Box, Skeleton } from '@chakra-ui/react'; + +const IAIFillSkeleton = () => { + return ( + + + + ); +}; + +export default IAIFillSkeleton; diff --git a/invokeai/frontend/web/src/common/components/IAIForms/IAIFormItemWrapper.tsx b/invokeai/frontend/web/src/common/components/IAIForms/IAIFormItemWrapper.tsx index 1b1ca29d76..83e91366c2 100644 --- a/invokeai/frontend/web/src/common/components/IAIForms/IAIFormItemWrapper.tsx +++ b/invokeai/frontend/web/src/common/components/IAIForms/IAIFormItemWrapper.tsx @@ -1,11 +1,13 @@ -import { Flex } from '@chakra-ui/react'; +import { Flex, useColorMode } from '@chakra-ui/react'; import { ReactElement } from 'react'; +import { mode } from 'theme/util/mode'; export function IAIFormItemWrapper({ children, }: { children: ReactElement | ReactElement[]; }) { + const { colorMode } = useColorMode(); return ( {children} diff --git a/invokeai/frontend/web/src/common/components/IAIInput.tsx b/invokeai/frontend/web/src/common/components/IAIInput.tsx index d114fc5968..31dac20998 100644 --- a/invokeai/frontend/web/src/common/components/IAIInput.tsx +++ b/invokeai/frontend/web/src/common/components/IAIInput.tsx @@ -8,19 +8,34 @@ import { import { useAppDispatch } from 'app/store/storeHooks'; import { stopPastePropagation } from 'common/util/stopPastePropagation'; import { shiftKeyPressed } from 'features/ui/store/hotkeysSlice'; -import { ChangeEvent, KeyboardEvent, memo, useCallback } from 'react'; +import { + CSSProperties, + ChangeEvent, + KeyboardEvent, + memo, + useCallback, +} from 'react'; interface IAIInputProps extends InputProps { label?: string; + labelPos?: 'top' | 'side'; value?: string; size?: string; onChange?: (e: ChangeEvent) => void; formControlProps?: Omit; } +const labelPosVerticalStyle: CSSProperties = { + display: 'flex', + flexDirection: 'row', + alignItems: 'center', + gap: 10, +}; + const IAIInput = (props: IAIInputProps) => { const { label = '', + labelPos = 'top', isDisabled = false, isInvalid, formControlProps, @@ -51,6 +66,7 @@ const IAIInput = (props: IAIInputProps) => { isInvalid={isInvalid} isDisabled={isDisabled} {...formControlProps} + style={labelPos === 'side' ? labelPosVerticalStyle : undefined} > {label !== '' && {label}} ({ + input: { + color: mode(base900, base100)(colorMode), + backgroundColor: mode(base50, base900)(colorMode), + borderColor: mode(base200, base800)(colorMode), + borderWidth: 2, + outline: 'none', + ':focus': { + borderColor: mode(accent300, accent500)(colorMode), + }, + }, + label: { + color: mode(base700, base300)(colorMode), + fontWeight: 'normal', + marginBottom: 4, + }, + })} + {...rest} + /> + ); +} diff --git a/invokeai/frontend/web/src/common/components/IAIMantineMultiSelect.tsx b/invokeai/frontend/web/src/common/components/IAIMantineMultiSelect.tsx index dc6db707e7..28c680b824 100644 --- a/invokeai/frontend/web/src/common/components/IAIMantineMultiSelect.tsx +++ b/invokeai/frontend/web/src/common/components/IAIMantineMultiSelect.tsx @@ -1,38 +1,26 @@ -import { Tooltip, useColorMode, useToken } from '@chakra-ui/react'; +import { FormControl, FormLabel, Tooltip } from '@chakra-ui/react'; import { MultiSelect, MultiSelectProps } from '@mantine/core'; import { useAppDispatch } from 'app/store/storeHooks'; -import { useChakraThemeTokens } from 'common/hooks/useChakraThemeTokens'; import { shiftKeyPressed } from 'features/ui/store/hotkeysSlice'; +import { useMantineMultiSelectStyles } from 'mantine-theme/hooks/useMantineMultiSelectStyles'; import { KeyboardEvent, RefObject, memo, useCallback } from 'react'; -import { mode } from 'theme/util/mode'; -type IAIMultiSelectProps = MultiSelectProps & { +type IAIMultiSelectProps = Omit & { tooltip?: string; inputRef?: RefObject; + label?: string; }; const IAIMantineMultiSelect = (props: IAIMultiSelectProps) => { - const { searchable = true, tooltip, inputRef, ...rest } = props; - const dispatch = useAppDispatch(); const { - base50, - base100, - base200, - base300, - base400, - base500, - base600, - base700, - base800, - base900, - accent200, - accent300, - accent400, - accent500, - accent600, - } = useChakraThemeTokens(); - const [boxShadow] = useToken('shadows', ['dark-lg']); - const { colorMode } = useColorMode(); + searchable = true, + tooltip, + inputRef, + label, + disabled, + ...rest + } = props; + const dispatch = useAppDispatch(); const handleKeyDown = useCallback( (e: KeyboardEvent) => { @@ -52,100 +40,25 @@ const IAIMantineMultiSelect = (props: IAIMultiSelectProps) => { [dispatch] ); + const styles = useMantineMultiSelectStyles(); + return ( + {label} +
+ ) : undefined + } ref={inputRef} + disabled={disabled} onKeyDown={handleKeyDown} onKeyUp={handleKeyUp} searchable={searchable} maxDropdownHeight={300} - styles={() => ({ - label: { - color: mode(base700, base300)(colorMode), - fontWeight: 'normal', - }, - searchInput: { - ':placeholder': { - color: mode(base300, base700)(colorMode), - }, - }, - input: { - backgroundColor: mode(base50, base900)(colorMode), - borderWidth: '2px', - borderColor: mode(base200, base800)(colorMode), - color: mode(base900, base100)(colorMode), - paddingRight: 24, - fontWeight: 600, - '&:hover': { borderColor: mode(base300, base600)(colorMode) }, - '&:focus': { - borderColor: mode(accent300, accent600)(colorMode), - }, - '&:is(:focus, :hover)': { - borderColor: mode(base400, base500)(colorMode), - }, - '&:focus-within': { - borderColor: mode(accent200, accent600)(colorMode), - }, - '&[data-disabled]': { - backgroundColor: mode(base300, base700)(colorMode), - color: mode(base600, base400)(colorMode), - cursor: 'not-allowed', - }, - }, - value: { - backgroundColor: mode(base200, base800)(colorMode), - color: mode(base900, base100)(colorMode), - button: { - color: mode(base900, base100)(colorMode), - }, - '&:hover': { - backgroundColor: mode(base300, base700)(colorMode), - cursor: 'pointer', - }, - }, - dropdown: { - backgroundColor: mode(base200, base800)(colorMode), - borderColor: mode(base200, base800)(colorMode), - boxShadow, - }, - item: { - backgroundColor: mode(base200, base800)(colorMode), - color: mode(base800, base200)(colorMode), - padding: 6, - '&[data-hovered]': { - color: mode(base900, base100)(colorMode), - backgroundColor: mode(base300, base700)(colorMode), - }, - '&[data-active]': { - backgroundColor: mode(base300, base700)(colorMode), - '&:hover': { - color: mode(base900, base100)(colorMode), - backgroundColor: mode(base300, base700)(colorMode), - }, - }, - '&[data-selected]': { - backgroundColor: mode(accent400, accent600)(colorMode), - color: mode(base50, base100)(colorMode), - fontWeight: 600, - '&:hover': { - backgroundColor: mode(accent500, accent500)(colorMode), - color: mode('white', base50)(colorMode), - }, - }, - '&[data-disabled]': { - color: mode(base500, base600)(colorMode), - cursor: 'not-allowed', - }, - }, - rightSection: { - width: 24, - padding: 20, - button: { - color: mode(base900, base100)(colorMode), - }, - }, - })} + styles={styles} {...rest} /> diff --git a/invokeai/frontend/web/src/common/components/IAIMantineSearchableSelect.tsx b/invokeai/frontend/web/src/common/components/IAIMantineSearchableSelect.tsx new file mode 100644 index 0000000000..2c3f5434ad --- /dev/null +++ b/invokeai/frontend/web/src/common/components/IAIMantineSearchableSelect.tsx @@ -0,0 +1,95 @@ +import { FormControl, FormLabel, Tooltip } from '@chakra-ui/react'; +import { Select, SelectProps } from '@mantine/core'; +import { useAppDispatch } from 'app/store/storeHooks'; +import { shiftKeyPressed } from 'features/ui/store/hotkeysSlice'; +import { useMantineSelectStyles } from 'mantine-theme/hooks/useMantineSelectStyles'; +import { KeyboardEvent, RefObject, memo, useCallback, useState } from 'react'; + +export type IAISelectDataType = { + value: string; + label: string; + tooltip?: string; +}; + +type IAISelectProps = Omit & { + tooltip?: string; + label?: string; + inputRef?: RefObject; +}; + +const IAIMantineSearchableSelect = (props: IAISelectProps) => { + const { + searchable = true, + tooltip, + inputRef, + onChange, + label, + disabled, + ...rest + } = props; + const dispatch = useAppDispatch(); + + const [searchValue, setSearchValue] = useState(''); + + // we want to capture shift keypressed even when an input is focused + const handleKeyDown = useCallback( + (e: KeyboardEvent) => { + if (e.shiftKey) { + dispatch(shiftKeyPressed(true)); + } + }, + [dispatch] + ); + + const handleKeyUp = useCallback( + (e: KeyboardEvent) => { + if (!e.shiftKey) { + dispatch(shiftKeyPressed(false)); + } + }, + [dispatch] + ); + + // wrap onChange to clear search value on select + const handleChange = useCallback( + (v: string | null) => { + setSearchValue(''); + + if (!onChange) { + return; + } + + onChange(v); + }, + [onChange] + ); + + const styles = useMantineSelectStyles(); + + return ( + + + {label} + + ) : undefined + } + disabled={disabled} ref={inputRef} - searchValue={searchValue} - onSearchChange={setSearchValue} - onChange={handleChange} - onKeyDown={handleKeyDown} - onKeyUp={handleKeyUp} - searchable={searchable} - maxDropdownHeight={300} - styles={() => ({ - label: { - color: mode(base700, base300)(colorMode), - fontWeight: 'normal', - }, - input: { - backgroundColor: mode(base50, base900)(colorMode), - borderWidth: '2px', - borderColor: mode(base200, base800)(colorMode), - color: mode(base900, base100)(colorMode), - paddingRight: 24, - fontWeight: 600, - '&:hover': { borderColor: mode(base300, base600)(colorMode) }, - '&:focus': { - borderColor: mode(accent300, accent600)(colorMode), - }, - '&:is(:focus, :hover)': { - borderColor: mode(base400, base500)(colorMode), - }, - '&:focus-within': { - borderColor: mode(accent200, accent600)(colorMode), - }, - '&[data-disabled]': { - backgroundColor: mode(base300, base700)(colorMode), - color: mode(base600, base400)(colorMode), - cursor: 'not-allowed', - }, - }, - value: { - backgroundColor: mode(base100, base900)(colorMode), - color: mode(base900, base100)(colorMode), - button: { - color: mode(base900, base100)(colorMode), - }, - '&:hover': { - backgroundColor: mode(base300, base700)(colorMode), - cursor: 'pointer', - }, - }, - dropdown: { - backgroundColor: mode(base200, base800)(colorMode), - borderColor: mode(base200, base800)(colorMode), - boxShadow, - }, - item: { - backgroundColor: mode(base200, base800)(colorMode), - color: mode(base800, base200)(colorMode), - padding: 6, - '&[data-hovered]': { - color: mode(base900, base100)(colorMode), - backgroundColor: mode(base300, base700)(colorMode), - }, - '&[data-active]': { - backgroundColor: mode(base300, base700)(colorMode), - '&:hover': { - color: mode(base900, base100)(colorMode), - backgroundColor: mode(base300, base700)(colorMode), - }, - }, - '&[data-selected]': { - backgroundColor: mode(accent400, accent600)(colorMode), - color: mode(base50, base100)(colorMode), - fontWeight: 600, - '&:hover': { - backgroundColor: mode(accent500, accent500)(colorMode), - color: mode('white', base50)(colorMode), - }, - }, - '&[data-disabled]': { - color: mode(base500, base600)(colorMode), - cursor: 'not-allowed', - }, - }, - rightSection: { - width: 32, - button: { - color: mode(base900, base100)(colorMode), - }, - }, - })} + styles={styles} {...rest} /> diff --git a/invokeai/frontend/web/src/common/components/IAIMantineSelectItemWithTooltip.tsx b/invokeai/frontend/web/src/common/components/IAIMantineSelectItemWithTooltip.tsx index 65ba4020c8..6b56bdf9e9 100644 --- a/invokeai/frontend/web/src/common/components/IAIMantineSelectItemWithTooltip.tsx +++ b/invokeai/frontend/web/src/common/components/IAIMantineSelectItemWithTooltip.tsx @@ -11,7 +11,7 @@ interface ItemProps extends React.ComponentPropsWithoutRef<'div'> { const IAIMantineSelectItemWithTooltip = forwardRef( ({ label, tooltip, description, disabled, ...others }: ItemProps, ref) => ( - + {label} diff --git a/invokeai/frontend/web/src/common/components/IAINumberInput.tsx b/invokeai/frontend/web/src/common/components/IAINumberInput.tsx index 8f675cc148..de3b44564a 100644 --- a/invokeai/frontend/web/src/common/components/IAINumberInput.tsx +++ b/invokeai/frontend/web/src/common/components/IAINumberInput.tsx @@ -28,7 +28,7 @@ import { useState, } from 'react'; -const numberStringRegex = /^-?(0\.)?\.?$/; +export const numberStringRegex = /^-?(0\.)?\.?$/; interface Props extends Omit { label?: string; diff --git a/invokeai/frontend/web/src/common/components/IAISlider.tsx b/invokeai/frontend/web/src/common/components/IAISlider.tsx index d99fbfa149..3e7f38cf91 100644 --- a/invokeai/frontend/web/src/common/components/IAISlider.tsx +++ b/invokeai/frontend/web/src/common/components/IAISlider.tsx @@ -43,11 +43,6 @@ import { useTranslation } from 'react-i18next'; import { BiReset } from 'react-icons/bi'; import IAIIconButton, { IAIIconButtonProps } from './IAIIconButton'; -const SLIDER_MARK_STYLES: ChakraProps['sx'] = { - mt: 1.5, - fontSize: '2xs', -}; - export type IAIFullSliderProps = { label?: string; value: number; @@ -207,7 +202,7 @@ const IAISlider = (props: IAIFullSliderProps) => { {...sliderFormControlProps} > {label && ( - + {label} )} @@ -233,7 +228,6 @@ const IAISlider = (props: IAIFullSliderProps) => { sx={{ insetInlineStart: '0 !important', insetInlineEnd: 'unset !important', - ...SLIDER_MARK_STYLES, }} {...sliderMarkProps} > @@ -244,7 +238,6 @@ const IAISlider = (props: IAIFullSliderProps) => { sx={{ insetInlineStart: 'unset !important', insetInlineEnd: '0 !important', - ...SLIDER_MARK_STYLES, }} {...sliderMarkProps} > @@ -263,7 +256,6 @@ const IAISlider = (props: IAIFullSliderProps) => { sx={{ insetInlineStart: '0 !important', insetInlineEnd: 'unset !important', - ...SLIDER_MARK_STYLES, }} {...sliderMarkProps} > @@ -278,7 +270,6 @@ const IAISlider = (props: IAIFullSliderProps) => { sx={{ insetInlineStart: 'unset !important', insetInlineEnd: '0 !important', - ...SLIDER_MARK_STYLES, }} {...sliderMarkProps} > @@ -291,7 +282,7 @@ const IAISlider = (props: IAIFullSliderProps) => { key={m} value={m} sx={{ - ...SLIDER_MARK_STYLES, + transform: 'translateX(-50%)', }} {...sliderMarkProps} > diff --git a/invokeai/frontend/web/src/common/hooks/useIsReadyToInvoke.ts b/invokeai/frontend/web/src/common/hooks/useIsReadyToInvoke.ts index 605aa8b162..580206266d 100644 --- a/invokeai/frontend/web/src/common/hooks/useIsReadyToInvoke.ts +++ b/invokeai/frontend/web/src/common/hooks/useIsReadyToInvoke.ts @@ -3,36 +3,23 @@ import { stateSelector } from 'app/store/store'; import { useAppSelector } from 'app/store/storeHooks'; import { defaultSelectorOptions } from 'app/store/util/defaultMemoizeOptions'; import { validateSeedWeights } from 'common/util/seedWeightPairs'; -import { generationSelector } from 'features/parameters/store/generationSelectors'; -import { systemSelector } from 'features/system/store/systemSelectors'; import { activeTabNameSelector } from 'features/ui/store/uiSelectors'; -import { - modelsApi, - useGetMainModelsQuery, -} from '../../services/api/endpoints/models'; +import { modelsApi } from '../../services/api/endpoints/models'; +import { forEach } from 'lodash-es'; const readinessSelector = createSelector( [stateSelector, activeTabNameSelector], (state, activeTabName) => { - const { generation, system, batch } = state; + const { generation, system } = state; const { shouldGenerateVariations, seedWeights, initialImage, seed } = generation; const { isProcessing, isConnected } = system; - const { - isEnabled: isBatchEnabled, - asInitialImage, - imageNames: batchImageNames, - } = batch; let isReady = true; const reasonsWhyNotReady: string[] = []; - if ( - activeTabName === 'img2img' && - !initialImage && - !(asInitialImage && batchImageNames.length > 1) - ) { + if (activeTabName === 'img2img' && !initialImage) { isReady = false; reasonsWhyNotReady.push('No initial image selected'); } @@ -66,6 +53,13 @@ const readinessSelector = createSelector( reasonsWhyNotReady.push('Seed-Weights badly formatted.'); } + forEach(state.controlNet.controlNets, (controlNet, id) => { + if (!controlNet.model) { + isReady = false; + reasonsWhyNotReady.push('ControlNet ${id} has no model selected.'); + } + }); + // All good return { isReady, reasonsWhyNotReady }; }, diff --git a/invokeai/frontend/web/src/common/util/getTimestamp.ts b/invokeai/frontend/web/src/common/util/getTimestamp.ts index 570283fa8f..daa9f8dc33 100644 --- a/invokeai/frontend/web/src/common/util/getTimestamp.ts +++ b/invokeai/frontend/web/src/common/util/getTimestamp.ts @@ -3,4 +3,5 @@ import dateFormat from 'dateformat'; /** * Get a `now` timestamp with 1s precision, formatted as ISO datetime. */ -export const getTimestamp = () => dateFormat(new Date(), 'isoDateTime'); +export const getTimestamp = () => + dateFormat(new Date(), `yyyy-mm-dd'T'HH:MM:ss:lo`); diff --git a/invokeai/frontend/web/src/features/batch/components/BatchControlNet.tsx b/invokeai/frontend/web/src/features/batch/components/BatchControlNet.tsx deleted file mode 100644 index 4231c84bec..0000000000 --- a/invokeai/frontend/web/src/features/batch/components/BatchControlNet.tsx +++ /dev/null @@ -1,67 +0,0 @@ -import { - Flex, - FormControl, - FormLabel, - Heading, - Spacer, - Switch, - Text, -} from '@chakra-ui/react'; -import { createSelector } from '@reduxjs/toolkit'; -import { stateSelector } from 'app/store/store'; -import { useAppDispatch, useAppSelector } from 'app/store/storeHooks'; -import { defaultSelectorOptions } from 'app/store/util/defaultMemoizeOptions'; -import IAISwitch from 'common/components/IAISwitch'; -import { ControlNetConfig } from 'features/controlNet/store/controlNetSlice'; -import { ChangeEvent, memo, useCallback } from 'react'; -import { controlNetToggled } from '../store/batchSlice'; - -type Props = { - controlNet: ControlNetConfig; -}; - -const selector = createSelector( - [stateSelector, (state, controlNetId: string) => controlNetId], - (state, controlNetId) => { - const isControlNetEnabled = state.batch.controlNets.includes(controlNetId); - return { isControlNetEnabled }; - }, - defaultSelectorOptions -); - -const BatchControlNet = (props: Props) => { - const dispatch = useAppDispatch(); - const { isControlNetEnabled } = useAppSelector((state) => - selector(state, props.controlNet.controlNetId) - ); - const { processorType, model } = props.controlNet; - - const handleChangeAsControlNet = useCallback(() => { - dispatch(controlNetToggled(props.controlNet.controlNetId)); - }, [dispatch, props.controlNet.controlNetId]); - - return ( - - - - - ControlNet - - - - - - - Model: {model} - - - Processor: {processorType} - - - ); -}; - -export default memo(BatchControlNet); diff --git a/invokeai/frontend/web/src/features/batch/components/BatchImage.tsx b/invokeai/frontend/web/src/features/batch/components/BatchImage.tsx deleted file mode 100644 index 4a6250f93a..0000000000 --- a/invokeai/frontend/web/src/features/batch/components/BatchImage.tsx +++ /dev/null @@ -1,116 +0,0 @@ -import { Box, Icon, Skeleton } from '@chakra-ui/react'; -import { createSelector } from '@reduxjs/toolkit'; -import { TypesafeDraggableData } from 'app/components/ImageDnd/typesafeDnd'; -import { stateSelector } from 'app/store/store'; -import { useAppDispatch, useAppSelector } from 'app/store/storeHooks'; -import { defaultSelectorOptions } from 'app/store/util/defaultMemoizeOptions'; -import IAIDndImage from 'common/components/IAIDndImage'; -import { - batchImageRangeEndSelected, - batchImageSelected, - batchImageSelectionToggled, - imageRemovedFromBatch, -} from 'features/batch/store/batchSlice'; -import { MouseEvent, memo, useCallback, useMemo } from 'react'; -import { FaExclamationCircle } from 'react-icons/fa'; -import { useGetImageDTOQuery } from 'services/api/endpoints/images'; - -const makeSelector = (image_name: string) => - createSelector( - [stateSelector], - (state) => ({ - selectionCount: state.batch.selection.length, - isSelected: state.batch.selection.includes(image_name), - }), - defaultSelectorOptions - ); - -type BatchImageProps = { - imageName: string; -}; - -const BatchImage = (props: BatchImageProps) => { - const { - currentData: imageDTO, - isFetching, - isError, - isSuccess, - } = useGetImageDTOQuery(props.imageName); - const dispatch = useAppDispatch(); - - const selector = useMemo( - () => makeSelector(props.imageName), - [props.imageName] - ); - - const { isSelected, selectionCount } = useAppSelector(selector); - - const handleClickRemove = useCallback(() => { - dispatch(imageRemovedFromBatch(props.imageName)); - }, [dispatch, props.imageName]); - - const handleClick = useCallback( - (e: MouseEvent) => { - if (e.shiftKey) { - dispatch(batchImageRangeEndSelected(props.imageName)); - } else if (e.ctrlKey || e.metaKey) { - dispatch(batchImageSelectionToggled(props.imageName)); - } else { - dispatch(batchImageSelected(props.imageName)); - } - }, - [dispatch, props.imageName] - ); - - const draggableData = useMemo(() => { - if (selectionCount > 1) { - return { - id: 'batch', - payloadType: 'BATCH_SELECTION', - }; - } - - if (imageDTO) { - return { - id: 'batch', - payloadType: 'IMAGE_DTO', - payload: { imageDTO }, - }; - } - }, [imageDTO, selectionCount]); - - if (isError) { - return ; - } - - if (isFetching) { - return ( - - - - ); - } - - return ( - - - - ); -}; - -export default memo(BatchImage); diff --git a/invokeai/frontend/web/src/features/batch/components/BatchImageContainer.tsx b/invokeai/frontend/web/src/features/batch/components/BatchImageContainer.tsx deleted file mode 100644 index 09e6b8afd7..0000000000 --- a/invokeai/frontend/web/src/features/batch/components/BatchImageContainer.tsx +++ /dev/null @@ -1,31 +0,0 @@ -import { Box } from '@chakra-ui/react'; -import BatchImageGrid from './BatchImageGrid'; -import IAIDropOverlay from 'common/components/IAIDropOverlay'; -import { - AddToBatchDropData, - isValidDrop, - useDroppable, -} from 'app/components/ImageDnd/typesafeDnd'; - -const droppableData: AddToBatchDropData = { - id: 'batch', - actionType: 'ADD_TO_BATCH', -}; - -const BatchImageContainer = () => { - const { isOver, setNodeRef, active } = useDroppable({ - id: 'batch-manager', - data: droppableData, - }); - - return ( - - - {isValidDrop(droppableData, active) && ( - - )} - - ); -}; - -export default BatchImageContainer; diff --git a/invokeai/frontend/web/src/features/batch/components/BatchImageGrid.tsx b/invokeai/frontend/web/src/features/batch/components/BatchImageGrid.tsx deleted file mode 100644 index f61d27d4cf..0000000000 --- a/invokeai/frontend/web/src/features/batch/components/BatchImageGrid.tsx +++ /dev/null @@ -1,54 +0,0 @@ -import { FaImages } from 'react-icons/fa'; -import { Grid, GridItem } from '@chakra-ui/react'; -import { createSelector } from '@reduxjs/toolkit'; -import { stateSelector } from 'app/store/store'; -import { useAppSelector } from 'app/store/storeHooks'; -import { defaultSelectorOptions } from 'app/store/util/defaultMemoizeOptions'; -import BatchImage from './BatchImage'; -import { IAINoContentFallback } from 'common/components/IAIImageFallback'; - -const selector = createSelector( - stateSelector, - (state) => { - const imageNames = state.batch.imageNames.concat().reverse(); - - return { imageNames }; - }, - defaultSelectorOptions -); - -const BatchImageGrid = () => { - const { imageNames } = useAppSelector(selector); - - if (imageNames.length === 0) { - return ( - - ); - } - - return ( - - {imageNames.map((imageName) => ( - - - - ))} - - ); -}; - -export default BatchImageGrid; diff --git a/invokeai/frontend/web/src/features/batch/components/BatchManager.tsx b/invokeai/frontend/web/src/features/batch/components/BatchManager.tsx deleted file mode 100644 index d7855dd4e2..0000000000 --- a/invokeai/frontend/web/src/features/batch/components/BatchManager.tsx +++ /dev/null @@ -1,103 +0,0 @@ -import { Flex, Heading, Spacer } from '@chakra-ui/react'; -import { createSelector } from '@reduxjs/toolkit'; -import { stateSelector } from 'app/store/store'; -import { useAppDispatch, useAppSelector } from 'app/store/storeHooks'; -import { useCallback } from 'react'; -import IAISwitch from 'common/components/IAISwitch'; -import { - asInitialImageToggled, - batchReset, - isEnabledChanged, -} from 'features/batch/store/batchSlice'; -import { defaultSelectorOptions } from 'app/store/util/defaultMemoizeOptions'; -import IAIButton from 'common/components/IAIButton'; -import BatchImageContainer from './BatchImageGrid'; -import { map } from 'lodash-es'; -import BatchControlNet from './BatchControlNet'; - -const selector = createSelector( - stateSelector, - (state) => { - const { controlNets } = state.controlNet; - const { - imageNames, - asInitialImage, - controlNets: batchControlNets, - isEnabled, - } = state.batch; - - return { - imageCount: imageNames.length, - asInitialImage, - controlNets, - batchControlNets, - isEnabled, - }; - }, - defaultSelectorOptions -); - -const BatchManager = () => { - const dispatch = useAppDispatch(); - const { imageCount, isEnabled, controlNets, batchControlNets } = - useAppSelector(selector); - - const handleResetBatch = useCallback(() => { - dispatch(batchReset()); - }, [dispatch]); - - const handleToggle = useCallback(() => { - dispatch(isEnabledChanged(!isEnabled)); - }, [dispatch, isEnabled]); - - const handleChangeAsInitialImage = useCallback(() => { - dispatch(asInitialImageToggled()); - }, [dispatch]); - - return ( - - - - {imageCount || 'No'} images - - - Reset - - - - {map(controlNets, (controlNet) => { - return ( - - ); - })} - - - - ); -}; - -export default BatchManager; diff --git a/invokeai/frontend/web/src/features/batch/store/batchSlice.ts b/invokeai/frontend/web/src/features/batch/store/batchSlice.ts deleted file mode 100644 index 6a96361d3f..0000000000 --- a/invokeai/frontend/web/src/features/batch/store/batchSlice.ts +++ /dev/null @@ -1,142 +0,0 @@ -import { PayloadAction, createAction, createSlice } from '@reduxjs/toolkit'; -import { uniq } from 'lodash-es'; -import { imageDeleted } from 'services/api/thunks/image'; - -type BatchState = { - isEnabled: boolean; - imageNames: string[]; - asInitialImage: boolean; - controlNets: string[]; - selection: string[]; -}; - -export const initialBatchState: BatchState = { - isEnabled: false, - imageNames: [], - asInitialImage: false, - controlNets: [], - selection: [], -}; - -const batch = createSlice({ - name: 'batch', - initialState: initialBatchState, - reducers: { - isEnabledChanged: (state, action: PayloadAction) => { - state.isEnabled = action.payload; - }, - imageAddedToBatch: (state, action: PayloadAction) => { - state.imageNames = uniq(state.imageNames.concat(action.payload)); - }, - imagesAddedToBatch: (state, action: PayloadAction) => { - state.imageNames = uniq(state.imageNames.concat(action.payload)); - }, - imageRemovedFromBatch: (state, action: PayloadAction) => { - state.imageNames = state.imageNames.filter( - (imageName) => action.payload !== imageName - ); - state.selection = state.selection.filter( - (imageName) => action.payload !== imageName - ); - }, - imagesRemovedFromBatch: (state, action: PayloadAction) => { - state.imageNames = state.imageNames.filter( - (imageName) => !action.payload.includes(imageName) - ); - state.selection = state.selection.filter( - (imageName) => !action.payload.includes(imageName) - ); - }, - batchImageRangeEndSelected: (state, action: PayloadAction) => { - const rangeEndImageName = action.payload; - const lastSelectedImage = state.selection[state.selection.length - 1]; - const lastClickedIndex = state.imageNames.findIndex( - (n) => n === lastSelectedImage - ); - const currentClickedIndex = state.imageNames.findIndex( - (n) => n === rangeEndImageName - ); - if (lastClickedIndex > -1 && currentClickedIndex > -1) { - // We have a valid range! - const start = Math.min(lastClickedIndex, currentClickedIndex); - const end = Math.max(lastClickedIndex, currentClickedIndex); - - const imagesToSelect = state.imageNames.slice(start, end + 1); - state.selection = uniq(state.selection.concat(imagesToSelect)); - } - }, - batchImageSelectionToggled: (state, action: PayloadAction) => { - if ( - state.selection.includes(action.payload) && - state.selection.length > 1 - ) { - state.selection = state.selection.filter( - (imageName) => imageName !== action.payload - ); - } else { - state.selection = uniq(state.selection.concat(action.payload)); - } - }, - batchImageSelected: (state, action: PayloadAction) => { - state.selection = action.payload - ? [action.payload] - : [String(state.imageNames[0])]; - }, - batchReset: (state) => { - state.imageNames = []; - state.selection = []; - }, - asInitialImageToggled: (state) => { - state.asInitialImage = !state.asInitialImage; - }, - controlNetAddedToBatch: (state, action: PayloadAction) => { - state.controlNets = uniq(state.controlNets.concat(action.payload)); - }, - controlNetRemovedFromBatch: (state, action: PayloadAction) => { - state.controlNets = state.controlNets.filter( - (controlNetId) => controlNetId !== action.payload - ); - }, - controlNetToggled: (state, action: PayloadAction) => { - if (state.controlNets.includes(action.payload)) { - state.controlNets = state.controlNets.filter( - (controlNetId) => controlNetId !== action.payload - ); - } else { - state.controlNets = uniq(state.controlNets.concat(action.payload)); - } - }, - }, - extraReducers: (builder) => { - builder.addCase(imageDeleted.fulfilled, (state, action) => { - state.imageNames = state.imageNames.filter( - (imageName) => imageName !== action.meta.arg.image_name - ); - state.selection = state.selection.filter( - (imageName) => imageName !== action.meta.arg.image_name - ); - }); - }, -}); - -export const { - isEnabledChanged, - imageAddedToBatch, - imagesAddedToBatch, - imageRemovedFromBatch, - imagesRemovedFromBatch, - asInitialImageToggled, - controlNetAddedToBatch, - controlNetRemovedFromBatch, - batchReset, - controlNetToggled, - batchImageRangeEndSelected, - batchImageSelectionToggled, - batchImageSelected, -} = batch.actions; - -export default batch.reducer; - -export const selectionAddedToBatch = createAction( - 'batch/selectionAddedToBatch' -); diff --git a/invokeai/frontend/web/src/features/canvas/components/IAICanvasToolbar/IAICanvasBoundingBox.tsx b/invokeai/frontend/web/src/features/canvas/components/IAICanvasToolbar/IAICanvasBoundingBox.tsx index 3421749658..3086e001c2 100644 --- a/invokeai/frontend/web/src/features/canvas/components/IAICanvasToolbar/IAICanvasBoundingBox.tsx +++ b/invokeai/frontend/web/src/features/canvas/components/IAICanvasToolbar/IAICanvasBoundingBox.tsx @@ -11,6 +11,7 @@ import { setIsMouseOverBoundingBox, setIsMovingBoundingBox, setIsTransformingBoundingBox, + setShouldSnapToGrid, } from 'features/canvas/store/canvasSlice'; import { uiSelector } from 'features/ui/store/uiSelectors'; import Konva from 'konva'; @@ -20,6 +21,7 @@ import { Vector2d } from 'konva/lib/types'; import { isEqual } from 'lodash-es'; import { useCallback, useEffect, useRef, useState } from 'react'; +import { useHotkeys } from 'react-hotkeys-hook'; import { Group, Rect, Transformer } from 'react-konva'; const boundingBoxPreviewSelector = createSelector( @@ -91,6 +93,10 @@ const IAICanvasBoundingBox = (props: IAICanvasBoundingBoxPreviewProps) => { const scaledStep = 64 * stageScale; + useHotkeys('N', () => { + dispatch(setShouldSnapToGrid(!shouldSnapToGrid)); + }); + const handleOnDragMove = useCallback( (e: KonvaEventObject) => { if (!shouldSnapToGrid) { diff --git a/invokeai/frontend/web/src/features/canvas/components/IAICanvasToolbar/IAICanvasToolChooserOptions.tsx b/invokeai/frontend/web/src/features/canvas/components/IAICanvasToolbar/IAICanvasToolChooserOptions.tsx index 794b8ba795..158e2954af 100644 --- a/invokeai/frontend/web/src/features/canvas/components/IAICanvasToolbar/IAICanvasToolChooserOptions.tsx +++ b/invokeai/frontend/web/src/features/canvas/components/IAICanvasToolbar/IAICanvasToolChooserOptions.tsx @@ -139,7 +139,7 @@ const IAICanvasToolChooserOptions = () => { ); useHotkeys( - ['shift+BracketLeft'], + ['Shift+BracketLeft'], () => { dispatch( setBrushColor({ @@ -156,7 +156,7 @@ const IAICanvasToolChooserOptions = () => { ); useHotkeys( - ['shift+BracketRight'], + ['Shift+BracketRight'], () => { dispatch( setBrushColor({ diff --git a/invokeai/frontend/web/src/features/canvas/components/IAICanvasToolbar/IAICanvasToolbar.tsx b/invokeai/frontend/web/src/features/canvas/components/IAICanvasToolbar/IAICanvasToolbar.tsx index 8c46d67de3..e90c771c63 100644 --- a/invokeai/frontend/web/src/features/canvas/components/IAICanvasToolbar/IAICanvasToolbar.tsx +++ b/invokeai/frontend/web/src/features/canvas/components/IAICanvasToolbar/IAICanvasToolbar.tsx @@ -24,7 +24,7 @@ import { getCanvasBaseLayer } from 'features/canvas/util/konvaInstanceProvider'; import { systemSelector } from 'features/system/store/systemSelectors'; import { isEqual } from 'lodash-es'; -import IAIMantineSelect from 'common/components/IAIMantineSelect'; +import IAIMantineSearchableSelect from 'common/components/IAIMantineSearchableSelect'; import { canvasCopiedToClipboard, canvasDownloadedAsImage, @@ -48,6 +48,7 @@ import IAICanvasRedoButton from './IAICanvasRedoButton'; import IAICanvasSettingsButtonPopover from './IAICanvasSettingsButtonPopover'; import IAICanvasToolChooserOptions from './IAICanvasToolChooserOptions'; import IAICanvasUndoButton from './IAICanvasUndoButton'; +import { useCopyImageToClipboard } from 'features/ui/hooks/useCopyImageToClipboard'; export const selector = createSelector( [systemSelector, canvasSelector, isStagingSelector], @@ -79,6 +80,7 @@ const IAICanvasToolbar = () => { const canvasBaseLayer = getCanvasBaseLayer(); const { t } = useTranslation(); + const { isClipboardAPIAvailable } = useCopyImageToClipboard(); const { openUploader } = useImageUploader(); @@ -136,10 +138,10 @@ const IAICanvasToolbar = () => { handleCopyImageToClipboard(); }, { - enabled: () => !isStaging, + enabled: () => !isStaging && isClipboardAPIAvailable, preventDefault: true, }, - [canvasBaseLayer, isProcessing] + [canvasBaseLayer, isProcessing, isClipboardAPIAvailable] ); useHotkeys( @@ -189,6 +191,9 @@ const IAICanvasToolbar = () => { }; const handleCopyImageToClipboard = () => { + if (!isClipboardAPIAvailable) { + return; + } dispatch(canvasCopiedToClipboard()); }; @@ -213,7 +218,7 @@ const IAICanvasToolbar = () => { }} > - { onClick={handleSaveToGallery} isDisabled={isStaging} /> - } - onClick={handleCopyImageToClipboard} - isDisabled={isStaging} - /> + {isClipboardAPIAvailable && ( + } + onClick={handleCopyImageToClipboard} + isDisabled={isStaging} + /> + )} { - const { - controlNetId, - isEnabled, - model, - weight, - beginStepPct, - endStepPct, - controlMode, - controlImage, - processedControlImage, - processorNode, - processorType, - shouldAutoConfig, - } = props.controlNet; + const { controlNetId } = props; const dispatch = useAppDispatch(); + + const selector = createSelector( + stateSelector, + ({ controlNet }) => { + const { isEnabled, shouldAutoConfig } = + controlNet.controlNets[controlNetId]; + + return { isEnabled, shouldAutoConfig }; + }, + defaultSelectorOptions + ); + + const { isEnabled, shouldAutoConfig } = useAppSelector(selector); const [isExpanded, toggleIsExpanded] = useToggle(false); - const { colorMode } = useColorMode(); + const handleDelete = useCallback(() => { dispatch(controlNetRemoved({ controlNetId })); }, [controlNetId, dispatch]); const handleDuplicate = useCallback(() => { dispatch( - controlNetAdded({ controlNetId: uuidv4(), controlNet: props.controlNet }) + controlNetDuplicated({ + sourceControlNetId: controlNetId, + newControlNetId: uuidv4(), + }) ); - }, [dispatch, props.controlNet]); + }, [controlNetId, dispatch]); const handleToggleIsEnabled = useCallback(() => { dispatch(controlNetToggled({ controlNetId })); @@ -68,15 +70,18 @@ const ControlNet = (props: ControlNetProps) => { flexDir: 'column', gap: 2, p: 3, - bg: mode('base.200', 'base.850')(colorMode), borderRadius: 'base', position: 'relative', + bg: 'base.200', + _dark: { + bg: 'base.850', + }, }} > - + @@ -90,7 +95,7 @@ const ControlNet = (props: ControlNetProps) => { transitionDuration: '0.1s', }} > - + { /> } /> + {!shouldAutoConfig && ( { w: 1.5, h: 1.5, borderRadius: 'full', - bg: mode('error.700', 'error.200')(colorMode), top: 4, insetInlineEnd: 4, + bg: 'accent.700', + _dark: { + bg: 'accent.400', + }, }} /> )} - {isEnabled && ( - <> - - - - - - - {!isExpanded && ( - - - - )} - - + + + + + - - {isExpanded && ( - <> - - - - - - - + {!isExpanded && ( + + + )} + + + + + + + + {isExpanded && ( + <> + + + )} diff --git a/invokeai/frontend/web/src/features/controlNet/components/ControlNetImagePreview.tsx b/invokeai/frontend/web/src/features/controlNet/components/ControlNetImagePreview.tsx index 1321f7b0c0..2faec4737d 100644 --- a/invokeai/frontend/web/src/features/controlNet/components/ControlNetImagePreview.tsx +++ b/invokeai/frontend/web/src/features/controlNet/components/ControlNetImagePreview.tsx @@ -5,42 +5,57 @@ import { TypesafeDraggableData, TypesafeDroppableData, } from 'app/components/ImageDnd/typesafeDnd'; +import { stateSelector } from 'app/store/store'; import { useAppDispatch, useAppSelector } from 'app/store/storeHooks'; import { defaultSelectorOptions } from 'app/store/util/defaultMemoizeOptions'; import IAIDndImage from 'common/components/IAIDndImage'; import { memo, useCallback, useMemo, useState } from 'react'; import { useGetImageDTOQuery } from 'services/api/endpoints/images'; import { PostUploadAction } from 'services/api/thunks/image'; -import { - ControlNetConfig, - controlNetImageChanged, - controlNetSelector, -} from '../store/controlNetSlice'; - -const selector = createSelector( - controlNetSelector, - (controlNet) => { - const { pendingControlImages } = controlNet; - return { pendingControlImages }; - }, - defaultSelectorOptions -); +import { controlNetImageChanged } from '../store/controlNetSlice'; type Props = { - controlNet: ControlNetConfig; + controlNetId: string; height: SystemStyleObject['h']; }; const ControlNetImagePreview = (props: Props) => { - const { height } = props; - const { - controlNetId, - controlImage: controlImageName, - processedControlImage: processedControlImageName, - processorType, - } = props.controlNet; + const { height, controlNetId } = props; const dispatch = useAppDispatch(); - const { pendingControlImages } = useAppSelector(selector); + + const selector = useMemo( + () => + createSelector( + stateSelector, + ({ controlNet }) => { + const { pendingControlImages } = controlNet; + const { + controlImage, + processedControlImage, + processorType, + isEnabled, + } = controlNet.controlNets[controlNetId]; + + return { + controlImageName: controlImage, + processedControlImageName: processedControlImage, + processorType, + isEnabled, + pendingControlImages, + }; + }, + defaultSelectorOptions + ), + [controlNetId] + ); + + const { + controlImageName, + processedControlImageName, + processorType, + pendingControlImages, + isEnabled, + } = useAppSelector(selector); const [isMouseOverImage, setIsMouseOverImage] = useState(false); @@ -110,13 +125,15 @@ const ControlNetImagePreview = (props: Props) => { h: height, alignItems: 'center', justifyContent: 'center', + pointerEvents: isEnabled ? 'auto' : 'none', + opacity: isEnabled ? 1 : 0.5, }} > { droppableData={droppableData} imageDTO={processedControlImage} isUploadDisabled={true} + isDropDisabled={!isEnabled} onClickReset={handleResetControlImage} resetTooltip="Reset Control Image" withResetIcon={Boolean(controlImage)} diff --git a/invokeai/frontend/web/src/features/controlNet/components/ControlNetProcessorComponent.tsx b/invokeai/frontend/web/src/features/controlNet/components/ControlNetProcessorComponent.tsx index 4649f89b35..b7fa329eac 100644 --- a/invokeai/frontend/web/src/features/controlNet/components/ControlNetProcessorComponent.tsx +++ b/invokeai/frontend/web/src/features/controlNet/components/ControlNetProcessorComponent.tsx @@ -1,10 +1,13 @@ -import { memo } from 'react'; -import { RequiredControlNetProcessorNode } from '../store/types'; +import { createSelector } from '@reduxjs/toolkit'; +import { stateSelector } from 'app/store/store'; +import { useAppSelector } from 'app/store/storeHooks'; +import { defaultSelectorOptions } from 'app/store/util/defaultMemoizeOptions'; +import { memo, useMemo } from 'react'; import CannyProcessor from './processors/CannyProcessor'; -import HedProcessor from './processors/HedProcessor'; -import LineartProcessor from './processors/LineartProcessor'; -import LineartAnimeProcessor from './processors/LineartAnimeProcessor'; import ContentShuffleProcessor from './processors/ContentShuffleProcessor'; +import HedProcessor from './processors/HedProcessor'; +import LineartAnimeProcessor from './processors/LineartAnimeProcessor'; +import LineartProcessor from './processors/LineartProcessor'; import MediapipeFaceProcessor from './processors/MediapipeFaceProcessor'; import MidasDepthProcessor from './processors/MidasDepthProcessor'; import MlsdImageProcessor from './processors/MlsdImageProcessor'; @@ -15,23 +18,45 @@ import ZoeDepthProcessor from './processors/ZoeDepthProcessor'; export type ControlNetProcessorProps = { controlNetId: string; - processorNode: RequiredControlNetProcessorNode; }; const ControlNetProcessorComponent = (props: ControlNetProcessorProps) => { - const { controlNetId, processorNode } = props; + const { controlNetId } = props; + + const selector = useMemo( + () => + createSelector( + stateSelector, + ({ controlNet }) => { + const { isEnabled, processorNode } = + controlNet.controlNets[controlNetId]; + + return { isEnabled, processorNode }; + }, + defaultSelectorOptions + ), + [controlNetId] + ); + + const { isEnabled, processorNode } = useAppSelector(selector); + if (processorNode.type === 'canny_image_processor') { return ( ); } if (processorNode.type === 'hed_image_processor') { return ( - + ); } @@ -40,6 +65,7 @@ const ControlNetProcessorComponent = (props: ControlNetProcessorProps) => { ); } @@ -49,6 +75,7 @@ const ControlNetProcessorComponent = (props: ControlNetProcessorProps) => { ); } @@ -58,6 +85,7 @@ const ControlNetProcessorComponent = (props: ControlNetProcessorProps) => { ); } @@ -67,6 +95,7 @@ const ControlNetProcessorComponent = (props: ControlNetProcessorProps) => { ); } @@ -76,6 +105,7 @@ const ControlNetProcessorComponent = (props: ControlNetProcessorProps) => { ); } @@ -85,6 +115,7 @@ const ControlNetProcessorComponent = (props: ControlNetProcessorProps) => { ); } @@ -94,6 +125,7 @@ const ControlNetProcessorComponent = (props: ControlNetProcessorProps) => { ); } @@ -103,6 +135,7 @@ const ControlNetProcessorComponent = (props: ControlNetProcessorProps) => { ); } @@ -112,6 +145,7 @@ const ControlNetProcessorComponent = (props: ControlNetProcessorProps) => { ); } @@ -121,6 +155,7 @@ const ControlNetProcessorComponent = (props: ControlNetProcessorProps) => { ); } diff --git a/invokeai/frontend/web/src/features/controlNet/components/ParamControlNetShouldAutoConfig.tsx b/invokeai/frontend/web/src/features/controlNet/components/ParamControlNetShouldAutoConfig.tsx index 1b3553e3be..285fcf7b80 100644 --- a/invokeai/frontend/web/src/features/controlNet/components/ParamControlNetShouldAutoConfig.tsx +++ b/invokeai/frontend/web/src/features/controlNet/components/ParamControlNetShouldAutoConfig.tsx @@ -1,18 +1,36 @@ -import { useAppDispatch } from 'app/store/storeHooks'; +import { createSelector } from '@reduxjs/toolkit'; +import { stateSelector } from 'app/store/store'; +import { useAppDispatch, useAppSelector } from 'app/store/storeHooks'; +import { defaultSelectorOptions } from 'app/store/util/defaultMemoizeOptions'; import IAISwitch from 'common/components/IAISwitch'; -import { useIsReadyToInvoke } from 'common/hooks/useIsReadyToInvoke'; import { controlNetAutoConfigToggled } from 'features/controlNet/store/controlNetSlice'; -import { memo, useCallback } from 'react'; +import { selectIsBusy } from 'features/system/store/systemSelectors'; +import { memo, useCallback, useMemo } from 'react'; type Props = { controlNetId: string; - shouldAutoConfig: boolean; }; const ParamControlNetShouldAutoConfig = (props: Props) => { - const { controlNetId, shouldAutoConfig } = props; + const { controlNetId } = props; const dispatch = useAppDispatch(); - const isReady = useIsReadyToInvoke(); + const selector = useMemo( + () => + createSelector( + stateSelector, + ({ controlNet }) => { + const { isEnabled, shouldAutoConfig } = + controlNet.controlNets[controlNetId]; + return { isEnabled, shouldAutoConfig }; + }, + defaultSelectorOptions + ), + [controlNetId] + ); + + const { isEnabled, shouldAutoConfig } = useAppSelector(selector); + const isBusy = useAppSelector(selectIsBusy); + const handleShouldAutoConfigChanged = useCallback(() => { dispatch(controlNetAutoConfigToggled({ controlNetId })); }, [controlNetId, dispatch]); @@ -23,7 +41,7 @@ const ParamControlNetShouldAutoConfig = (props: Props) => { aria-label="Auto configure processor" isChecked={shouldAutoConfig} onChange={handleShouldAutoConfigChanged} - isDisabled={!isReady} + isDisabled={isBusy || !isEnabled} /> ); }; diff --git a/invokeai/frontend/web/src/features/controlNet/components/parameters/ParamControlNetBeginEnd.tsx b/invokeai/frontend/web/src/features/controlNet/components/parameters/ParamControlNetBeginEnd.tsx index 7d0c53fe40..f2f8a8bef2 100644 --- a/invokeai/frontend/web/src/features/controlNet/components/parameters/ParamControlNetBeginEnd.tsx +++ b/invokeai/frontend/web/src/features/controlNet/components/parameters/ParamControlNetBeginEnd.tsx @@ -1,5 +1,4 @@ import { - ChakraProps, FormControl, FormLabel, HStack, @@ -10,34 +9,41 @@ import { RangeSliderTrack, Tooltip, } from '@chakra-ui/react'; -import { useAppDispatch } from 'app/store/storeHooks'; +import { createSelector } from '@reduxjs/toolkit'; +import { stateSelector } from 'app/store/store'; +import { useAppDispatch, useAppSelector } from 'app/store/storeHooks'; +import { defaultSelectorOptions } from 'app/store/util/defaultMemoizeOptions'; import { controlNetBeginStepPctChanged, controlNetEndStepPctChanged, } from 'features/controlNet/store/controlNetSlice'; -import { memo, useCallback } from 'react'; -import { useTranslation } from 'react-i18next'; - -const SLIDER_MARK_STYLES: ChakraProps['sx'] = { - mt: 1.5, - fontSize: '2xs', - fontWeight: '500', - color: 'base.400', -}; +import { memo, useCallback, useMemo } from 'react'; type Props = { controlNetId: string; - beginStepPct: number; - endStepPct: number; - mini?: boolean; }; const formatPct = (v: number) => `${Math.round(v * 100)}%`; const ParamControlNetBeginEnd = (props: Props) => { - const { controlNetId, beginStepPct, mini = false, endStepPct } = props; + const { controlNetId } = props; const dispatch = useAppDispatch(); - const { t } = useTranslation(); + + const selector = useMemo( + () => + createSelector( + stateSelector, + ({ controlNet }) => { + const { beginStepPct, endStepPct, isEnabled } = + controlNet.controlNets[controlNetId]; + return { beginStepPct, endStepPct, isEnabled }; + }, + defaultSelectorOptions + ), + [controlNetId] + ); + + const { beginStepPct, endStepPct, isEnabled } = useAppSelector(selector); const handleStepPctChanged = useCallback( (v: number[]) => { @@ -55,7 +61,7 @@ const ParamControlNetBeginEnd = (props: Props) => { }, [controlNetId, dispatch]); return ( - + Begin / End Step Percentage { max={1} step={0.01} minStepsBetweenThumbs={5} + isDisabled={!isEnabled} > @@ -76,38 +83,33 @@ const ParamControlNetBeginEnd = (props: Props) => { - {!mini && ( - <> - - 0% - - - 50% - - - 100% - - - )} + + 0% + + + 50% + + + 100% + diff --git a/invokeai/frontend/web/src/features/controlNet/components/parameters/ParamControlNetControlMode.tsx b/invokeai/frontend/web/src/features/controlNet/components/parameters/ParamControlNetControlMode.tsx index b8737004fd..e2995cf993 100644 --- a/invokeai/frontend/web/src/features/controlNet/components/parameters/ParamControlNetControlMode.tsx +++ b/invokeai/frontend/web/src/features/controlNet/components/parameters/ParamControlNetControlMode.tsx @@ -1,15 +1,17 @@ -import { useAppDispatch } from 'app/store/storeHooks'; +import { createSelector } from '@reduxjs/toolkit'; +import { stateSelector } from 'app/store/store'; +import { useAppDispatch, useAppSelector } from 'app/store/storeHooks'; +import { defaultSelectorOptions } from 'app/store/util/defaultMemoizeOptions'; import IAIMantineSelect from 'common/components/IAIMantineSelect'; import { ControlModes, controlNetControlModeChanged, } from 'features/controlNet/store/controlNetSlice'; -import { useCallback } from 'react'; +import { useCallback, useMemo } from 'react'; import { useTranslation } from 'react-i18next'; type ParamControlNetControlModeProps = { controlNetId: string; - controlMode: string; }; const CONTROL_MODE_DATA = [ @@ -22,8 +24,23 @@ const CONTROL_MODE_DATA = [ export default function ParamControlNetControlMode( props: ParamControlNetControlModeProps ) { - const { controlNetId, controlMode = false } = props; + const { controlNetId } = props; const dispatch = useAppDispatch(); + const selector = useMemo( + () => + createSelector( + stateSelector, + ({ controlNet }) => { + const { controlMode, isEnabled } = + controlNet.controlNets[controlNetId]; + return { controlMode, isEnabled }; + }, + defaultSelectorOptions + ), + [controlNetId] + ); + + const { controlMode, isEnabled } = useAppSelector(selector); const { t } = useTranslation(); @@ -36,7 +53,8 @@ export default function ParamControlNetControlMode( return ( { label="Enable ControlNet" isChecked={isEnabled} onChange={handleChange} + formControlProps={{ + width: '100%', + }} /> ); }; diff --git a/invokeai/frontend/web/src/features/controlNet/components/parameters/ParamControlNetIsEnabled.tsx b/invokeai/frontend/web/src/features/controlNet/components/parameters/ParamControlNetIsEnabled.tsx deleted file mode 100644 index d7f519a7b6..0000000000 --- a/invokeai/frontend/web/src/features/controlNet/components/parameters/ParamControlNetIsEnabled.tsx +++ /dev/null @@ -1,28 +0,0 @@ -import { useAppDispatch } from 'app/store/storeHooks'; -import IAISwitch from 'common/components/IAISwitch'; -import { controlNetToggled } from 'features/controlNet/store/controlNetSlice'; -import { memo, useCallback } from 'react'; - -type ParamControlNetIsEnabledProps = { - controlNetId: string; - isEnabled: boolean; -}; - -const ParamControlNetIsEnabled = (props: ParamControlNetIsEnabledProps) => { - const { controlNetId, isEnabled } = props; - const dispatch = useAppDispatch(); - - const handleIsEnabledChanged = useCallback(() => { - dispatch(controlNetToggled({ controlNetId })); - }, [dispatch, controlNetId]); - - return ( - - ); -}; - -export default memo(ParamControlNetIsEnabled); diff --git a/invokeai/frontend/web/src/features/controlNet/components/parameters/ParamControlNetIsPreprocessed.tsx b/invokeai/frontend/web/src/features/controlNet/components/parameters/ParamControlNetIsPreprocessed.tsx deleted file mode 100644 index 6db61a0d15..0000000000 --- a/invokeai/frontend/web/src/features/controlNet/components/parameters/ParamControlNetIsPreprocessed.tsx +++ /dev/null @@ -1,36 +0,0 @@ -import { useAppDispatch } from 'app/store/storeHooks'; -import IAIFullCheckbox from 'common/components/IAIFullCheckbox'; -import IAISwitch from 'common/components/IAISwitch'; -import { - controlNetToggled, - isControlNetImagePreprocessedToggled, -} from 'features/controlNet/store/controlNetSlice'; -import { memo, useCallback } from 'react'; - -type ParamControlNetIsEnabledProps = { - controlNetId: string; - isControlImageProcessed: boolean; -}; - -const ParamControlNetIsEnabled = (props: ParamControlNetIsEnabledProps) => { - const { controlNetId, isControlImageProcessed } = props; - const dispatch = useAppDispatch(); - - const handleIsControlImageProcessedToggled = useCallback(() => { - dispatch( - isControlNetImagePreprocessedToggled({ - controlNetId, - }) - ); - }, [controlNetId, dispatch]); - - return ( - - ); -}; - -export default memo(ParamControlNetIsEnabled); diff --git a/invokeai/frontend/web/src/features/controlNet/components/parameters/ParamControlNetModel.tsx b/invokeai/frontend/web/src/features/controlNet/components/parameters/ParamControlNetModel.tsx index 7a6def717a..8392bdd2e3 100644 --- a/invokeai/frontend/web/src/features/controlNet/components/parameters/ParamControlNetModel.tsx +++ b/invokeai/frontend/web/src/features/controlNet/components/parameters/ParamControlNetModel.tsx @@ -1,59 +1,118 @@ +import { SelectItem } from '@mantine/core'; import { createSelector } from '@reduxjs/toolkit'; +import { stateSelector } from 'app/store/store'; import { useAppDispatch, useAppSelector } from 'app/store/storeHooks'; -import IAIMantineSelect, { - IAISelectDataType, -} from 'common/components/IAIMantineSelect'; -import { useIsReadyToInvoke } from 'common/hooks/useIsReadyToInvoke'; -import { - CONTROLNET_MODELS, - ControlNetModelName, -} from 'features/controlNet/store/constants'; +import { defaultSelectorOptions } from 'app/store/util/defaultMemoizeOptions'; +import IAIMantineSearchableSelect from 'common/components/IAIMantineSearchableSelect'; +import IAIMantineSelectItemWithTooltip from 'common/components/IAIMantineSelectItemWithTooltip'; import { controlNetModelChanged } from 'features/controlNet/store/controlNetSlice'; -import { configSelector } from 'features/system/store/configSelectors'; -import { map } from 'lodash-es'; -import { memo, useCallback } from 'react'; +import { MODEL_TYPE_MAP } from 'features/parameters/types/constants'; +import { modelIdToControlNetModelParam } from 'features/parameters/util/modelIdToControlNetModelParam'; +import { selectIsBusy } from 'features/system/store/systemSelectors'; +import { forEach } from 'lodash-es'; +import { memo, useCallback, useMemo } from 'react'; +import { useGetControlNetModelsQuery } from 'services/api/endpoints/models'; type ParamControlNetModelProps = { controlNetId: string; - model: ControlNetModelName; }; -const selector = createSelector(configSelector, (config) => { - const controlNetModels: IAISelectDataType[] = map(CONTROLNET_MODELS, (m) => ({ - label: m.label, - value: m.type, - })).filter( - (d) => - !config.sd.disabledControlNetModels.includes( - d.value as ControlNetModelName - ) +const ParamControlNetModel = (props: ParamControlNetModelProps) => { + const { controlNetId } = props; + const dispatch = useAppDispatch(); + const isBusy = useAppSelector(selectIsBusy); + + const selector = useMemo( + () => + createSelector( + stateSelector, + ({ generation, controlNet }) => { + const { model } = generation; + const controlNetModel = controlNet.controlNets[controlNetId]?.model; + const isEnabled = controlNet.controlNets[controlNetId]?.isEnabled; + return { mainModel: model, controlNetModel, isEnabled }; + }, + defaultSelectorOptions + ), + [controlNetId] ); - return controlNetModels; -}); + const { mainModel, controlNetModel, isEnabled } = useAppSelector(selector); -const ParamControlNetModel = (props: ParamControlNetModelProps) => { - const { controlNetId, model } = props; - const controlNetModels = useAppSelector(selector); - const dispatch = useAppDispatch(); - const isReady = useIsReadyToInvoke(); + const { data: controlNetModels } = useGetControlNetModelsQuery(); + + const data = useMemo(() => { + if (!controlNetModels) { + return []; + } + + const data: SelectItem[] = []; + + forEach(controlNetModels.entities, (model, id) => { + if (!model) { + return; + } + + const disabled = model?.base_model !== mainModel?.base_model; + + data.push({ + value: id, + label: model.model_name, + group: MODEL_TYPE_MAP[model.base_model], + disabled, + tooltip: disabled + ? `Incompatible base model: ${model.base_model}` + : undefined, + }); + }); + + return data; + }, [controlNetModels, mainModel?.base_model]); + + // grab the full model entity from the RTK Query cache + const selectedModel = useMemo( + () => + controlNetModels?.entities[ + `${controlNetModel?.base_model}/controlnet/${controlNetModel?.model_name}` + ] ?? null, + [ + controlNetModel?.base_model, + controlNetModel?.model_name, + controlNetModels?.entities, + ] + ); const handleModelChanged = useCallback( - (val: string | null) => { - // TODO: do not cast - const model = val as ControlNetModelName; - dispatch(controlNetModelChanged({ controlNetId, model })); + (v: string | null) => { + if (!v) { + return; + } + + const newControlNetModel = modelIdToControlNetModelParam(v); + + if (!newControlNetModel) { + return; + } + + dispatch( + controlNetModelChanged({ controlNetId, model: newControlNetModel }) + ); }, [controlNetId, dispatch] ); return ( - ); }; diff --git a/invokeai/frontend/web/src/features/controlNet/components/parameters/ParamControlNetProcessorSelect.tsx b/invokeai/frontend/web/src/features/controlNet/components/parameters/ParamControlNetProcessorSelect.tsx index 9f333e1c33..8bd28f813c 100644 --- a/invokeai/frontend/web/src/features/controlNet/components/parameters/ParamControlNetProcessorSelect.tsx +++ b/invokeai/frontend/web/src/features/controlNet/components/parameters/ParamControlNetProcessorSelect.tsx @@ -1,24 +1,22 @@ import { useAppDispatch, useAppSelector } from 'app/store/storeHooks'; -import IAIMantineSelect, { +import { createSelector } from '@reduxjs/toolkit'; +import { stateSelector } from 'app/store/store'; +import { defaultSelectorOptions } from 'app/store/util/defaultMemoizeOptions'; +import IAIMantineSearchableSelect, { IAISelectDataType, -} from 'common/components/IAIMantineSelect'; +} from 'common/components/IAIMantineSearchableSelect'; +import { configSelector } from 'features/system/store/configSelectors'; +import { selectIsBusy } from 'features/system/store/systemSelectors'; import { map } from 'lodash-es'; -import { memo, useCallback } from 'react'; +import { memo, useCallback, useMemo } from 'react'; import { CONTROLNET_PROCESSORS } from '../../store/constants'; import { controlNetProcessorTypeChanged } from '../../store/controlNetSlice'; -import { - ControlNetProcessorNode, - ControlNetProcessorType, -} from '../../store/types'; -import { useIsReadyToInvoke } from 'common/hooks/useIsReadyToInvoke'; -import { createSelector } from '@reduxjs/toolkit'; -import { configSelector } from 'features/system/store/configSelectors'; -import { defaultSelectorOptions } from 'app/store/util/defaultMemoizeOptions'; +import { ControlNetProcessorType } from '../../store/types'; +import { FormControl, FormLabel } from '@chakra-ui/react'; type ParamControlNetProcessorSelectProps = { controlNetId: string; - processorNode: ControlNetProcessorNode; }; const selector = createSelector( @@ -54,10 +52,24 @@ const selector = createSelector( const ParamControlNetProcessorSelect = ( props: ParamControlNetProcessorSelectProps ) => { - const { controlNetId, processorNode } = props; const dispatch = useAppDispatch(); - const isReady = useIsReadyToInvoke(); + const { controlNetId } = props; + const processorNodeSelector = useMemo( + () => + createSelector( + stateSelector, + ({ controlNet }) => { + const { isEnabled, processorNode } = + controlNet.controlNets[controlNetId]; + return { isEnabled, processorNode }; + }, + defaultSelectorOptions + ), + [controlNetId] + ); + const isBusy = useAppSelector(selectIsBusy); const controlNetProcessors = useAppSelector(selector); + const { isEnabled, processorNode } = useAppSelector(processorNodeSelector); const handleProcessorTypeChanged = useCallback( (v: string | null) => { @@ -72,12 +84,12 @@ const ParamControlNetProcessorSelect = ( ); return ( - ); }; diff --git a/invokeai/frontend/web/src/features/controlNet/components/parameters/ParamControlNetWeight.tsx b/invokeai/frontend/web/src/features/controlNet/components/parameters/ParamControlNetWeight.tsx index c2b77125d0..8643fd7dad 100644 --- a/invokeai/frontend/web/src/features/controlNet/components/parameters/ParamControlNetWeight.tsx +++ b/invokeai/frontend/web/src/features/controlNet/components/parameters/ParamControlNetWeight.tsx @@ -1,18 +1,32 @@ -import { useAppDispatch } from 'app/store/storeHooks'; +import { createSelector } from '@reduxjs/toolkit'; +import { stateSelector } from 'app/store/store'; +import { useAppDispatch, useAppSelector } from 'app/store/storeHooks'; +import { defaultSelectorOptions } from 'app/store/util/defaultMemoizeOptions'; import IAISlider from 'common/components/IAISlider'; import { controlNetWeightChanged } from 'features/controlNet/store/controlNetSlice'; -import { memo, useCallback } from 'react'; +import { memo, useCallback, useMemo } from 'react'; type ParamControlNetWeightProps = { controlNetId: string; - weight: number; - mini?: boolean; }; const ParamControlNetWeight = (props: ParamControlNetWeightProps) => { - const { controlNetId, weight, mini = false } = props; + const { controlNetId } = props; const dispatch = useAppDispatch(); + const selector = useMemo( + () => + createSelector( + stateSelector, + ({ controlNet }) => { + const { weight, isEnabled } = controlNet.controlNets[controlNetId]; + return { weight, isEnabled }; + }, + defaultSelectorOptions + ), + [controlNetId] + ); + const { weight, isEnabled } = useAppSelector(selector); const handleWeightChanged = useCallback( (weight: number) => { dispatch(controlNetWeightChanged({ controlNetId, weight })); @@ -22,15 +36,15 @@ const ParamControlNetWeight = (props: ParamControlNetWeightProps) => { return ( ); }; diff --git a/invokeai/frontend/web/src/features/controlNet/components/processors/CannyProcessor.tsx b/invokeai/frontend/web/src/features/controlNet/components/processors/CannyProcessor.tsx index 1b62056c7a..e226e2a55c 100644 --- a/invokeai/frontend/web/src/features/controlNet/components/processors/CannyProcessor.tsx +++ b/invokeai/frontend/web/src/features/controlNet/components/processors/CannyProcessor.tsx @@ -1,22 +1,25 @@ +import { useAppSelector } from 'app/store/storeHooks'; import IAISlider from 'common/components/IAISlider'; import { CONTROLNET_PROCESSORS } from 'features/controlNet/store/constants'; import { RequiredCannyImageProcessorInvocation } from 'features/controlNet/store/types'; +import { selectIsBusy } from 'features/system/store/systemSelectors'; import { memo, useCallback } from 'react'; import { useProcessorNodeChanged } from '../hooks/useProcessorNodeChanged'; import ProcessorWrapper from './common/ProcessorWrapper'; -import { useIsReadyToInvoke } from 'common/hooks/useIsReadyToInvoke'; -const DEFAULTS = CONTROLNET_PROCESSORS.canny_image_processor.default; +const DEFAULTS = CONTROLNET_PROCESSORS.canny_image_processor + .default as RequiredCannyImageProcessorInvocation; type CannyProcessorProps = { controlNetId: string; processorNode: RequiredCannyImageProcessorInvocation; + isEnabled: boolean; }; const CannyProcessor = (props: CannyProcessorProps) => { - const { controlNetId, processorNode } = props; + const { controlNetId, processorNode, isEnabled } = props; const { low_threshold, high_threshold } = processorNode; - const isReady = useIsReadyToInvoke(); + const isBusy = useAppSelector(selectIsBusy); const processorChanged = useProcessorNodeChanged(); const handleLowThresholdChanged = useCallback( @@ -48,7 +51,7 @@ const CannyProcessor = (props: CannyProcessorProps) => { return ( { withSliderMarks /> { - const { controlNetId, processorNode } = props; + const { controlNetId, processorNode, isEnabled } = props; const { image_resolution, detect_resolution, w, h, f } = processorNode; const processorChanged = useProcessorNodeChanged(); - const isReady = useIsReadyToInvoke(); + const isBusy = useAppSelector(selectIsBusy); const handleDetectResolutionChanged = useCallback( (v: number) => { @@ -96,7 +99,7 @@ const ContentShuffleProcessor = (props: Props) => { max={4096} withInput withSliderMarks - isDisabled={!isReady} + isDisabled={isBusy || !isEnabled} /> { max={4096} withInput withSliderMarks - isDisabled={!isReady} + isDisabled={isBusy || !isEnabled} /> { max={4096} withInput withSliderMarks - isDisabled={!isReady} + isDisabled={isBusy || !isEnabled} /> { max={4096} withInput withSliderMarks - isDisabled={!isReady} + isDisabled={isBusy || !isEnabled} /> { max={4096} withInput withSliderMarks - isDisabled={!isReady} + isDisabled={isBusy || !isEnabled} /> ); diff --git a/invokeai/frontend/web/src/features/controlNet/components/processors/HedProcessor.tsx b/invokeai/frontend/web/src/features/controlNet/components/processors/HedProcessor.tsx index c51a44d1c3..04d6027ff9 100644 --- a/invokeai/frontend/web/src/features/controlNet/components/processors/HedProcessor.tsx +++ b/invokeai/frontend/web/src/features/controlNet/components/processors/HedProcessor.tsx @@ -1,25 +1,29 @@ +import { useAppSelector } from 'app/store/storeHooks'; import IAISlider from 'common/components/IAISlider'; import IAISwitch from 'common/components/IAISwitch'; import { CONTROLNET_PROCESSORS } from 'features/controlNet/store/constants'; import { RequiredHedImageProcessorInvocation } from 'features/controlNet/store/types'; +import { selectIsBusy } from 'features/system/store/systemSelectors'; import { ChangeEvent, memo, useCallback } from 'react'; import { useProcessorNodeChanged } from '../hooks/useProcessorNodeChanged'; import ProcessorWrapper from './common/ProcessorWrapper'; -import { useIsReadyToInvoke } from 'common/hooks/useIsReadyToInvoke'; -const DEFAULTS = CONTROLNET_PROCESSORS.hed_image_processor.default; +const DEFAULTS = CONTROLNET_PROCESSORS.hed_image_processor + .default as RequiredHedImageProcessorInvocation; type HedProcessorProps = { controlNetId: string; processorNode: RequiredHedImageProcessorInvocation; + isEnabled: boolean; }; const HedPreprocessor = (props: HedProcessorProps) => { const { controlNetId, processorNode: { detect_resolution, image_resolution, scribble }, + isEnabled, } = props; - const isReady = useIsReadyToInvoke(); + const isBusy = useAppSelector(selectIsBusy); const processorChanged = useProcessorNodeChanged(); const handleDetectResolutionChanged = useCallback( @@ -67,7 +71,7 @@ const HedPreprocessor = (props: HedProcessorProps) => { max={4096} withInput withSliderMarks - isDisabled={!isReady} + isDisabled={isBusy || !isEnabled} /> { max={4096} withInput withSliderMarks - isDisabled={!isReady} + isDisabled={isBusy || !isEnabled} /> ); diff --git a/invokeai/frontend/web/src/features/controlNet/components/processors/LineartAnimeProcessor.tsx b/invokeai/frontend/web/src/features/controlNet/components/processors/LineartAnimeProcessor.tsx index bc64e3c843..90177e7ceb 100644 --- a/invokeai/frontend/web/src/features/controlNet/components/processors/LineartAnimeProcessor.tsx +++ b/invokeai/frontend/web/src/features/controlNet/components/processors/LineartAnimeProcessor.tsx @@ -1,23 +1,26 @@ +import { useAppSelector } from 'app/store/storeHooks'; import IAISlider from 'common/components/IAISlider'; import { CONTROLNET_PROCESSORS } from 'features/controlNet/store/constants'; import { RequiredLineartAnimeImageProcessorInvocation } from 'features/controlNet/store/types'; +import { selectIsBusy } from 'features/system/store/systemSelectors'; import { memo, useCallback } from 'react'; import { useProcessorNodeChanged } from '../hooks/useProcessorNodeChanged'; import ProcessorWrapper from './common/ProcessorWrapper'; -import { useIsReadyToInvoke } from 'common/hooks/useIsReadyToInvoke'; -const DEFAULTS = CONTROLNET_PROCESSORS.lineart_anime_image_processor.default; +const DEFAULTS = CONTROLNET_PROCESSORS.lineart_anime_image_processor + .default as RequiredLineartAnimeImageProcessorInvocation; type Props = { controlNetId: string; processorNode: RequiredLineartAnimeImageProcessorInvocation; + isEnabled: boolean; }; const LineartAnimeProcessor = (props: Props) => { - const { controlNetId, processorNode } = props; + const { controlNetId, processorNode, isEnabled } = props; const { image_resolution, detect_resolution } = processorNode; const processorChanged = useProcessorNodeChanged(); - const isReady = useIsReadyToInvoke(); + const isBusy = useAppSelector(selectIsBusy); const handleDetectResolutionChanged = useCallback( (v: number) => { @@ -57,7 +60,7 @@ const LineartAnimeProcessor = (props: Props) => { max={4096} withInput withSliderMarks - isDisabled={!isReady} + isDisabled={isBusy || !isEnabled} /> { max={4096} withInput withSliderMarks - isDisabled={!isReady} + isDisabled={isBusy || !isEnabled} /> ); diff --git a/invokeai/frontend/web/src/features/controlNet/components/processors/LineartProcessor.tsx b/invokeai/frontend/web/src/features/controlNet/components/processors/LineartProcessor.tsx index 11245bf4a7..7f661b1cb9 100644 --- a/invokeai/frontend/web/src/features/controlNet/components/processors/LineartProcessor.tsx +++ b/invokeai/frontend/web/src/features/controlNet/components/processors/LineartProcessor.tsx @@ -1,24 +1,27 @@ +import { useAppSelector } from 'app/store/storeHooks'; import IAISlider from 'common/components/IAISlider'; import IAISwitch from 'common/components/IAISwitch'; import { CONTROLNET_PROCESSORS } from 'features/controlNet/store/constants'; import { RequiredLineartImageProcessorInvocation } from 'features/controlNet/store/types'; +import { selectIsBusy } from 'features/system/store/systemSelectors'; import { ChangeEvent, memo, useCallback } from 'react'; import { useProcessorNodeChanged } from '../hooks/useProcessorNodeChanged'; import ProcessorWrapper from './common/ProcessorWrapper'; -import { useIsReadyToInvoke } from 'common/hooks/useIsReadyToInvoke'; -const DEFAULTS = CONTROLNET_PROCESSORS.lineart_image_processor.default; +const DEFAULTS = CONTROLNET_PROCESSORS.lineart_image_processor + .default as RequiredLineartImageProcessorInvocation; type LineartProcessorProps = { controlNetId: string; processorNode: RequiredLineartImageProcessorInvocation; + isEnabled: boolean; }; const LineartProcessor = (props: LineartProcessorProps) => { - const { controlNetId, processorNode } = props; + const { controlNetId, processorNode, isEnabled } = props; const { image_resolution, detect_resolution, coarse } = processorNode; const processorChanged = useProcessorNodeChanged(); - const isReady = useIsReadyToInvoke(); + const isBusy = useAppSelector(selectIsBusy); const handleDetectResolutionChanged = useCallback( (v: number) => { @@ -65,7 +68,7 @@ const LineartProcessor = (props: LineartProcessorProps) => { max={4096} withInput withSliderMarks - isDisabled={!isReady} + isDisabled={isBusy || !isEnabled} /> { max={4096} withInput withSliderMarks - isDisabled={!isReady} + isDisabled={isBusy || !isEnabled} /> ); diff --git a/invokeai/frontend/web/src/features/controlNet/components/processors/MediapipeFaceProcessor.tsx b/invokeai/frontend/web/src/features/controlNet/components/processors/MediapipeFaceProcessor.tsx index 27aa22ca40..b8b24ce877 100644 --- a/invokeai/frontend/web/src/features/controlNet/components/processors/MediapipeFaceProcessor.tsx +++ b/invokeai/frontend/web/src/features/controlNet/components/processors/MediapipeFaceProcessor.tsx @@ -1,23 +1,26 @@ +import { useAppSelector } from 'app/store/storeHooks'; import IAISlider from 'common/components/IAISlider'; import { CONTROLNET_PROCESSORS } from 'features/controlNet/store/constants'; import { RequiredMediapipeFaceProcessorInvocation } from 'features/controlNet/store/types'; +import { selectIsBusy } from 'features/system/store/systemSelectors'; import { memo, useCallback } from 'react'; import { useProcessorNodeChanged } from '../hooks/useProcessorNodeChanged'; import ProcessorWrapper from './common/ProcessorWrapper'; -import { useIsReadyToInvoke } from 'common/hooks/useIsReadyToInvoke'; -const DEFAULTS = CONTROLNET_PROCESSORS.mediapipe_face_processor.default; +const DEFAULTS = CONTROLNET_PROCESSORS.mediapipe_face_processor + .default as RequiredMediapipeFaceProcessorInvocation; type Props = { controlNetId: string; processorNode: RequiredMediapipeFaceProcessorInvocation; + isEnabled: boolean; }; const MediapipeFaceProcessor = (props: Props) => { - const { controlNetId, processorNode } = props; + const { controlNetId, processorNode, isEnabled } = props; const { max_faces, min_confidence } = processorNode; const processorChanged = useProcessorNodeChanged(); - const isReady = useIsReadyToInvoke(); + const isBusy = useAppSelector(selectIsBusy); const handleMaxFacesChanged = useCallback( (v: number) => { @@ -53,7 +56,7 @@ const MediapipeFaceProcessor = (props: Props) => { max={20} withInput withSliderMarks - isDisabled={!isReady} + isDisabled={isBusy || !isEnabled} /> { step={0.01} withInput withSliderMarks - isDisabled={!isReady} + isDisabled={isBusy || !isEnabled} /> ); diff --git a/invokeai/frontend/web/src/features/controlNet/components/processors/MidasDepthProcessor.tsx b/invokeai/frontend/web/src/features/controlNet/components/processors/MidasDepthProcessor.tsx index ffecb68061..54b174b5df 100644 --- a/invokeai/frontend/web/src/features/controlNet/components/processors/MidasDepthProcessor.tsx +++ b/invokeai/frontend/web/src/features/controlNet/components/processors/MidasDepthProcessor.tsx @@ -1,23 +1,26 @@ +import { useAppSelector } from 'app/store/storeHooks'; import IAISlider from 'common/components/IAISlider'; import { CONTROLNET_PROCESSORS } from 'features/controlNet/store/constants'; import { RequiredMidasDepthImageProcessorInvocation } from 'features/controlNet/store/types'; +import { selectIsBusy } from 'features/system/store/systemSelectors'; import { memo, useCallback } from 'react'; import { useProcessorNodeChanged } from '../hooks/useProcessorNodeChanged'; import ProcessorWrapper from './common/ProcessorWrapper'; -import { useIsReadyToInvoke } from 'common/hooks/useIsReadyToInvoke'; -const DEFAULTS = CONTROLNET_PROCESSORS.midas_depth_image_processor.default; +const DEFAULTS = CONTROLNET_PROCESSORS.midas_depth_image_processor + .default as RequiredMidasDepthImageProcessorInvocation; type Props = { controlNetId: string; processorNode: RequiredMidasDepthImageProcessorInvocation; + isEnabled: boolean; }; const MidasDepthProcessor = (props: Props) => { - const { controlNetId, processorNode } = props; + const { controlNetId, processorNode, isEnabled } = props; const { a_mult, bg_th } = processorNode; const processorChanged = useProcessorNodeChanged(); - const isReady = useIsReadyToInvoke(); + const isBusy = useAppSelector(selectIsBusy); const handleAMultChanged = useCallback( (v: number) => { @@ -54,7 +57,7 @@ const MidasDepthProcessor = (props: Props) => { step={0.01} withInput withSliderMarks - isDisabled={!isReady} + isDisabled={isBusy || !isEnabled} /> { step={0.01} withInput withSliderMarks - isDisabled={!isReady} + isDisabled={isBusy || !isEnabled} /> ); diff --git a/invokeai/frontend/web/src/features/controlNet/components/processors/MlsdImageProcessor.tsx b/invokeai/frontend/web/src/features/controlNet/components/processors/MlsdImageProcessor.tsx index 728c4b44fa..9a86cd2cb5 100644 --- a/invokeai/frontend/web/src/features/controlNet/components/processors/MlsdImageProcessor.tsx +++ b/invokeai/frontend/web/src/features/controlNet/components/processors/MlsdImageProcessor.tsx @@ -1,23 +1,26 @@ +import { useAppSelector } from 'app/store/storeHooks'; import IAISlider from 'common/components/IAISlider'; import { CONTROLNET_PROCESSORS } from 'features/controlNet/store/constants'; import { RequiredMlsdImageProcessorInvocation } from 'features/controlNet/store/types'; +import { selectIsBusy } from 'features/system/store/systemSelectors'; import { memo, useCallback } from 'react'; import { useProcessorNodeChanged } from '../hooks/useProcessorNodeChanged'; import ProcessorWrapper from './common/ProcessorWrapper'; -import { useIsReadyToInvoke } from 'common/hooks/useIsReadyToInvoke'; -const DEFAULTS = CONTROLNET_PROCESSORS.mlsd_image_processor.default; +const DEFAULTS = CONTROLNET_PROCESSORS.mlsd_image_processor + .default as RequiredMlsdImageProcessorInvocation; type Props = { controlNetId: string; processorNode: RequiredMlsdImageProcessorInvocation; + isEnabled: boolean; }; const MlsdImageProcessor = (props: Props) => { - const { controlNetId, processorNode } = props; + const { controlNetId, processorNode, isEnabled } = props; const { image_resolution, detect_resolution, thr_d, thr_v } = processorNode; const processorChanged = useProcessorNodeChanged(); - const isReady = useIsReadyToInvoke(); + const isBusy = useAppSelector(selectIsBusy); const handleDetectResolutionChanged = useCallback( (v: number) => { @@ -79,7 +82,7 @@ const MlsdImageProcessor = (props: Props) => { max={4096} withInput withSliderMarks - isDisabled={!isReady} + isDisabled={isBusy || !isEnabled} /> { max={4096} withInput withSliderMarks - isDisabled={!isReady} + isDisabled={isBusy || !isEnabled} /> { step={0.01} withInput withSliderMarks - isDisabled={!isReady} + isDisabled={isBusy || !isEnabled} /> { step={0.01} withInput withSliderMarks - isDisabled={!isReady} + isDisabled={isBusy || !isEnabled} /> ); diff --git a/invokeai/frontend/web/src/features/controlNet/components/processors/NormalBaeProcessor.tsx b/invokeai/frontend/web/src/features/controlNet/components/processors/NormalBaeProcessor.tsx index d5dce8d492..a0a8ad72cf 100644 --- a/invokeai/frontend/web/src/features/controlNet/components/processors/NormalBaeProcessor.tsx +++ b/invokeai/frontend/web/src/features/controlNet/components/processors/NormalBaeProcessor.tsx @@ -1,23 +1,26 @@ +import { useAppSelector } from 'app/store/storeHooks'; import IAISlider from 'common/components/IAISlider'; import { CONTROLNET_PROCESSORS } from 'features/controlNet/store/constants'; import { RequiredNormalbaeImageProcessorInvocation } from 'features/controlNet/store/types'; +import { selectIsBusy } from 'features/system/store/systemSelectors'; import { memo, useCallback } from 'react'; import { useProcessorNodeChanged } from '../hooks/useProcessorNodeChanged'; import ProcessorWrapper from './common/ProcessorWrapper'; -import { useIsReadyToInvoke } from 'common/hooks/useIsReadyToInvoke'; -const DEFAULTS = CONTROLNET_PROCESSORS.normalbae_image_processor.default; +const DEFAULTS = CONTROLNET_PROCESSORS.normalbae_image_processor + .default as RequiredNormalbaeImageProcessorInvocation; type Props = { controlNetId: string; processorNode: RequiredNormalbaeImageProcessorInvocation; + isEnabled: boolean; }; const NormalBaeProcessor = (props: Props) => { - const { controlNetId, processorNode } = props; + const { controlNetId, processorNode, isEnabled } = props; const { image_resolution, detect_resolution } = processorNode; const processorChanged = useProcessorNodeChanged(); - const isReady = useIsReadyToInvoke(); + const isBusy = useAppSelector(selectIsBusy); const handleDetectResolutionChanged = useCallback( (v: number) => { @@ -57,7 +60,7 @@ const NormalBaeProcessor = (props: Props) => { max={4096} withInput withSliderMarks - isDisabled={!isReady} + isDisabled={isBusy || !isEnabled} /> { max={4096} withInput withSliderMarks - isDisabled={!isReady} + isDisabled={isBusy || !isEnabled} /> ); diff --git a/invokeai/frontend/web/src/features/controlNet/components/processors/OpenposeProcessor.tsx b/invokeai/frontend/web/src/features/controlNet/components/processors/OpenposeProcessor.tsx index e97b933b6b..8335a5f75d 100644 --- a/invokeai/frontend/web/src/features/controlNet/components/processors/OpenposeProcessor.tsx +++ b/invokeai/frontend/web/src/features/controlNet/components/processors/OpenposeProcessor.tsx @@ -1,24 +1,27 @@ +import { useAppSelector } from 'app/store/storeHooks'; import IAISlider from 'common/components/IAISlider'; import IAISwitch from 'common/components/IAISwitch'; import { CONTROLNET_PROCESSORS } from 'features/controlNet/store/constants'; import { RequiredOpenposeImageProcessorInvocation } from 'features/controlNet/store/types'; +import { selectIsBusy } from 'features/system/store/systemSelectors'; import { ChangeEvent, memo, useCallback } from 'react'; import { useProcessorNodeChanged } from '../hooks/useProcessorNodeChanged'; import ProcessorWrapper from './common/ProcessorWrapper'; -import { useIsReadyToInvoke } from 'common/hooks/useIsReadyToInvoke'; -const DEFAULTS = CONTROLNET_PROCESSORS.openpose_image_processor.default; +const DEFAULTS = CONTROLNET_PROCESSORS.openpose_image_processor + .default as RequiredOpenposeImageProcessorInvocation; type Props = { controlNetId: string; processorNode: RequiredOpenposeImageProcessorInvocation; + isEnabled: boolean; }; const OpenposeProcessor = (props: Props) => { - const { controlNetId, processorNode } = props; + const { controlNetId, processorNode, isEnabled } = props; const { image_resolution, detect_resolution, hand_and_face } = processorNode; const processorChanged = useProcessorNodeChanged(); - const isReady = useIsReadyToInvoke(); + const isBusy = useAppSelector(selectIsBusy); const handleDetectResolutionChanged = useCallback( (v: number) => { @@ -65,7 +68,7 @@ const OpenposeProcessor = (props: Props) => { max={4096} withInput withSliderMarks - isDisabled={!isReady} + isDisabled={isBusy || !isEnabled} /> { max={4096} withInput withSliderMarks - isDisabled={!isReady} + isDisabled={isBusy || !isEnabled} /> ); diff --git a/invokeai/frontend/web/src/features/controlNet/components/processors/PidiProcessor.tsx b/invokeai/frontend/web/src/features/controlNet/components/processors/PidiProcessor.tsx index 8251447195..4eab83136d 100644 --- a/invokeai/frontend/web/src/features/controlNet/components/processors/PidiProcessor.tsx +++ b/invokeai/frontend/web/src/features/controlNet/components/processors/PidiProcessor.tsx @@ -1,24 +1,27 @@ +import { useAppSelector } from 'app/store/storeHooks'; import IAISlider from 'common/components/IAISlider'; import IAISwitch from 'common/components/IAISwitch'; import { CONTROLNET_PROCESSORS } from 'features/controlNet/store/constants'; import { RequiredPidiImageProcessorInvocation } from 'features/controlNet/store/types'; +import { selectIsBusy } from 'features/system/store/systemSelectors'; import { ChangeEvent, memo, useCallback } from 'react'; import { useProcessorNodeChanged } from '../hooks/useProcessorNodeChanged'; import ProcessorWrapper from './common/ProcessorWrapper'; -import { useIsReadyToInvoke } from 'common/hooks/useIsReadyToInvoke'; -const DEFAULTS = CONTROLNET_PROCESSORS.pidi_image_processor.default; +const DEFAULTS = CONTROLNET_PROCESSORS.pidi_image_processor + .default as RequiredPidiImageProcessorInvocation; type Props = { controlNetId: string; processorNode: RequiredPidiImageProcessorInvocation; + isEnabled: boolean; }; const PidiProcessor = (props: Props) => { - const { controlNetId, processorNode } = props; + const { controlNetId, processorNode, isEnabled } = props; const { image_resolution, detect_resolution, scribble, safe } = processorNode; const processorChanged = useProcessorNodeChanged(); - const isReady = useIsReadyToInvoke(); + const isBusy = useAppSelector(selectIsBusy); const handleDetectResolutionChanged = useCallback( (v: number) => { @@ -72,7 +75,7 @@ const PidiProcessor = (props: Props) => { max={4096} withInput withSliderMarks - isDisabled={!isReady} + isDisabled={isBusy || !isEnabled} /> { max={4096} withInput withSliderMarks - isDisabled={!isReady} + isDisabled={isBusy || !isEnabled} /> { label="Safe" isChecked={safe} onChange={handleSafeChanged} - isDisabled={!isReady} + isDisabled={isBusy || !isEnabled} /> ); diff --git a/invokeai/frontend/web/src/features/controlNet/components/processors/ZoeDepthProcessor.tsx b/invokeai/frontend/web/src/features/controlNet/components/processors/ZoeDepthProcessor.tsx index d0a34784bf..b4b45025eb 100644 --- a/invokeai/frontend/web/src/features/controlNet/components/processors/ZoeDepthProcessor.tsx +++ b/invokeai/frontend/web/src/features/controlNet/components/processors/ZoeDepthProcessor.tsx @@ -4,6 +4,7 @@ import { memo } from 'react'; type Props = { controlNetId: string; processorNode: RequiredZoeDepthImageProcessorInvocation; + isEnabled: boolean; }; const ZoeDepthProcessor = (props: Props) => { diff --git a/invokeai/frontend/web/src/features/controlNet/store/constants.ts b/invokeai/frontend/web/src/features/controlNet/store/constants.ts index df6ee653dc..00f5377e00 100644 --- a/invokeai/frontend/web/src/features/controlNet/store/constants.ts +++ b/invokeai/frontend/web/src/features/controlNet/store/constants.ts @@ -173,91 +173,17 @@ export const CONTROLNET_PROCESSORS: ControlNetProcessorsDict = { }, }; -type ControlNetModelsDict = Record; - -type ControlNetModel = { - type: string; - label: string; - description?: string; - defaultProcessor?: ControlNetProcessorType; +export const CONTROLNET_MODEL_DEFAULT_PROCESSORS: { + [key: string]: ControlNetProcessorType; +} = { + canny: 'canny_image_processor', + mlsd: 'mlsd_image_processor', + depth: 'midas_depth_image_processor', + bae: 'normalbae_image_processor', + lineart: 'lineart_image_processor', + lineart_anime: 'lineart_anime_image_processor', + softedge: 'hed_image_processor', + shuffle: 'content_shuffle_image_processor', + openpose: 'openpose_image_processor', + mediapipe: 'mediapipe_face_processor', }; - -export const CONTROLNET_MODELS: ControlNetModelsDict = { - 'lllyasviel/control_v11p_sd15_canny': { - type: 'lllyasviel/control_v11p_sd15_canny', - label: 'Canny', - defaultProcessor: 'canny_image_processor', - }, - 'lllyasviel/control_v11p_sd15_inpaint': { - type: 'lllyasviel/control_v11p_sd15_inpaint', - label: 'Inpaint', - defaultProcessor: 'none', - }, - 'lllyasviel/control_v11p_sd15_mlsd': { - type: 'lllyasviel/control_v11p_sd15_mlsd', - label: 'M-LSD', - defaultProcessor: 'mlsd_image_processor', - }, - 'lllyasviel/control_v11f1p_sd15_depth': { - type: 'lllyasviel/control_v11f1p_sd15_depth', - label: 'Depth', - defaultProcessor: 'midas_depth_image_processor', - }, - 'lllyasviel/control_v11p_sd15_normalbae': { - type: 'lllyasviel/control_v11p_sd15_normalbae', - label: 'Normal Map (BAE)', - defaultProcessor: 'normalbae_image_processor', - }, - 'lllyasviel/control_v11p_sd15_seg': { - type: 'lllyasviel/control_v11p_sd15_seg', - label: 'Segmentation', - defaultProcessor: 'none', - }, - 'lllyasviel/control_v11p_sd15_lineart': { - type: 'lllyasviel/control_v11p_sd15_lineart', - label: 'Lineart', - defaultProcessor: 'lineart_image_processor', - }, - 'lllyasviel/control_v11p_sd15s2_lineart_anime': { - type: 'lllyasviel/control_v11p_sd15s2_lineart_anime', - label: 'Lineart Anime', - defaultProcessor: 'lineart_anime_image_processor', - }, - 'lllyasviel/control_v11p_sd15_scribble': { - type: 'lllyasviel/control_v11p_sd15_scribble', - label: 'Scribble', - defaultProcessor: 'none', - }, - 'lllyasviel/control_v11p_sd15_softedge': { - type: 'lllyasviel/control_v11p_sd15_softedge', - label: 'Soft Edge', - defaultProcessor: 'hed_image_processor', - }, - 'lllyasviel/control_v11e_sd15_shuffle': { - type: 'lllyasviel/control_v11e_sd15_shuffle', - label: 'Content Shuffle', - defaultProcessor: 'content_shuffle_image_processor', - }, - 'lllyasviel/control_v11p_sd15_openpose': { - type: 'lllyasviel/control_v11p_sd15_openpose', - label: 'Openpose', - defaultProcessor: 'openpose_image_processor', - }, - 'lllyasviel/control_v11f1e_sd15_tile': { - type: 'lllyasviel/control_v11f1e_sd15_tile', - label: 'Tile (experimental)', - defaultProcessor: 'none', - }, - 'lllyasviel/control_v11e_sd15_ip2p': { - type: 'lllyasviel/control_v11e_sd15_ip2p', - label: 'Pix2Pix (experimental)', - defaultProcessor: 'none', - }, - 'CrucibleAI/ControlNetMediaPipeFace': { - type: 'CrucibleAI/ControlNetMediaPipeFace', - label: 'Mediapipe Face', - defaultProcessor: 'mediapipe_face_processor', - }, -}; - -export type ControlNetModelName = keyof typeof CONTROLNET_MODELS; diff --git a/invokeai/frontend/web/src/features/controlNet/store/controlNetSlice.ts b/invokeai/frontend/web/src/features/controlNet/store/controlNetSlice.ts index d1c69566e9..8e6f96add3 100644 --- a/invokeai/frontend/web/src/features/controlNet/store/controlNetSlice.ts +++ b/invokeai/frontend/web/src/features/controlNet/store/controlNetSlice.ts @@ -1,22 +1,20 @@ -import { PayloadAction } from '@reduxjs/toolkit'; -import { createSlice } from '@reduxjs/toolkit'; +import { PayloadAction, createSlice } from '@reduxjs/toolkit'; import { RootState } from 'app/store/store'; -import { ImageDTO } from 'services/api/types'; +import { ControlNetModelParam } from 'features/parameters/types/parameterSchemas'; +import { cloneDeep, forEach } from 'lodash-es'; +import { imageDeleted } from 'services/api/thunks/image'; +import { isAnySessionRejected } from 'services/api/thunks/session'; +import { appSocketInvocationError } from 'services/events/actions'; +import { controlNetImageProcessed } from './actions'; +import { + CONTROLNET_MODEL_DEFAULT_PROCESSORS, + CONTROLNET_PROCESSORS, +} from './constants'; import { ControlNetProcessorType, RequiredCannyImageProcessorInvocation, RequiredControlNetProcessorNode, } from './types'; -import { - CONTROLNET_MODELS, - CONTROLNET_PROCESSORS, - ControlNetModelName, -} from './constants'; -import { controlNetImageProcessed } from './actions'; -import { imageDeleted, imageUrlsReceived } from 'services/api/thunks/image'; -import { forEach } from 'lodash-es'; -import { isAnySessionRejected } from 'services/api/thunks/session'; -import { appSocketInvocationError } from 'services/events/actions'; export type ControlModes = | 'balanced' @@ -26,7 +24,7 @@ export type ControlModes = export const initialControlNet: Omit = { isEnabled: true, - model: CONTROLNET_MODELS['lllyasviel/control_v11p_sd15_canny'].type, + model: null, weight: 1, beginStepPct: 0, endStepPct: 1, @@ -42,7 +40,7 @@ export const initialControlNet: Omit = { export type ControlNetConfig = { controlNetId: string; isEnabled: boolean; - model: ControlNetModelName; + model: ControlNetModelParam | null; weight: number; beginStepPct: number; endStepPct: number; @@ -86,6 +84,19 @@ export const controlNetSlice = createSlice({ controlNetId, }; }, + controlNetDuplicated: ( + state, + action: PayloadAction<{ + sourceControlNetId: string; + newControlNetId: string; + }> + ) => { + const { sourceControlNetId, newControlNetId } = action.payload; + + const newControlnet = cloneDeep(state.controlNets[sourceControlNetId]); + newControlnet.controlNetId = newControlNetId; + state.controlNets[newControlNetId] = newControlnet; + }, controlNetAddedFromImage: ( state, action: PayloadAction<{ controlNetId: string; controlImage: string }> @@ -147,7 +158,7 @@ export const controlNetSlice = createSlice({ state, action: PayloadAction<{ controlNetId: string; - model: ControlNetModelName; + model: ControlNetModelParam; }> ) => { const { controlNetId, model } = action.payload; @@ -155,7 +166,15 @@ export const controlNetSlice = createSlice({ state.controlNets[controlNetId].processedControlImage = null; if (state.controlNets[controlNetId].shouldAutoConfig) { - const processorType = CONTROLNET_MODELS[model].defaultProcessor; + let processorType: ControlNetProcessorType | undefined = undefined; + + for (const modelSubstring in CONTROLNET_MODEL_DEFAULT_PROCESSORS) { + if (model.model_name.includes(modelSubstring)) { + processorType = CONTROLNET_MODEL_DEFAULT_PROCESSORS[modelSubstring]; + break; + } + } + if (processorType) { state.controlNets[controlNetId].processorType = processorType; state.controlNets[controlNetId].processorNode = CONTROLNET_PROCESSORS[ @@ -241,9 +260,19 @@ export const controlNetSlice = createSlice({ if (newShouldAutoConfig) { // manage the processor for the user - const processorType = - CONTROLNET_MODELS[state.controlNets[controlNetId].model] - .defaultProcessor; + let processorType: ControlNetProcessorType | undefined = undefined; + + for (const modelSubstring in CONTROLNET_MODEL_DEFAULT_PROCESSORS) { + if ( + state.controlNets[controlNetId].model?.model_name.includes( + modelSubstring + ) + ) { + processorType = CONTROLNET_MODEL_DEFAULT_PROCESSORS[modelSubstring]; + break; + } + } + if (processorType) { state.controlNets[controlNetId].processorType = processorType; state.controlNets[controlNetId].processorNode = CONTROLNET_PROCESSORS[ @@ -272,7 +301,8 @@ export const controlNetSlice = createSlice({ }); builder.addCase(imageDeleted.pending, (state, action) => { - // Preemptively remove the image from the gallery + // Preemptively remove the image from all controlnets + // TODO: doesn't the imageusage stuff do this for us? const { image_name } = action.meta.arg; forEach(state.controlNets, (c) => { if (c.controlImage === image_name) { @@ -285,21 +315,6 @@ export const controlNetSlice = createSlice({ }); }); - // builder.addCase(imageUrlsReceived.fulfilled, (state, action) => { - // const { image_name, image_url, thumbnail_url } = action.payload; - - // forEach(state.controlNets, (c) => { - // if (c.controlImage?.image_name === image_name) { - // c.controlImage.image_url = image_url; - // c.controlImage.thumbnail_url = thumbnail_url; - // } - // if (c.processedControlImage?.image_name === image_name) { - // c.processedControlImage.image_url = image_url; - // c.processedControlImage.thumbnail_url = thumbnail_url; - // } - // }); - // }); - builder.addCase(appSocketInvocationError, (state, action) => { state.pendingControlImages = []; }); @@ -313,6 +328,7 @@ export const controlNetSlice = createSlice({ export const { isControlNetEnabledToggled, controlNetAdded, + controlNetDuplicated, controlNetAddedFromImage, controlNetRemoved, controlNetImageChanged, diff --git a/invokeai/frontend/web/src/features/embedding/components/ParamEmbeddingPopover.tsx b/invokeai/frontend/web/src/features/embedding/components/ParamEmbeddingPopover.tsx index 32822125d2..ce4d75ec82 100644 --- a/invokeai/frontend/web/src/features/embedding/components/ParamEmbeddingPopover.tsx +++ b/invokeai/frontend/web/src/features/embedding/components/ParamEmbeddingPopover.tsx @@ -9,9 +9,9 @@ import { import { SelectItem } from '@mantine/core'; import { RootState } from 'app/store/store'; import { useAppSelector } from 'app/store/storeHooks'; -import IAIMantineSelect from 'common/components/IAIMantineSelect'; +import IAIMantineSearchableSelect from 'common/components/IAIMantineSearchableSelect'; import IAIMantineSelectItemWithTooltip from 'common/components/IAIMantineSelectItemWithTooltip'; -import { MODEL_TYPE_MAP } from 'features/system/components/ModelSelect'; +import { MODEL_TYPE_MAP } from 'features/parameters/types/constants'; import { forEach } from 'lodash-es'; import { PropsWithChildren, useCallback, useMemo, useRef } from 'react'; import { useGetTextualInversionModelsQuery } from 'services/api/endpoints/models'; @@ -106,7 +106,7 @@ const ParamEmbeddingPopover = (props: Props) => { ) : ( - { - const dispatch = useDispatch(); - const { colorMode } = useColorMode(); - - const handleAllImagesBoardClick = () => { - dispatch(boardIdSelected()); - }; - - const droppableData: MoveBoardDropData = { - id: 'all-images-board', - actionType: 'MOVE_BOARD', - context: { boardId: null }, - }; - - const { isOver, setNodeRef, active } = useDroppable({ - id: `board_droppable_all_images`, - data: droppableData, - }); - - return ( - - - - - {isValidDrop(droppableData, active) && ( - - )} - - - - All Images - - - ); -}; - -export default AllImagesBoard; diff --git a/invokeai/frontend/web/src/features/gallery/components/Boards/AddBoardButton.tsx b/invokeai/frontend/web/src/features/gallery/components/Boards/BoardsList/AddBoardButton.tsx similarity index 100% rename from invokeai/frontend/web/src/features/gallery/components/Boards/AddBoardButton.tsx rename to invokeai/frontend/web/src/features/gallery/components/Boards/BoardsList/AddBoardButton.tsx diff --git a/invokeai/frontend/web/src/features/gallery/components/Boards/BoardsList/AllImagesBoard.tsx b/invokeai/frontend/web/src/features/gallery/components/Boards/BoardsList/AllImagesBoard.tsx new file mode 100644 index 0000000000..c14ae24483 --- /dev/null +++ b/invokeai/frontend/web/src/features/gallery/components/Boards/BoardsList/AllImagesBoard.tsx @@ -0,0 +1,31 @@ +import { MoveBoardDropData } from 'app/components/ImageDnd/typesafeDnd'; +import { boardIdSelected } from 'features/gallery/store/gallerySlice'; +import { FaImages } from 'react-icons/fa'; +import { useDispatch } from 'react-redux'; +import GenericBoard from './GenericBoard'; + +const AllImagesBoard = ({ isSelected }: { isSelected: boolean }) => { + const dispatch = useDispatch(); + + const handleAllImagesBoardClick = () => { + dispatch(boardIdSelected('all')); + }; + + const droppableData: MoveBoardDropData = { + id: 'all-images-board', + actionType: 'MOVE_BOARD', + context: { boardId: null }, + }; + + return ( + + ); +}; + +export default AllImagesBoard; diff --git a/invokeai/frontend/web/src/features/gallery/components/Boards/BoardsList/BatchBoard.tsx b/invokeai/frontend/web/src/features/gallery/components/Boards/BoardsList/BatchBoard.tsx new file mode 100644 index 0000000000..816fba33c1 --- /dev/null +++ b/invokeai/frontend/web/src/features/gallery/components/Boards/BoardsList/BatchBoard.tsx @@ -0,0 +1,42 @@ +import { createSelector } from '@reduxjs/toolkit'; +import { AddToBatchDropData } from 'app/components/ImageDnd/typesafeDnd'; +import { stateSelector } from 'app/store/store'; +import { useAppSelector } from 'app/store/storeHooks'; +import { boardIdSelected } from 'features/gallery/store/gallerySlice'; +import { useCallback } from 'react'; +import { FaLayerGroup } from 'react-icons/fa'; +import { useDispatch } from 'react-redux'; +import GenericBoard from './GenericBoard'; + +const selector = createSelector(stateSelector, (state) => { + return { + count: state.gallery.batchImageNames.length, + }; +}); + +const BatchBoard = ({ isSelected }: { isSelected: boolean }) => { + const dispatch = useDispatch(); + const { count } = useAppSelector(selector); + + const handleBatchBoardClick = useCallback(() => { + dispatch(boardIdSelected('batch')); + }, [dispatch]); + + const droppableData: AddToBatchDropData = { + id: 'batch-board', + actionType: 'ADD_TO_BATCH', + }; + + return ( + + ); +}; + +export default BatchBoard; diff --git a/invokeai/frontend/web/src/features/gallery/components/Boards/BoardsList.tsx b/invokeai/frontend/web/src/features/gallery/components/Boards/BoardsList/BoardsList.tsx similarity index 85% rename from invokeai/frontend/web/src/features/gallery/components/Boards/BoardsList.tsx rename to invokeai/frontend/web/src/features/gallery/components/Boards/BoardsList/BoardsList.tsx index 5618c5c5c2..b479c46fd9 100644 --- a/invokeai/frontend/web/src/features/gallery/components/Boards/BoardsList.tsx +++ b/invokeai/frontend/web/src/features/gallery/components/Boards/BoardsList/BoardsList.tsx @@ -1,3 +1,4 @@ +import { CloseIcon } from '@chakra-ui/icons'; import { Collapse, Flex, @@ -9,17 +10,18 @@ import { InputRightElement, } from '@chakra-ui/react'; import { createSelector } from '@reduxjs/toolkit'; +import { stateSelector } from 'app/store/store'; import { useAppDispatch, useAppSelector } from 'app/store/storeHooks'; import { defaultSelectorOptions } from 'app/store/util/defaultMemoizeOptions'; import { setBoardSearchText } from 'features/gallery/store/boardSlice'; -import { memo, useState } from 'react'; -import HoverableBoard from './HoverableBoard'; import { OverlayScrollbarsComponent } from 'overlayscrollbars-react'; +import { memo, useState } from 'react'; +import { useListAllBoardsQuery } from 'services/api/endpoints/boards'; import AddBoardButton from './AddBoardButton'; import AllImagesBoard from './AllImagesBoard'; -import { CloseIcon } from '@chakra-ui/icons'; -import { useListAllBoardsQuery } from 'services/api/endpoints/boards'; -import { stateSelector } from 'app/store/store'; +import BatchBoard from './BatchBoard'; +import GalleryBoard from './GalleryBoard'; +import { useFeatureStatus } from '../../../../system/hooks/useFeatureStatus'; const selector = createSelector( [stateSelector], @@ -42,6 +44,8 @@ const BoardsList = (props: Props) => { const { data: boards } = useListAllBoardsQuery(); + const isBatchEnabled = useFeatureStatus('batches').isFeatureEnabled; + const filteredBoards = searchText ? boards?.filter((board) => board.board_name.toLowerCase().includes(searchText.toLowerCase()) @@ -115,14 +119,21 @@ const BoardsList = (props: Props) => { }} > {!searchMode && ( - - - + <> + + + + {isBatchEnabled && ( + + + + )} + )} {filteredBoards && filteredBoards.map((board) => ( - diff --git a/invokeai/frontend/web/src/features/gallery/components/Boards/HoverableBoard.tsx b/invokeai/frontend/web/src/features/gallery/components/Boards/BoardsList/GalleryBoard.tsx similarity index 76% rename from invokeai/frontend/web/src/features/gallery/components/Boards/HoverableBoard.tsx rename to invokeai/frontend/web/src/features/gallery/components/Boards/BoardsList/GalleryBoard.tsx index 035ee77f18..c01113d38a 100644 --- a/invokeai/frontend/web/src/features/gallery/components/Boards/HoverableBoard.tsx +++ b/invokeai/frontend/web/src/features/gallery/components/Boards/BoardsList/GalleryBoard.tsx @@ -12,35 +12,31 @@ import { } from '@chakra-ui/react'; import { useAppDispatch } from 'app/store/storeHooks'; -import { memo, useCallback, useContext } from 'react'; -import { FaFolder, FaTrash } from 'react-icons/fa'; import { ContextMenu } from 'chakra-ui-contextmenu'; -import { BoardDTO } from 'services/api/types'; import { IAINoContentFallback } from 'common/components/IAIImageFallback'; import { boardIdSelected } from 'features/gallery/store/gallerySlice'; +import { memo, useCallback, useContext, useMemo } from 'react'; +import { FaFolder, FaImages, FaTrash } from 'react-icons/fa'; import { useDeleteBoardMutation, useUpdateBoardMutation, } from 'services/api/endpoints/boards'; import { useGetImageDTOQuery } from 'services/api/endpoints/images'; +import { BoardDTO } from 'services/api/types'; import { skipToken } from '@reduxjs/toolkit/dist/query'; -import { AnimatePresence } from 'framer-motion'; -import IAIDropOverlay from 'common/components/IAIDropOverlay'; -import { DeleteBoardImagesContext } from '../../../../app/contexts/DeleteBoardImagesContext'; +import { MoveBoardDropData } from 'app/components/ImageDnd/typesafeDnd'; +// import { boardAddedToBatch } from 'app/store/middleware/listenerMiddleware/listeners/addBoardToBatch'; +import IAIDroppable from 'common/components/IAIDroppable'; import { mode } from 'theme/util/mode'; -import { - MoveBoardDropData, - isValidDrop, - useDroppable, -} from 'app/components/ImageDnd/typesafeDnd'; +import { DeleteBoardImagesContext } from '../../../../../app/contexts/DeleteBoardImagesContext'; -interface HoverableBoardProps { +interface GalleryBoardProps { board: BoardDTO; isSelected: boolean; } -const HoverableBoard = memo(({ board, isSelected }: HoverableBoardProps) => { +const GalleryBoard = memo(({ board, isSelected }: GalleryBoardProps) => { const dispatch = useAppDispatch(); const { currentData: coverImage } = useGetImageDTOQuery( @@ -71,21 +67,22 @@ const HoverableBoard = memo(({ board, isSelected }: HoverableBoardProps) => { deleteBoard(board_id); }, [board_id, deleteBoard]); + const handleAddBoardToBatch = useCallback(() => { + // dispatch(boardAddedToBatch({ board_id })); + }, []); + const handleDeleteBoardAndImages = useCallback(() => { - console.log({ board }); onClickDeleteBoardImages(board); }, [board, onClickDeleteBoardImages]); - const droppableData: MoveBoardDropData = { - id: board_id, - actionType: 'MOVE_BOARD', - context: { boardId: board_id }, - }; - - const { isOver, setNodeRef, active } = useDroppable({ - id: `board_droppable_${board_id}`, - data: droppableData, - }); + const droppableData: MoveBoardDropData = useMemo( + () => ({ + id: board_id, + actionType: 'MOVE_BOARD', + context: { boardId: board_id }, + }), + [board_id] + ); return ( @@ -94,16 +91,25 @@ const HoverableBoard = memo(({ board, isSelected }: HoverableBoardProps) => { renderMenu={() => ( {board.image_count > 0 && ( - } - onClickCapture={handleDeleteBoardAndImages} - > - Delete Board and Images - + <> + } + onClickCapture={handleAddBoardToBatch} + > + Add Board to Batch + + } + onClickCapture={handleDeleteBoardAndImages} + > + Delete Board and Images + + )} } onClickCapture={handleDeleteBoard} > @@ -127,7 +133,6 @@ const HoverableBoard = memo(({ board, isSelected }: HoverableBoardProps) => { }} > { > {board.image_count} - - {isValidDrop(droppableData, active) && ( - - )} - + { ); }); -HoverableBoard.displayName = 'HoverableBoard'; +GalleryBoard.displayName = 'HoverableBoard'; -export default HoverableBoard; +export default GalleryBoard; diff --git a/invokeai/frontend/web/src/features/gallery/components/Boards/BoardsList/GenericBoard.tsx b/invokeai/frontend/web/src/features/gallery/components/Boards/BoardsList/GenericBoard.tsx new file mode 100644 index 0000000000..a300c1b18c --- /dev/null +++ b/invokeai/frontend/web/src/features/gallery/components/Boards/BoardsList/GenericBoard.tsx @@ -0,0 +1,83 @@ +import { As, Badge, Flex } from '@chakra-ui/react'; +import { TypesafeDroppableData } from 'app/components/ImageDnd/typesafeDnd'; +import IAIDroppable from 'common/components/IAIDroppable'; +import { IAINoContentFallback } from 'common/components/IAIImageFallback'; + +type GenericBoardProps = { + droppableData: TypesafeDroppableData; + onClick: () => void; + isSelected: boolean; + icon: As; + label: string; + badgeCount?: number; +}; + +const GenericBoard = (props: GenericBoardProps) => { + const { droppableData, onClick, isSelected, icon, label, badgeCount } = props; + + return ( + + + + + {badgeCount !== undefined && ( + {badgeCount} + )} + + + + + {label} + + + ); +}; + +export default GenericBoard; diff --git a/invokeai/frontend/web/src/features/gallery/components/Boards/UpdateImageBoardModal.tsx b/invokeai/frontend/web/src/features/gallery/components/Boards/UpdateImageBoardModal.tsx index a98e8dca34..49eb1502f3 100644 --- a/invokeai/frontend/web/src/features/gallery/components/Boards/UpdateImageBoardModal.tsx +++ b/invokeai/frontend/web/src/features/gallery/components/Boards/UpdateImageBoardModal.tsx @@ -12,10 +12,10 @@ import { } from '@chakra-ui/react'; import IAIButton from 'common/components/IAIButton'; +import IAIMantineSearchableSelect from 'common/components/IAIMantineSearchableSelect'; import { memo, useContext, useRef, useState } from 'react'; -import { AddImageToBoardContext } from '../../../../app/contexts/AddImageToBoardContext'; -import IAIMantineSelect from 'common/components/IAIMantineSelect'; import { useListAllBoardsQuery } from 'services/api/endpoints/boards'; +import { AddImageToBoardContext } from '../../../../app/contexts/AddImageToBoardContext'; const UpdateImageBoardModal = () => { // const boards = useSelector(selectBoardsAll); @@ -56,7 +56,7 @@ const UpdateImageBoardModal = () => { {isFetching ? ( ) : ( - setSelectedBoard(v)} value={selectedBoard} diff --git a/invokeai/frontend/web/src/features/gallery/components/CurrentImage/CurrentImageButtons.tsx b/invokeai/frontend/web/src/features/gallery/components/CurrentImage/CurrentImageButtons.tsx new file mode 100644 index 0000000000..0cf3671db0 --- /dev/null +++ b/invokeai/frontend/web/src/features/gallery/components/CurrentImage/CurrentImageButtons.tsx @@ -0,0 +1,309 @@ +import { createSelector } from '@reduxjs/toolkit'; +import { isEqual } from 'lodash-es'; + +import { + ButtonGroup, + Flex, + FlexProps, + Menu, + MenuButton, + MenuList, +} from '@chakra-ui/react'; +// import { runESRGAN, runFacetool } from 'app/socketio/actions'; +import { useAppDispatch, useAppSelector } from 'app/store/storeHooks'; +import IAIIconButton from 'common/components/IAIIconButton'; + +import { skipToken } from '@reduxjs/toolkit/dist/query'; +import { useAppToaster } from 'app/components/Toaster'; +import { upscaleRequested } from 'app/store/middleware/listenerMiddleware/listeners/upscaleRequested'; +import { stateSelector } from 'app/store/store'; +import { DeleteImageButton } from 'features/imageDeletion/components/DeleteImageButton'; +import { imageToDeleteSelected } from 'features/imageDeletion/store/imageDeletionSlice'; +import ParamUpscalePopover from 'features/parameters/components/Parameters/Upscale/ParamUpscaleSettings'; +import { useRecallParameters } from 'features/parameters/hooks/useRecallParameters'; +import { initialImageSelected } from 'features/parameters/store/actions'; +import { useFeatureStatus } from 'features/system/hooks/useFeatureStatus'; +import { activeTabNameSelector } from 'features/ui/store/uiSelectors'; +import { + setShouldShowImageDetails, + setShouldShowProgressInViewer, +} from 'features/ui/store/uiSlice'; +import { useCallback } from 'react'; +import { useHotkeys } from 'react-hotkeys-hook'; +import { useTranslation } from 'react-i18next'; +import { + FaAsterisk, + FaCode, + FaHourglassHalf, + FaQuoteRight, + FaSeedling, + FaShareAlt, +} from 'react-icons/fa'; +import { + useGetImageDTOQuery, + useGetImageMetadataQuery, +} from 'services/api/endpoints/images'; +import { menuListMotionProps } from 'theme/components/menu'; +import { useDebounce } from 'use-debounce'; +import { sentImageToImg2Img } from '../../store/actions'; +import SingleSelectionMenuItems from '../ImageContextMenu/SingleSelectionMenuItems'; + +const currentImageButtonsSelector = createSelector( + [stateSelector, activeTabNameSelector], + ({ gallery, system, ui }, activeTabName) => { + const { isProcessing, isConnected, shouldConfirmOnDelete, progressImage } = + system; + + const { + shouldShowImageDetails, + shouldHidePreview, + shouldShowProgressInViewer, + } = ui; + + const lastSelectedImage = gallery.selection[gallery.selection.length - 1]; + + return { + canDeleteImage: isConnected && !isProcessing, + shouldConfirmOnDelete, + isProcessing, + isConnected, + shouldDisableToolbarButtons: Boolean(progressImage) || !lastSelectedImage, + shouldShowImageDetails, + activeTabName, + shouldHidePreview, + shouldShowProgressInViewer, + lastSelectedImage, + }; + }, + { + memoizeOptions: { + resultEqualityCheck: isEqual, + }, + } +); + +type CurrentImageButtonsProps = FlexProps; + +const CurrentImageButtons = (props: CurrentImageButtonsProps) => { + const dispatch = useAppDispatch(); + const { + isProcessing, + isConnected, + shouldDisableToolbarButtons, + shouldShowImageDetails, + lastSelectedImage, + shouldShowProgressInViewer, + } = useAppSelector(currentImageButtonsSelector); + + const isUpscalingEnabled = useFeatureStatus('upscaling').isFeatureEnabled; + + const toaster = useAppToaster(); + const { t } = useTranslation(); + + const { recallBothPrompts, recallSeed, recallAllParameters } = + useRecallParameters(); + + const [debouncedMetadataQueryArg, debounceState] = useDebounce( + lastSelectedImage, + 500 + ); + + const { currentData: imageDTO, isFetching } = useGetImageDTOQuery( + lastSelectedImage ?? skipToken + ); + + const { currentData: metadataData } = useGetImageMetadataQuery( + debounceState.isPending() + ? skipToken + : debouncedMetadataQueryArg ?? skipToken + ); + + const metadata = metadataData?.metadata; + + const handleClickUseAllParameters = useCallback(() => { + recallAllParameters(metadata); + }, [metadata, recallAllParameters]); + + useHotkeys( + 'a', + () => { + handleClickUseAllParameters; + }, + [metadata, recallAllParameters] + ); + + const handleUseSeed = useCallback(() => { + recallSeed(metadata?.seed); + }, [metadata?.seed, recallSeed]); + + useHotkeys('s', handleUseSeed, [imageDTO]); + + const handleUsePrompt = useCallback(() => { + recallBothPrompts(metadata?.positive_prompt, metadata?.negative_prompt); + }, [metadata?.negative_prompt, metadata?.positive_prompt, recallBothPrompts]); + + useHotkeys('p', handleUsePrompt, [imageDTO]); + + const handleSendToImageToImage = useCallback(() => { + dispatch(sentImageToImg2Img()); + dispatch(initialImageSelected(imageDTO)); + }, [dispatch, imageDTO]); + + useHotkeys('shift+i', handleSendToImageToImage, [imageDTO]); + + const handleClickUpscale = useCallback(() => { + if (!imageDTO) { + return; + } + dispatch(upscaleRequested({ image_name: imageDTO.image_name })); + }, [dispatch, imageDTO]); + + const handleDelete = useCallback(() => { + if (!imageDTO) { + return; + } + dispatch(imageToDeleteSelected(imageDTO)); + }, [dispatch, imageDTO]); + + useHotkeys( + 'Shift+U', + () => { + handleClickUpscale(); + }, + { + enabled: () => + Boolean( + isUpscalingEnabled && + !shouldDisableToolbarButtons && + isConnected && + !isProcessing + ), + }, + [ + isUpscalingEnabled, + imageDTO, + shouldDisableToolbarButtons, + isConnected, + isProcessing, + ] + ); + + const handleClickShowImageDetails = useCallback( + () => dispatch(setShouldShowImageDetails(!shouldShowImageDetails)), + [dispatch, shouldShowImageDetails] + ); + + useHotkeys( + 'i', + () => { + if (imageDTO) { + handleClickShowImageDetails(); + } else { + toaster({ + title: t('toast.metadataLoadFailed'), + status: 'error', + duration: 2500, + isClosable: true, + }); + } + }, + [imageDTO, shouldShowImageDetails, toaster] + ); + + const handleClickProgressImagesToggle = useCallback(() => { + dispatch(setShouldShowProgressInViewer(!shouldShowProgressInViewer)); + }, [dispatch, shouldShowProgressInViewer]); + + return ( + <> + + + + } + /> + + {imageDTO && } + + + + + + } + tooltip={`${t('parameters.usePrompt')} (P)`} + aria-label={`${t('parameters.usePrompt')} (P)`} + isDisabled={!metadata?.positive_prompt} + onClick={handleUsePrompt} + /> + + } + tooltip={`${t('parameters.useSeed')} (S)`} + aria-label={`${t('parameters.useSeed')} (S)`} + isDisabled={!metadata?.seed} + onClick={handleUseSeed} + /> + + } + tooltip={`${t('parameters.useAll')} (A)`} + aria-label={`${t('parameters.useAll')} (A)`} + isDisabled={!metadata} + onClick={handleClickUseAllParameters} + /> + + + {isUpscalingEnabled && ( + + {isUpscalingEnabled && } + + )} + + + } + tooltip={`${t('parameters.info')} (I)`} + aria-label={`${t('parameters.info')} (I)`} + isChecked={shouldShowImageDetails} + onClick={handleClickShowImageDetails} + /> + + + + } + isChecked={shouldShowProgressInViewer} + onClick={handleClickProgressImagesToggle} + /> + + + + + + + + ); +}; + +export default CurrentImageButtons; diff --git a/invokeai/frontend/web/src/features/gallery/components/CurrentImageDisplay.tsx b/invokeai/frontend/web/src/features/gallery/components/CurrentImage/CurrentImageDisplay.tsx similarity index 100% rename from invokeai/frontend/web/src/features/gallery/components/CurrentImageDisplay.tsx rename to invokeai/frontend/web/src/features/gallery/components/CurrentImage/CurrentImageDisplay.tsx diff --git a/invokeai/frontend/web/src/features/gallery/components/CurrentImageHidden.tsx b/invokeai/frontend/web/src/features/gallery/components/CurrentImage/CurrentImageHidden.tsx similarity index 100% rename from invokeai/frontend/web/src/features/gallery/components/CurrentImageHidden.tsx rename to invokeai/frontend/web/src/features/gallery/components/CurrentImage/CurrentImageHidden.tsx diff --git a/invokeai/frontend/web/src/features/gallery/components/CurrentImagePreview.tsx b/invokeai/frontend/web/src/features/gallery/components/CurrentImage/CurrentImagePreview.tsx similarity index 70% rename from invokeai/frontend/web/src/features/gallery/components/CurrentImagePreview.tsx rename to invokeai/frontend/web/src/features/gallery/components/CurrentImage/CurrentImagePreview.tsx index 9ef12871bb..e143a87fc9 100644 --- a/invokeai/frontend/web/src/features/gallery/components/CurrentImagePreview.tsx +++ b/invokeai/frontend/web/src/features/gallery/components/CurrentImage/CurrentImagePreview.tsx @@ -8,14 +8,15 @@ import { import { stateSelector } from 'app/store/store'; import { useAppSelector } from 'app/store/storeHooks'; import IAIDndImage from 'common/components/IAIDndImage'; -import { selectLastSelectedImage } from 'features/gallery/store/gallerySlice'; +import { useNextPrevImage } from 'features/gallery/hooks/useNextPrevImage'; +import { selectLastSelectedImage } from 'features/gallery/store/gallerySelectors'; +import { AnimatePresence, motion } from 'framer-motion'; import { isEqual } from 'lodash-es'; -import { memo, useMemo } from 'react'; +import { memo, useCallback, useMemo, useRef, useState } from 'react'; import { useHotkeys } from 'react-hotkeys-hook'; import { useGetImageDTOQuery } from 'services/api/endpoints/images'; -import { useNextPrevImage } from '../hooks/useNextPrevImage'; -import ImageMetadataViewer from './ImageMetaDataViewer/ImageMetadataViewer'; -import NextPrevImageButtons from './NextPrevImageButtons'; +import ImageMetadataViewer from '../ImageMetadataViewer/ImageMetadataViewer'; +import NextPrevImageButtons from '../NextPrevImageButtons'; export const imagesSelector = createSelector( [stateSelector, selectLastSelectedImage], @@ -115,8 +116,27 @@ const CurrentImagePreview = () => { [] ); + // Show and hide the next/prev buttons on mouse move + const [shouldShowNextPrevButtons, setShouldShowNextPrevButtons] = + useState(false); + + const timeoutId = useRef(0); + + const handleMouseOver = useCallback(() => { + setShouldShowNextPrevButtons(true); + window.clearTimeout(timeoutId.current); + }, []); + + const handleMouseOut = useCallback(() => { + timeoutId.current = window.setTimeout(() => { + setShouldShowNextPrevButtons(false); + }, 500); + }, []); + return ( { )} - {!shouldShowImageDetails && imageDTO && ( - - - - )} + + {!shouldShowImageDetails && imageDTO && shouldShowNextPrevButtons && ( + + + + )} + ); }; diff --git a/invokeai/frontend/web/src/features/gallery/components/CurrentImageButtons.tsx b/invokeai/frontend/web/src/features/gallery/components/CurrentImageButtons.tsx deleted file mode 100644 index 4e227c4a7d..0000000000 --- a/invokeai/frontend/web/src/features/gallery/components/CurrentImageButtons.tsx +++ /dev/null @@ -1,578 +0,0 @@ -import { createSelector } from '@reduxjs/toolkit'; -import { isEqual } from 'lodash-es'; - -import { ButtonGroup, Flex, FlexProps, Link } from '@chakra-ui/react'; -// import { runESRGAN, runFacetool } from 'app/socketio/actions'; -import { useAppDispatch, useAppSelector } from 'app/store/storeHooks'; -import IAIButton from 'common/components/IAIButton'; -import IAIIconButton from 'common/components/IAIIconButton'; -import IAIPopover from 'common/components/IAIPopover'; - -import { setIsLightboxOpen } from 'features/lightbox/store/lightboxSlice'; - -import { skipToken } from '@reduxjs/toolkit/dist/query'; -import { useAppToaster } from 'app/components/Toaster'; -import { stateSelector } from 'app/store/store'; -import { setInitialCanvasImage } from 'features/canvas/store/canvasSlice'; -import { requestCanvasRescale } from 'features/canvas/store/thunks/requestCanvasScale'; -import { DeleteImageButton } from 'features/imageDeletion/components/DeleteImageButton'; -import { imageToDeleteSelected } from 'features/imageDeletion/store/imageDeletionSlice'; -import FaceRestoreSettings from 'features/parameters/components/Parameters/FaceRestore/FaceRestoreSettings'; -import UpscaleSettings from 'features/parameters/components/Parameters/Upscale/UpscaleSettings'; -import { useRecallParameters } from 'features/parameters/hooks/useRecallParameters'; -import { initialImageSelected } from 'features/parameters/store/actions'; -import { useFeatureStatus } from 'features/system/hooks/useFeatureStatus'; -import { activeTabNameSelector } from 'features/ui/store/uiSelectors'; -import { - setActiveTab, - setShouldShowImageDetails, - setShouldShowProgressInViewer, -} from 'features/ui/store/uiSlice'; -import { useCallback } from 'react'; -import { useHotkeys } from 'react-hotkeys-hook'; -import { useTranslation } from 'react-i18next'; -import { - FaAsterisk, - FaCode, - FaCopy, - FaDownload, - FaExpand, - FaExpandArrowsAlt, - FaGrinStars, - FaHourglassHalf, - FaQuoteRight, - FaSeedling, - FaShare, - FaShareAlt, -} from 'react-icons/fa'; -import { - useGetImageDTOQuery, - useGetImageMetadataQuery, -} from 'services/api/endpoints/images'; -import { useDebounce } from 'use-debounce'; -import { sentImageToCanvas, sentImageToImg2Img } from '../store/actions'; - -const currentImageButtonsSelector = createSelector( - [stateSelector, activeTabNameSelector], - ({ gallery, system, postprocessing, ui, lightbox }, activeTabName) => { - const { - isProcessing, - isConnected, - isGFPGANAvailable, - isESRGANAvailable, - shouldConfirmOnDelete, - progressImage, - } = system; - - const { upscalingLevel, facetoolStrength } = postprocessing; - - const { isLightboxOpen } = lightbox; - - const { - shouldShowImageDetails, - shouldHidePreview, - shouldShowProgressInViewer, - } = ui; - - const lastSelectedImage = gallery.selection[gallery.selection.length - 1]; - - return { - canDeleteImage: isConnected && !isProcessing, - shouldConfirmOnDelete, - isProcessing, - isConnected, - isGFPGANAvailable, - isESRGANAvailable, - upscalingLevel, - facetoolStrength, - shouldDisableToolbarButtons: Boolean(progressImage) || !lastSelectedImage, - shouldShowImageDetails, - activeTabName, - isLightboxOpen, - shouldHidePreview, - shouldShowProgressInViewer, - lastSelectedImage, - }; - }, - { - memoizeOptions: { - resultEqualityCheck: isEqual, - }, - } -); - -type CurrentImageButtonsProps = FlexProps; - -const CurrentImageButtons = (props: CurrentImageButtonsProps) => { - const dispatch = useAppDispatch(); - const { - isProcessing, - isConnected, - isGFPGANAvailable, - isESRGANAvailable, - upscalingLevel, - facetoolStrength, - shouldDisableToolbarButtons, - shouldShowImageDetails, - isLightboxOpen, - activeTabName, - shouldHidePreview, - lastSelectedImage, - shouldShowProgressInViewer, - } = useAppSelector(currentImageButtonsSelector); - - const isLightboxEnabled = useFeatureStatus('lightbox').isFeatureEnabled; - const isCanvasEnabled = useFeatureStatus('unifiedCanvas').isFeatureEnabled; - const isUpscalingEnabled = useFeatureStatus('upscaling').isFeatureEnabled; - const isFaceRestoreEnabled = useFeatureStatus('faceRestore').isFeatureEnabled; - - const toaster = useAppToaster(); - const { t } = useTranslation(); - - const { recallBothPrompts, recallSeed, recallAllParameters } = - useRecallParameters(); - - const [debouncedMetadataQueryArg, debounceState] = useDebounce( - lastSelectedImage, - 500 - ); - - const { currentData: image, isFetching } = useGetImageDTOQuery( - lastSelectedImage ?? skipToken - ); - - const { currentData: metadataData } = useGetImageMetadataQuery( - debounceState.isPending() - ? skipToken - : debouncedMetadataQueryArg ?? skipToken - ); - - const metadata = metadataData?.metadata; - - // const handleCopyImage = useCallback(async () => { - // if (!image?.url) { - // return; - // } - - // const url = getUrl(image.url); - - // if (!url) { - // return; - // } - - // const blob = await fetch(url).then((res) => res.blob()); - // const data = [new ClipboardItem({ [blob.type]: blob })]; - - // await navigator.clipboard.write(data); - - // toast({ - // title: t('toast.imageCopied'), - // status: 'success', - // duration: 2500, - // isClosable: true, - // }); - // }, [getUrl, t, image?.url, toast]); - - const handleCopyImageLink = useCallback(() => { - const getImageUrl = () => { - if (!image) { - return; - } - - if (image.image_url.startsWith('http')) { - return image.image_url; - } - - return window.location.toString() + image.image_url; - }; - - const url = getImageUrl(); - - if (!url) { - toaster({ - title: t('toast.problemCopyingImageLink'), - status: 'error', - duration: 2500, - isClosable: true, - }); - - return; - } - - navigator.clipboard.writeText(url).then(() => { - toaster({ - title: t('toast.imageLinkCopied'), - status: 'success', - duration: 2500, - isClosable: true, - }); - }); - }, [toaster, t, image]); - - const handleClickUseAllParameters = useCallback(() => { - recallAllParameters(metadata); - }, [metadata, recallAllParameters]); - - useHotkeys( - 'a', - () => { - handleClickUseAllParameters; - }, - [metadata, recallAllParameters] - ); - - const handleUseSeed = useCallback(() => { - recallSeed(metadata?.seed); - }, [metadata?.seed, recallSeed]); - - useHotkeys('s', handleUseSeed, [image]); - - const handleUsePrompt = useCallback(() => { - recallBothPrompts(metadata?.positive_prompt, metadata?.negative_prompt); - }, [metadata?.negative_prompt, metadata?.positive_prompt, recallBothPrompts]); - - useHotkeys('p', handleUsePrompt, [image]); - - const handleSendToImageToImage = useCallback(() => { - dispatch(sentImageToImg2Img()); - dispatch(initialImageSelected(image)); - }, [dispatch, image]); - - useHotkeys('shift+i', handleSendToImageToImage, [image]); - - const handleClickUpscale = useCallback(() => { - // selectedImage && dispatch(runESRGAN(selectedImage)); - }, []); - - const handleDelete = useCallback(() => { - if (!image) { - return; - } - dispatch(imageToDeleteSelected(image)); - }, [dispatch, image]); - - useHotkeys( - 'Shift+U', - () => { - handleClickUpscale(); - }, - { - enabled: () => - Boolean( - isUpscalingEnabled && - isESRGANAvailable && - !shouldDisableToolbarButtons && - isConnected && - !isProcessing && - upscalingLevel - ), - }, - [ - isUpscalingEnabled, - image, - isESRGANAvailable, - shouldDisableToolbarButtons, - isConnected, - isProcessing, - upscalingLevel, - ] - ); - - const handleClickFixFaces = useCallback(() => { - // selectedImage && dispatch(runFacetool(selectedImage)); - }, []); - - useHotkeys( - 'Shift+R', - () => { - handleClickFixFaces(); - }, - { - enabled: () => - Boolean( - isFaceRestoreEnabled && - isGFPGANAvailable && - !shouldDisableToolbarButtons && - isConnected && - !isProcessing && - facetoolStrength - ), - }, - - [ - isFaceRestoreEnabled, - image, - isGFPGANAvailable, - shouldDisableToolbarButtons, - isConnected, - isProcessing, - facetoolStrength, - ] - ); - - const handleClickShowImageDetails = useCallback( - () => dispatch(setShouldShowImageDetails(!shouldShowImageDetails)), - [dispatch, shouldShowImageDetails] - ); - - const handleSendToCanvas = useCallback(() => { - if (!image) return; - dispatch(sentImageToCanvas()); - if (isLightboxOpen) dispatch(setIsLightboxOpen(false)); - - dispatch(setInitialCanvasImage(image)); - dispatch(requestCanvasRescale()); - - if (activeTabName !== 'unifiedCanvas') { - dispatch(setActiveTab('unifiedCanvas')); - } - - toaster({ - title: t('toast.sentToUnifiedCanvas'), - status: 'success', - duration: 2500, - isClosable: true, - }); - }, [image, isLightboxOpen, dispatch, activeTabName, toaster, t]); - - useHotkeys( - 'i', - () => { - if (image) { - handleClickShowImageDetails(); - } else { - toaster({ - title: t('toast.metadataLoadFailed'), - status: 'error', - duration: 2500, - isClosable: true, - }); - } - }, - [image, shouldShowImageDetails, toaster] - ); - - const handleClickProgressImagesToggle = useCallback(() => { - dispatch(setShouldShowProgressInViewer(!shouldShowProgressInViewer)); - }, [dispatch, shouldShowProgressInViewer]); - - const handleLightBox = useCallback(() => { - dispatch(setIsLightboxOpen(!isLightboxOpen)); - }, [dispatch, isLightboxOpen]); - - return ( - <> - - - } - /> - } - > - - } - id="send-to-img2img" - > - {t('parameters.sendToImg2Img')} - - {isCanvasEnabled && ( - } - id="send-to-canvas" - > - {t('parameters.sendToUnifiedCanvas')} - - )} - - {/* } - > - {t('parameters.copyImage')} - */} - } - > - {t('parameters.copyImageToLink')} - - - - } size="sm" w="100%"> - {t('parameters.downloadImage')} - - - - - {isLightboxEnabled && ( - } - tooltip={ - !isLightboxOpen - ? `${t('parameters.openInViewer')} (Z)` - : `${t('parameters.closeViewer')} (Z)` - } - aria-label={ - !isLightboxOpen - ? `${t('parameters.openInViewer')} (Z)` - : `${t('parameters.closeViewer')} (Z)` - } - isChecked={isLightboxOpen} - onClick={handleLightBox} - isDisabled={shouldDisableToolbarButtons} - /> - )} - - - - } - tooltip={`${t('parameters.usePrompt')} (P)`} - aria-label={`${t('parameters.usePrompt')} (P)`} - isDisabled={!metadata?.positive_prompt} - onClick={handleUsePrompt} - /> - - } - tooltip={`${t('parameters.useSeed')} (S)`} - aria-label={`${t('parameters.useSeed')} (S)`} - isDisabled={!metadata?.seed} - onClick={handleUseSeed} - /> - - } - tooltip={`${t('parameters.useAll')} (A)`} - aria-label={`${t('parameters.useAll')} (A)`} - isDisabled={!metadata} - onClick={handleClickUseAllParameters} - /> - - - {(isUpscalingEnabled || isFaceRestoreEnabled) && ( - - {isFaceRestoreEnabled && ( - } - aria-label={t('parameters.restoreFaces')} - /> - } - > - - - - {t('parameters.restoreFaces')} - - - - )} - - {isUpscalingEnabled && ( - } - aria-label={t('parameters.upscale')} - /> - } - > - - - - {t('parameters.upscaleImage')} - - - - )} - - )} - - - } - tooltip={`${t('parameters.info')} (I)`} - aria-label={`${t('parameters.info')} (I)`} - isChecked={shouldShowImageDetails} - onClick={handleClickShowImageDetails} - /> - - - - } - isChecked={shouldShowProgressInViewer} - onClick={handleClickProgressImagesToggle} - /> - - - - - - - - ); -}; - -export default CurrentImageButtons; diff --git a/invokeai/frontend/web/src/features/gallery/components/GalleryPanel.tsx b/invokeai/frontend/web/src/features/gallery/components/GalleryPanel.tsx index 9ab8ccb5c9..2aa44e50a1 100644 --- a/invokeai/frontend/web/src/features/gallery/components/GalleryPanel.tsx +++ b/invokeai/frontend/web/src/features/gallery/components/GalleryPanel.tsx @@ -5,32 +5,23 @@ import { setGalleryImageMinimumWidth } from 'features/gallery/store/gallerySlice import { clamp, isEqual } from 'lodash-es'; import { useHotkeys } from 'react-hotkeys-hook'; -import './ImageGallery.css'; -import ImageGalleryContent from './ImageGalleryContent'; -import ResizableDrawer from 'features/ui/components/common/ResizableDrawer/ResizableDrawer'; -import { setShouldShowGallery } from 'features/ui/store/uiSlice'; import { createSelector } from '@reduxjs/toolkit'; +import { isStagingSelector } from 'features/canvas/store/canvasSelectors'; +import { requestCanvasRescale } from 'features/canvas/store/thunks/requestCanvasScale'; +import ResizableDrawer from 'features/ui/components/common/ResizableDrawer/ResizableDrawer'; import { activeTabNameSelector, uiSelector, } from 'features/ui/store/uiSelectors'; -import { isStagingSelector } from 'features/canvas/store/canvasSelectors'; -import { requestCanvasRescale } from 'features/canvas/store/thunks/requestCanvasScale'; -import { lightboxSelector } from 'features/lightbox/store/lightboxSelectors'; +import { setShouldShowGallery } from 'features/ui/store/uiSlice'; import { memo } from 'react'; +import ImageGalleryContent from './ImageGalleryContent'; const selector = createSelector( - [ - activeTabNameSelector, - uiSelector, - gallerySelector, - isStagingSelector, - lightboxSelector, - ], - (activeTabName, ui, gallery, isStaging, lightbox) => { + [activeTabNameSelector, uiSelector, gallerySelector, isStagingSelector], + (activeTabName, ui, gallery, isStaging) => { const { shouldPinGallery, shouldShowGallery } = ui; const { galleryImageMinimumWidth } = gallery; - const { isLightboxOpen } = lightbox; return { activeTabName, @@ -39,7 +30,6 @@ const selector = createSelector( shouldShowGallery, galleryImageMinimumWidth, isResizable: activeTabName !== 'unifiedCanvas', - isLightboxOpen, }; }, { @@ -58,7 +48,6 @@ const GalleryDrawer = () => { // activeTabName, // isStaging, // isResizable, - // isLightboxOpen, } = useAppSelector(selector); const handleCloseGallery = () => { diff --git a/invokeai/frontend/web/src/features/gallery/components/ImageContextMenu/ImageContextMenu.tsx b/invokeai/frontend/web/src/features/gallery/components/ImageContextMenu/ImageContextMenu.tsx new file mode 100644 index 0000000000..a903b36caf --- /dev/null +++ b/invokeai/frontend/web/src/features/gallery/components/ImageContextMenu/ImageContextMenu.tsx @@ -0,0 +1,67 @@ +import { MenuList } from '@chakra-ui/react'; +import { createSelector } from '@reduxjs/toolkit'; +import { stateSelector } from 'app/store/store'; +import { useAppSelector } from 'app/store/storeHooks'; +import { defaultSelectorOptions } from 'app/store/util/defaultMemoizeOptions'; +import { ContextMenu, ContextMenuProps } from 'chakra-ui-contextmenu'; +import { MouseEvent, memo, useCallback, useMemo } from 'react'; +import { ImageDTO } from 'services/api/types'; +import { menuListMotionProps } from 'theme/components/menu'; +import MultipleSelectionMenuItems from './MultipleSelectionMenuItems'; +import SingleSelectionMenuItems from './SingleSelectionMenuItems'; + +type Props = { + imageDTO: ImageDTO | undefined; + children: ContextMenuProps['children']; +}; + +const ImageContextMenu = ({ imageDTO, children }: Props) => { + const selector = useMemo( + () => + createSelector( + [stateSelector], + ({ gallery }) => { + const selectionCount = gallery.selection.length; + + return { selectionCount }; + }, + defaultSelectorOptions + ), + [] + ); + + const { selectionCount } = useAppSelector(selector); + + const handleContextMenu = useCallback((e: MouseEvent) => { + e.preventDefault(); + }, []); + + return ( + + menuProps={{ size: 'sm', isLazy: true }} + menuButtonProps={{ + bg: 'transparent', + _hover: { bg: 'transparent' }, + }} + renderMenu={() => + imageDTO ? ( + + {selectionCount === 1 ? ( + + ) : ( + + )} + + ) : null + } + > + {children} + + ); +}; + +export default memo(ImageContextMenu); diff --git a/invokeai/frontend/web/src/features/gallery/components/ImageContextMenu/MultipleSelectionMenuItems.tsx b/invokeai/frontend/web/src/features/gallery/components/ImageContextMenu/MultipleSelectionMenuItems.tsx new file mode 100644 index 0000000000..62d2cb06f4 --- /dev/null +++ b/invokeai/frontend/web/src/features/gallery/components/ImageContextMenu/MultipleSelectionMenuItems.tsx @@ -0,0 +1,40 @@ +import { MenuItem } from '@chakra-ui/react'; +import { useCallback } from 'react'; +import { FaFolder, FaFolderPlus, FaTrash } from 'react-icons/fa'; + +const MultipleSelectionMenuItems = () => { + const handleAddSelectionToBoard = useCallback(() => { + // TODO: add selection to board + }, []); + + const handleDeleteSelection = useCallback(() => { + // TODO: delete all selected images + }, []); + + const handleAddSelectionToBatch = useCallback(() => { + // TODO: add selection to batch + }, []); + + return ( + <> + } onClickCapture={handleAddSelectionToBoard}> + Move Selection to Board + + } + onClickCapture={handleAddSelectionToBatch} + > + Add Selection to Batch + + } + onClickCapture={handleDeleteSelection} + > + Delete Selection + + + ); +}; + +export default MultipleSelectionMenuItems; diff --git a/invokeai/frontend/web/src/features/gallery/components/ImageContextMenu.tsx b/invokeai/frontend/web/src/features/gallery/components/ImageContextMenu/SingleSelectionMenuItems.tsx similarity index 51% rename from invokeai/frontend/web/src/features/gallery/components/ImageContextMenu.tsx rename to invokeai/frontend/web/src/features/gallery/components/ImageContextMenu/SingleSelectionMenuItems.tsx index 92da141054..95872495df 100644 --- a/invokeai/frontend/web/src/features/gallery/components/ImageContextMenu.tsx +++ b/invokeai/frontend/web/src/features/gallery/components/ImageContextMenu/SingleSelectionMenuItems.tsx @@ -1,126 +1,60 @@ -import { ExternalLinkIcon } from '@chakra-ui/icons'; -import { MenuItem, MenuList } from '@chakra-ui/react'; +import { Link, MenuItem } from '@chakra-ui/react'; import { createSelector } from '@reduxjs/toolkit'; import { useAppToaster } from 'app/components/Toaster'; import { stateSelector } from 'app/store/store'; import { useAppDispatch, useAppSelector } from 'app/store/storeHooks'; import { defaultSelectorOptions } from 'app/store/util/defaultMemoizeOptions'; -import { ContextMenu, ContextMenuProps } from 'chakra-ui-contextmenu'; -import { imagesAddedToBatch } from 'features/batch/store/batchSlice'; import { resizeAndScaleCanvas, setInitialCanvasImage, } from 'features/canvas/store/canvasSlice'; +import { imagesAddedToBatch } from 'features/gallery/store/gallerySlice'; import { imageToDeleteSelected } from 'features/imageDeletion/store/imageDeletionSlice'; import { useRecallParameters } from 'features/parameters/hooks/useRecallParameters'; import { initialImageSelected } from 'features/parameters/store/actions'; import { useFeatureStatus } from 'features/system/hooks/useFeatureStatus'; +import { useCopyImageToClipboard } from 'features/ui/hooks/useCopyImageToClipboard'; import { setActiveTab } from 'features/ui/store/uiSlice'; import { memo, useCallback, useContext, useMemo } from 'react'; import { useTranslation } from 'react-i18next'; -import { FaExpand, FaFolder, FaShare, FaTrash } from 'react-icons/fa'; -import { IoArrowUndoCircleOutline } from 'react-icons/io5'; +import { + FaAsterisk, + FaCopy, + FaDownload, + FaExternalLinkAlt, + FaFolder, + FaQuoteRight, + FaSeedling, + FaShare, + FaTrash, +} from 'react-icons/fa'; import { useRemoveImageFromBoardMutation } from 'services/api/endpoints/boardImages'; import { useGetImageMetadataQuery } from 'services/api/endpoints/images'; import { ImageDTO } from 'services/api/types'; -import { AddImageToBoardContext } from '../../../app/contexts/AddImageToBoardContext'; -import { sentImageToCanvas, sentImageToImg2Img } from '../store/actions'; +import { AddImageToBoardContext } from '../../../../app/contexts/AddImageToBoardContext'; +import { sentImageToCanvas, sentImageToImg2Img } from '../../store/actions'; -type Props = { - image: ImageDTO; - children: ContextMenuProps['children']; +type SingleSelectionMenuItemsProps = { + imageDTO: ImageDTO; }; -const ImageContextMenu = ({ image, children }: Props) => { +const SingleSelectionMenuItems = (props: SingleSelectionMenuItemsProps) => { + const { imageDTO } = props; + const selector = useMemo( () => createSelector( [stateSelector], ({ gallery }) => { - const selectionCount = gallery.selection.length; - - return { selectionCount }; - }, - defaultSelectorOptions - ), - [] - ); - const { selectionCount } = useAppSelector(selector); - const dispatch = useAppDispatch(); - - const { onClickAddToBoard } = useContext(AddImageToBoardContext); - - const handleDelete = useCallback(() => { - if (!image) { - return; - } - dispatch(imageToDeleteSelected(image)); - }, [dispatch, image]); - - const handleAddToBoard = useCallback(() => { - onClickAddToBoard(image); - }, [image, onClickAddToBoard]); - - return ( - - menuProps={{ size: 'sm', isLazy: true }} - renderMenu={() => ( - - {selectionCount === 1 ? ( - - ) : ( - <> - } - onClickCapture={handleAddToBoard} - > - Move Selection to Board - - {/* } - onClickCapture={handleAddSelectionToBatch} - > - Add Selection to Batch - */} - } - onClickCapture={handleDelete} - > - Delete Selection - - - )} - - )} - > - {children} - - ); -}; - -export default memo(ImageContextMenu); - -type SingleSelectionMenuItemsProps = { - image: ImageDTO; -}; - -const SingleSelectionMenuItems = (props: SingleSelectionMenuItemsProps) => { - const { image } = props; - - const selector = useMemo( - () => - createSelector( - [stateSelector], - ({ batch }) => { - const isInBatch = batch.imageNames.includes(image.image_name); + const isInBatch = gallery.batchImageNames.includes( + imageDTO.image_name + ); return { isInBatch }; }, defaultSelectorOptions ), - [image.image_name] + [imageDTO.image_name] ); const { isInBatch } = useAppSelector(selector); @@ -129,21 +63,24 @@ const SingleSelectionMenuItems = (props: SingleSelectionMenuItemsProps) => { const toaster = useAppToaster(); - const isLightboxEnabled = useFeatureStatus('lightbox').isFeatureEnabled; const isCanvasEnabled = useFeatureStatus('unifiedCanvas').isFeatureEnabled; + const isBatchEnabled = useFeatureStatus('batches').isFeatureEnabled; const { onClickAddToBoard } = useContext(AddImageToBoardContext); - const { currentData } = useGetImageMetadataQuery(image.image_name); + const { currentData } = useGetImageMetadataQuery(imageDTO.image_name); + + const { isClipboardAPIAvailable, copyImageToClipboard } = + useCopyImageToClipboard(); const metadata = currentData?.metadata; const handleDelete = useCallback(() => { - if (!image) { + if (!imageDTO) { return; } - dispatch(imageToDeleteSelected(image)); - }, [dispatch, image]); + dispatch(imageToDeleteSelected(imageDTO)); + }, [dispatch, imageDTO]); const { recallBothPrompts, recallSeed, recallAllParameters } = useRecallParameters(); @@ -161,12 +98,12 @@ const SingleSelectionMenuItems = (props: SingleSelectionMenuItemsProps) => { const handleSendToImageToImage = useCallback(() => { dispatch(sentImageToImg2Img()); - dispatch(initialImageSelected(image)); - }, [dispatch, image]); + dispatch(initialImageSelected(imageDTO)); + }, [dispatch, imageDTO]); - const handleSendToCanvas = () => { + const handleSendToCanvas = useCallback(() => { dispatch(sentImageToCanvas()); - dispatch(setInitialCanvasImage(image)); + dispatch(setInitialCanvasImage(imageDTO)); dispatch(resizeAndScaleCanvas()); dispatch(setActiveTab('unifiedCanvas')); @@ -176,49 +113,56 @@ const SingleSelectionMenuItems = (props: SingleSelectionMenuItemsProps) => { duration: 2500, isClosable: true, }); - }; + }, [dispatch, imageDTO, t, toaster]); const handleUseAllParameters = useCallback(() => { console.log(metadata); recallAllParameters(metadata); }, [metadata, recallAllParameters]); - const handleLightBox = () => { - // dispatch(setCurrentImage(image)); - // dispatch(setIsLightboxOpen(true)); - }; - const handleAddToBoard = useCallback(() => { - onClickAddToBoard(image); - }, [image, onClickAddToBoard]); + onClickAddToBoard(imageDTO); + }, [imageDTO, onClickAddToBoard]); const handleRemoveFromBoard = useCallback(() => { - if (!image.board_id) { + if (!imageDTO.board_id) { return; } - removeFromBoard({ board_id: image.board_id, image_name: image.image_name }); - }, [image.board_id, image.image_name, removeFromBoard]); + removeFromBoard({ + board_id: imageDTO.board_id, + image_name: imageDTO.image_name, + }); + }, [imageDTO.board_id, imageDTO.image_name, removeFromBoard]); - const handleOpenInNewTab = () => { - window.open(image.image_url, '_blank'); - }; + const handleOpenInNewTab = useCallback(() => { + window.open(imageDTO.image_url, '_blank'); + }, [imageDTO.image_url]); const handleAddToBatch = useCallback(() => { - dispatch(imagesAddedToBatch([image.image_name])); - }, [dispatch, image.image_name]); + dispatch(imagesAddedToBatch([imageDTO.image_name])); + }, [dispatch, imageDTO.image_name]); + + const handleCopyImage = useCallback(() => { + copyImageToClipboard(imageDTO.image_url); + }, [copyImageToClipboard, imageDTO.image_url]); return ( <> - } onClickCapture={handleOpenInNewTab}> - {t('common.openInNewTab')} - - {isLightboxEnabled && ( - } onClickCapture={handleLightBox}> - {t('parameters.openInViewer')} + + } + onClickCapture={handleOpenInNewTab} + > + {t('common.openInNewTab')} + + + {isClipboardAPIAvailable && ( + } onClickCapture={handleCopyImage}> + {t('parameters.copyImage')} )} } + icon={} onClickCapture={handleRecallPrompt} isDisabled={ metadata?.positive_prompt === undefined && @@ -229,14 +173,14 @@ const SingleSelectionMenuItems = (props: SingleSelectionMenuItemsProps) => { } + icon={} onClickCapture={handleRecallSeed} isDisabled={metadata?.seed === undefined} > {t('parameters.useSeed')} } + icon={} onClickCapture={handleUseAllParameters} isDisabled={!metadata} > @@ -258,21 +202,28 @@ const SingleSelectionMenuItems = (props: SingleSelectionMenuItemsProps) => { {t('parameters.sendToUnifiedCanvas')} )} - } - isDisabled={isInBatch} - onClickCapture={handleAddToBatch} - > - Add to Batch - + {isBatchEnabled && ( + } + isDisabled={isInBatch} + onClickCapture={handleAddToBatch} + > + Add to Batch + + )} } onClickCapture={handleAddToBoard}> - {image.board_id ? 'Change Board' : 'Add to Board'} + {imageDTO.board_id ? 'Change Board' : 'Add to Board'} - {image.board_id && ( + {imageDTO.board_id && ( } onClickCapture={handleRemoveFromBoard}> Remove from Board )} + + } w="100%"> + {t('parameters.downloadImage')} + + } @@ -283,3 +234,5 @@ const SingleSelectionMenuItems = (props: SingleSelectionMenuItemsProps) => { ); }; + +export default memo(SingleSelectionMenuItems); diff --git a/invokeai/frontend/web/src/features/gallery/components/ImageGallery.css b/invokeai/frontend/web/src/features/gallery/components/ImageGallery.css deleted file mode 100644 index 559248dd0f..0000000000 --- a/invokeai/frontend/web/src/features/gallery/components/ImageGallery.css +++ /dev/null @@ -1,35 +0,0 @@ -.ltr-image-gallery-css-transition-enter { - transform: translateX(150%); -} - -.ltr-image-gallery-css-transition-enter-active { - transform: translateX(0); - transition: all 120ms ease-out; -} - -.ltr-image-gallery-css-transition-exit { - transform: translateX(0); -} - -.ltr-image-gallery-css-transition-exit-active { - transform: translateX(150%); - transition: all 120ms ease-out; -} - -.rtl-image-gallery-css-transition-enter { - transform: translateX(-150%); -} - -.rtl-image-gallery-css-transition-enter-active { - transform: translateX(0); - transition: all 120ms ease-out; -} - -.rtl-image-gallery-css-transition-exit { - transform: translateX(0); -} - -.rtl-image-gallery-css-transition-exit-active { - transform: translateX(-150%); - transition: all 120ms ease-out; -} diff --git a/invokeai/frontend/web/src/features/gallery/components/ImageGalleryContent.tsx b/invokeai/frontend/web/src/features/gallery/components/ImageGalleryContent.tsx index 19d48ea910..8badad942e 100644 --- a/invokeai/frontend/web/src/features/gallery/components/ImageGalleryContent.tsx +++ b/invokeai/frontend/web/src/features/gallery/components/ImageGalleryContent.tsx @@ -19,7 +19,7 @@ import { } from 'features/gallery/store/gallerySlice'; import { togglePinGalleryPanel } from 'features/ui/store/uiSlice'; -import { ChangeEvent, memo, useCallback, useRef } from 'react'; +import { ChangeEvent, memo, useCallback, useMemo, useRef } from 'react'; import { useTranslation } from 'react-i18next'; import { BsPinAngle, BsPinAngleFill } from 'react-icons/bs'; import { FaImage, FaServer, FaWrench } from 'react-icons/fa'; @@ -29,16 +29,12 @@ import { createSelector } from '@reduxjs/toolkit'; import { stateSelector } from 'app/store/store'; import { defaultSelectorOptions } from 'app/store/util/defaultMemoizeOptions'; import { requestCanvasRescale } from 'features/canvas/store/thunks/requestCanvasScale'; -import { - ASSETS_CATEGORIES, - IMAGE_CATEGORIES, - imageCategoriesChanged, - shouldAutoSwitchChanged, -} from 'features/gallery/store/gallerySlice'; +import { shouldAutoSwitchChanged } from 'features/gallery/store/gallerySlice'; import { useListAllBoardsQuery } from 'services/api/endpoints/boards'; import { mode } from 'theme/util/mode'; -import BoardsList from './Boards/BoardsList'; -import ImageGalleryGrid from './ImageGalleryGrid'; +import BoardsList from './Boards/BoardsList/BoardsList'; +import BatchImageGrid from './ImageGrid/BatchImageGrid'; +import GalleryImageGrid from './ImageGrid/GalleryImageGrid'; const selector = createSelector( [stateSelector], @@ -66,6 +62,7 @@ const ImageGalleryContent = () => { const dispatch = useAppDispatch(); const { t } = useTranslation(); const resizeObserverRef = useRef(null); + const galleryGridRef = useRef(null); const { colorMode } = useColorMode(); @@ -83,6 +80,16 @@ const ImageGalleryContent = () => { }), }); + const boardTitle = useMemo(() => { + if (selectedBoardId === 'batch') { + return 'Batch'; + } + if (selectedBoard) { + return selectedBoard.board_name; + } + return 'All Images'; + }, [selectedBoard, selectedBoardId]); + const { isOpen: isBoardListOpen, onToggle } = useDisclosure(); const handleChangeGalleryImageMinimumWidth = (v: number) => { @@ -95,12 +102,10 @@ const ImageGalleryContent = () => { }; const handleClickImagesCategory = useCallback(() => { - dispatch(imageCategoriesChanged(IMAGE_CATEGORIES)); dispatch(setGalleryView('images')); }, [dispatch]); const handleClickAssetsCategory = useCallback(() => { - dispatch(imageCategoriesChanged(ASSETS_CATEGORIES)); dispatch(setGalleryView('assets')); }, [dispatch]); @@ -163,7 +168,7 @@ const ImageGalleryContent = () => { fontWeight: 600, }} > - {selectedBoard ? selectedBoard.board_name : 'All Images'} + {boardTitle} { - - + + {selectedBoardId === 'batch' ? ( + + ) : ( + + )} ); diff --git a/invokeai/frontend/web/src/features/gallery/components/ImageGalleryGrid.tsx b/invokeai/frontend/web/src/features/gallery/components/ImageGalleryGrid.tsx deleted file mode 100644 index c7d4e5f0f8..0000000000 --- a/invokeai/frontend/web/src/features/gallery/components/ImageGalleryGrid.tsx +++ /dev/null @@ -1,233 +0,0 @@ -import { - Box, - Flex, - FlexProps, - Grid, - Skeleton, - Spinner, - forwardRef, -} from '@chakra-ui/react'; -import { useAppDispatch, useAppSelector } from 'app/store/storeHooks'; -import IAIButton from 'common/components/IAIButton'; -import { IMAGE_LIMIT } from 'features/gallery/store/gallerySlice'; -import { useOverlayScrollbars } from 'overlayscrollbars-react'; - -import { - PropsWithChildren, - memo, - useCallback, - useEffect, - useMemo, - useRef, - useState, -} from 'react'; -import { useTranslation } from 'react-i18next'; -import { FaImage } from 'react-icons/fa'; -import GalleryImage from './GalleryImage'; - -import { createSelector } from '@reduxjs/toolkit'; -import { RootState, stateSelector } from 'app/store/store'; -import { defaultSelectorOptions } from 'app/store/util/defaultMemoizeOptions'; -import { IAINoContentFallback } from 'common/components/IAIImageFallback'; -import { selectFilteredImages } from 'features/gallery/store/gallerySlice'; -import { VirtuosoGrid } from 'react-virtuoso'; -import { useListAllBoardsQuery } from 'services/api/endpoints/boards'; -import { receivedPageOfImages } from 'services/api/thunks/image'; -import { ImageDTO } from 'services/api/types'; - -const selector = createSelector( - [stateSelector, selectFilteredImages], - (state, filteredImages) => { - const { - categories, - total: allImagesTotal, - isLoading, - isFetching, - selectedBoardId, - } = state.gallery; - - let images = filteredImages as (ImageDTO | 'loading')[]; - - if (!isLoading && isFetching) { - // loading, not not the initial load - images = images.concat(Array(IMAGE_LIMIT).fill('loading')); - } - - return { - images, - allImagesTotal, - isLoading, - isFetching, - categories, - selectedBoardId, - }; - }, - defaultSelectorOptions -); - -const ImageGalleryGrid = () => { - const dispatch = useAppDispatch(); - const { t } = useTranslation(); - const rootRef = useRef(null); - const [scroller, setScroller] = useState(null); - const [initialize, osInstance] = useOverlayScrollbars({ - defer: true, - options: { - scrollbars: { - visibility: 'auto', - autoHide: 'leave', - autoHideDelay: 1300, - theme: 'os-theme-dark', - }, - overflow: { x: 'hidden' }, - }, - }); - - const { - images, - isLoading, - isFetching, - allImagesTotal, - categories, - selectedBoardId, - } = useAppSelector(selector); - - const { selectedBoard } = useListAllBoardsQuery(undefined, { - selectFromResult: ({ data }) => ({ - selectedBoard: data?.find((b) => b.board_id === selectedBoardId), - }), - }); - - const filteredImagesTotal = useMemo( - () => selectedBoard?.image_count ?? allImagesTotal, - [allImagesTotal, selectedBoard?.image_count] - ); - - const areMoreAvailable = useMemo(() => { - return images.length < filteredImagesTotal; - }, [images.length, filteredImagesTotal]); - - const handleLoadMoreImages = useCallback(() => { - dispatch( - receivedPageOfImages({ - categories, - board_id: selectedBoardId, - is_intermediate: false, - }) - ); - }, [categories, dispatch, selectedBoardId]); - - const handleEndReached = useMemo(() => { - if (areMoreAvailable && !isLoading) { - return handleLoadMoreImages; - } - return undefined; - }, [areMoreAvailable, handleLoadMoreImages, isLoading]); - - useEffect(() => { - const { current: root } = rootRef; - if (scroller && root) { - initialize({ - target: root, - elements: { - viewport: scroller, - }, - }); - } - return () => osInstance()?.destroy(); - }, [scroller, initialize, osInstance]); - - if (isLoading) { - return ( - - - - ); - } - - if (images.length) { - return ( - <> - - - typeof item === 'string' ? ( - - ) : ( - - ) - } - /> - - - {areMoreAvailable - ? t('gallery.loadMore') - : t('gallery.allImagesLoaded')} - - - ); - } - - return ( - - ); -}; - -type ItemContainerProps = PropsWithChildren & FlexProps; -const ItemContainer = forwardRef((props: ItemContainerProps, ref) => ( - - {props.children} - -)); - -type ListContainerProps = PropsWithChildren & FlexProps; -const ListContainer = forwardRef((props: ListContainerProps, ref) => { - const galleryImageMinimumWidth = useAppSelector( - (state: RootState) => state.gallery.galleryImageMinimumWidth - ); - - return ( - - {props.children} - - ); -}); - -export default memo(ImageGalleryGrid); diff --git a/invokeai/frontend/web/src/features/gallery/components/ImageGrid/BatchImage.tsx b/invokeai/frontend/web/src/features/gallery/components/ImageGrid/BatchImage.tsx new file mode 100644 index 0000000000..a918682ccd --- /dev/null +++ b/invokeai/frontend/web/src/features/gallery/components/ImageGrid/BatchImage.tsx @@ -0,0 +1,128 @@ +import { Box } from '@chakra-ui/react'; +import { createSelector } from '@reduxjs/toolkit'; +import { TypesafeDraggableData } from 'app/components/ImageDnd/typesafeDnd'; +import { stateSelector } from 'app/store/store'; +import { useAppDispatch, useAppSelector } from 'app/store/storeHooks'; +import { defaultSelectorOptions } from 'app/store/util/defaultMemoizeOptions'; +import IAIDndImage from 'common/components/IAIDndImage'; +import IAIErrorLoadingImageFallback from 'common/components/IAIErrorLoadingImageFallback'; +import IAIFillSkeleton from 'common/components/IAIFillSkeleton'; +import ImageContextMenu from 'features/gallery/components/ImageContextMenu/ImageContextMenu'; +import { + imageRangeEndSelected, + imageSelected, + imageSelectionToggled, + imagesRemovedFromBatch, +} from 'features/gallery/store/gallerySlice'; +import { MouseEvent, memo, useCallback, useMemo } from 'react'; +import { useGetImageDTOQuery } from 'services/api/endpoints/images'; + +const makeSelector = (image_name: string) => + createSelector( + [stateSelector], + (state) => ({ + selectionCount: state.gallery.selection.length, + selection: state.gallery.selection, + isSelected: state.gallery.selection.includes(image_name), + }), + defaultSelectorOptions + ); + +type BatchImageProps = { + imageName: string; +}; + +const BatchImage = (props: BatchImageProps) => { + const dispatch = useAppDispatch(); + const { imageName } = props; + const { + currentData: imageDTO, + isLoading, + isError, + isSuccess, + } = useGetImageDTOQuery(imageName); + const selector = useMemo(() => makeSelector(imageName), [imageName]); + + const { isSelected, selectionCount, selection } = useAppSelector(selector); + + const handleClickRemove = useCallback(() => { + dispatch(imagesRemovedFromBatch([imageName])); + }, [dispatch, imageName]); + + const handleClick = useCallback( + (e: MouseEvent) => { + if (e.shiftKey) { + dispatch(imageRangeEndSelected(imageName)); + } else if (e.ctrlKey || e.metaKey) { + dispatch(imageSelectionToggled(imageName)); + } else { + dispatch(imageSelected(imageName)); + } + }, + [dispatch, imageName] + ); + + const draggableData = useMemo(() => { + if (selectionCount > 1) { + return { + id: 'batch', + payloadType: 'IMAGE_NAMES', + payload: { image_names: selection }, + }; + } + + if (imageDTO) { + return { + id: 'batch', + payloadType: 'IMAGE_DTO', + payload: { imageDTO }, + }; + } + }, [imageDTO, selection, selectionCount]); + + if (isLoading) { + return ; + } + + if (isError || !imageDTO) { + return ; + } + + return ( + + + {(ref) => ( + + + + )} + + + ); +}; + +export default memo(BatchImage); diff --git a/invokeai/frontend/web/src/features/gallery/components/ImageGrid/BatchImageGrid.tsx b/invokeai/frontend/web/src/features/gallery/components/ImageGrid/BatchImageGrid.tsx new file mode 100644 index 0000000000..feaa47403d --- /dev/null +++ b/invokeai/frontend/web/src/features/gallery/components/ImageGrid/BatchImageGrid.tsx @@ -0,0 +1,87 @@ +import { Box } from '@chakra-ui/react'; +import { useAppSelector } from 'app/store/storeHooks'; +import { useOverlayScrollbars } from 'overlayscrollbars-react'; + +import { memo, useEffect, useRef, useState } from 'react'; +import { useTranslation } from 'react-i18next'; +import { FaImage } from 'react-icons/fa'; + +import { createSelector } from '@reduxjs/toolkit'; +import { stateSelector } from 'app/store/store'; +import { defaultSelectorOptions } from 'app/store/util/defaultMemoizeOptions'; +import { IAINoContentFallback } from 'common/components/IAIImageFallback'; +import { VirtuosoGrid } from 'react-virtuoso'; +import BatchImage from './BatchImage'; +import ItemContainer from './ImageGridItemContainer'; +import ListContainer from './ImageGridListContainer'; + +const selector = createSelector( + [stateSelector], + (state) => { + return { + imageNames: state.gallery.batchImageNames, + }; + }, + defaultSelectorOptions +); + +const BatchImageGrid = () => { + const { t } = useTranslation(); + const rootRef = useRef(null); + const [scroller, setScroller] = useState(null); + const [initialize, osInstance] = useOverlayScrollbars({ + defer: true, + options: { + scrollbars: { + visibility: 'auto', + autoHide: 'leave', + autoHideDelay: 1300, + theme: 'os-theme-dark', + }, + overflow: { x: 'hidden' }, + }, + }); + + const { imageNames } = useAppSelector(selector); + + useEffect(() => { + const { current: root } = rootRef; + if (scroller && root) { + initialize({ + target: root, + elements: { + viewport: scroller, + }, + }); + } + return () => osInstance()?.destroy(); + }, [scroller, initialize, osInstance]); + + if (imageNames.length) { + return ( + + ( + + )} + /> + + ); + } + + return ( + + ); +}; + +export default memo(BatchImageGrid); diff --git a/invokeai/frontend/web/src/features/gallery/components/GalleryImage.tsx b/invokeai/frontend/web/src/features/gallery/components/ImageGrid/GalleryImage.tsx similarity index 64% rename from invokeai/frontend/web/src/features/gallery/components/GalleryImage.tsx rename to invokeai/frontend/web/src/features/gallery/components/ImageGrid/GalleryImage.tsx index 468db558b3..eb7428bb69 100644 --- a/invokeai/frontend/web/src/features/gallery/components/GalleryImage.tsx +++ b/invokeai/frontend/web/src/features/gallery/components/ImageGrid/GalleryImage.tsx @@ -1,69 +1,57 @@ -import { Box } from '@chakra-ui/react'; +import { Box, Spinner } from '@chakra-ui/react'; import { createSelector } from '@reduxjs/toolkit'; import { TypesafeDraggableData } from 'app/components/ImageDnd/typesafeDnd'; import { stateSelector } from 'app/store/store'; import { useAppDispatch, useAppSelector } from 'app/store/storeHooks'; import { defaultSelectorOptions } from 'app/store/util/defaultMemoizeOptions'; import IAIDndImage from 'common/components/IAIDndImage'; -import { imageToDeleteSelected } from 'features/imageDeletion/store/imageDeletionSlice'; -import { MouseEvent, memo, useCallback, useMemo } from 'react'; -import { useTranslation } from 'react-i18next'; -import { FaTrash } from 'react-icons/fa'; -import { ImageDTO } from 'services/api/types'; +import ImageContextMenu from 'features/gallery/components/ImageContextMenu/ImageContextMenu'; import { imageRangeEndSelected, imageSelected, imageSelectionToggled, -} from '../store/gallerySlice'; -import ImageContextMenu from './ImageContextMenu'; +} from 'features/gallery/store/gallerySlice'; +import { imageToDeleteSelected } from 'features/imageDeletion/store/imageDeletionSlice'; +import { MouseEvent, memo, useCallback, useMemo } from 'react'; +import { useGetImageDTOQuery } from 'services/api/endpoints/images'; export const makeSelector = (image_name: string) => createSelector( [stateSelector], - ({ gallery }) => { - const isSelected = gallery.selection.includes(image_name); - const selectionCount = gallery.selection.length; - - return { - isSelected, - selectionCount, - }; - }, + ({ gallery }) => ({ + isSelected: gallery.selection.includes(image_name), + selectionCount: gallery.selection.length, + selection: gallery.selection, + }), defaultSelectorOptions ); interface HoverableImageProps { - imageDTO: ImageDTO; + imageName: string; } -/** - * Gallery image component with delete/use all/use seed buttons on hover. - */ const GalleryImage = (props: HoverableImageProps) => { - const { imageDTO } = props; - const { image_url, thumbnail_url, image_name } = imageDTO; - - const localSelector = useMemo(() => makeSelector(image_name), [image_name]); - - const { isSelected, selectionCount } = useAppSelector(localSelector); - const dispatch = useAppDispatch(); + const { imageName } = props; + const { currentData: imageDTO } = useGetImageDTOQuery(imageName); + const localSelector = useMemo(() => makeSelector(imageName), [imageName]); - const { t } = useTranslation(); + const { isSelected, selectionCount, selection } = + useAppSelector(localSelector); const handleClick = useCallback( (e: MouseEvent) => { - // multiselect disabled for now + // disable multiselect for now // if (e.shiftKey) { - // dispatch(imageRangeEndSelected(props.imageDTO.image_name)); + // dispatch(imageRangeEndSelected(imageName)); // } else if (e.ctrlKey || e.metaKey) { - // dispatch(imageSelectionToggled(props.imageDTO.image_name)); + // dispatch(imageSelectionToggled(imageName)); // } else { - // dispatch(imageSelected(props.imageDTO.image_name)); + // dispatch(imageSelected(imageName)); // } - dispatch(imageSelected(props.imageDTO.image_name)); + dispatch(imageSelected(imageName)); }, - [dispatch, props.imageDTO.image_name] + [dispatch, imageName] ); const handleDelete = useCallback( @@ -81,7 +69,8 @@ const GalleryImage = (props: HoverableImageProps) => { if (selectionCount > 1) { return { id: 'gallery-image', - payloadType: 'GALLERY_SELECTION', + payloadType: 'IMAGE_NAMES', + payload: { image_names: selection }, }; } @@ -92,15 +81,19 @@ const GalleryImage = (props: HoverableImageProps) => { payload: { imageDTO }, }; } - }, [imageDTO, selectionCount]); + }, [imageDTO, selection, selectionCount]); + + if (!imageDTO) { + return ; + } return ( - + {(ref) => ( { isSelected={isSelected} minSize={0} onClickReset={handleDelete} - resetIcon={} - resetTooltip="Delete image" imageSx={{ w: 'full', h: 'full' }} - // withResetIcon // removed bc it's too easy to accidentally delete images isDropDisabled={true} isUploadDisabled={true} thumbnail={true} + // resetIcon={} + // resetTooltip="Delete image" + // withResetIcon // removed bc it's too easy to accidentally delete images /> )} diff --git a/invokeai/frontend/web/src/features/gallery/components/ImageGrid/GalleryImageGrid.tsx b/invokeai/frontend/web/src/features/gallery/components/ImageGrid/GalleryImageGrid.tsx new file mode 100644 index 0000000000..7811e5f1c4 --- /dev/null +++ b/invokeai/frontend/web/src/features/gallery/components/ImageGrid/GalleryImageGrid.tsx @@ -0,0 +1,216 @@ +import { Box } from '@chakra-ui/react'; +import { useAppDispatch, useAppSelector } from 'app/store/storeHooks'; +import IAIButton from 'common/components/IAIButton'; +import { useOverlayScrollbars } from 'overlayscrollbars-react'; + +import { memo, useCallback, useEffect, useMemo, useRef, useState } from 'react'; +import { useTranslation } from 'react-i18next'; +import { FaImage } from 'react-icons/fa'; +import GalleryImage from './GalleryImage'; + +import { createSelector } from '@reduxjs/toolkit'; +import { stateSelector } from 'app/store/store'; +import { defaultSelectorOptions } from 'app/store/util/defaultMemoizeOptions'; +import { IAINoContentFallback } from 'common/components/IAIImageFallback'; +import { + ASSETS_CATEGORIES, + IMAGE_CATEGORIES, + IMAGE_LIMIT, +} from 'features/gallery//store/gallerySlice'; +import { selectFilteredImages } from 'features/gallery/store/gallerySelectors'; +import { VirtuosoGrid } from 'react-virtuoso'; +import { receivedPageOfImages } from 'services/api/thunks/image'; +import { useListBoardImagesQuery } from '../../../../services/api/endpoints/boardImages'; +import ImageGridItemContainer from './ImageGridItemContainer'; +import ImageGridListContainer from './ImageGridListContainer'; + +const selector = createSelector( + [stateSelector, selectFilteredImages], + (state, filteredImages) => { + const { + galleryImageMinimumWidth, + selectedBoardId, + galleryView, + total, + isLoading, + } = state.gallery; + + return { + imageNames: filteredImages.map((i) => i.image_name), + total, + selectedBoardId, + galleryView, + galleryImageMinimumWidth, + isLoading, + }; + }, + defaultSelectorOptions +); + +const GalleryImageGrid = () => { + const { t } = useTranslation(); + const rootRef = useRef(null); + const emptyGalleryRef = useRef(null); + const [scroller, setScroller] = useState(null); + const [initialize, osInstance] = useOverlayScrollbars({ + defer: true, + options: { + scrollbars: { + visibility: 'auto', + autoHide: 'leave', + autoHideDelay: 1300, + theme: 'os-theme-dark', + }, + overflow: { x: 'hidden' }, + }, + }); + + const [didInitialFetch, setDidInitialFetch] = useState(false); + + const dispatch = useAppDispatch(); + + const { + galleryImageMinimumWidth, + imageNames: imageNamesAll, //all images names loaded on main tab, + total: totalAll, + selectedBoardId, + galleryView, + isLoading: isLoadingAll, + } = useAppSelector(selector); + + const { data: imagesForBoard, isLoading: isLoadingImagesForBoard } = + useListBoardImagesQuery( + { board_id: selectedBoardId }, + { skip: selectedBoardId === 'all' } + ); + + const imageNames = useMemo(() => { + if (selectedBoardId === 'all') { + return imageNamesAll; // already sorted by images/uploads in gallery selector + } else { + const categories = + galleryView === 'images' ? IMAGE_CATEGORIES : ASSETS_CATEGORIES; + const imageList = (imagesForBoard?.items || []).filter((img) => + categories.includes(img.image_category) + ); + return imageList.map((img) => img.image_name); + } + }, [selectedBoardId, galleryView, imagesForBoard, imageNamesAll]); + + const areMoreAvailable = useMemo(() => { + return selectedBoardId === 'all' ? totalAll > imageNamesAll.length : false; + }, [selectedBoardId, imageNamesAll.length, totalAll]); + + const isLoading = useMemo(() => { + return selectedBoardId === 'all' ? isLoadingAll : isLoadingImagesForBoard; + }, [selectedBoardId, isLoadingAll, isLoadingImagesForBoard]); + + const handleLoadMoreImages = useCallback(() => { + dispatch( + receivedPageOfImages({ + categories: + galleryView === 'images' ? IMAGE_CATEGORIES : ASSETS_CATEGORIES, + is_intermediate: false, + offset: imageNames.length, + limit: IMAGE_LIMIT, + }) + ); + }, [dispatch, imageNames.length, galleryView]); + + useEffect(() => { + // Set up gallery scroler + const { current: root } = rootRef; + if (scroller && root) { + initialize({ + target: root, + elements: { + viewport: scroller, + }, + }); + } + return () => osInstance()?.destroy(); + }, [scroller, initialize, osInstance]); + + const handleEndReached = useMemo(() => { + if (areMoreAvailable) { + return handleLoadMoreImages; + } + return undefined; + }, [areMoreAvailable, handleLoadMoreImages]); + + // useEffect(() => { + // if (!didInitialFetch) { + // return; + // } + // // rough, conservative calculation of how many images fit in the gallery + // // TODO: this gets an incorrect value on first load... + // const galleryHeight = rootRef.current?.clientHeight ?? 0; + // const galleryWidth = rootRef.current?.clientHeight ?? 0; + + // const rows = galleryHeight / galleryImageMinimumWidth; + // const columns = galleryWidth / galleryImageMinimumWidth; + + // const imagesToLoad = Math.ceil(rows * columns); + + // setDidInitialFetch(true); + + // // load up that many images + // dispatch( + // receivedPageOfImages({ + // offset: 0, + // limit: 10, + // }) + // ); + // }, [ + // didInitialFetch, + // dispatch, + // galleryImageMinimumWidth, + // galleryView, + // selectedBoardId, + // ]); + + if (!isLoading && imageNames.length === 0) { + return ( + + + + ); + } + + if (status !== 'rejected') { + return ( + <> + + ( + + )} + /> + + + {areMoreAvailable + ? t('gallery.loadMore') + : t('gallery.allImagesLoaded')} + + + ); + } +}; + +export default memo(GalleryImageGrid); diff --git a/invokeai/frontend/web/src/features/gallery/components/ImageGrid/ImageGridItemContainer.tsx b/invokeai/frontend/web/src/features/gallery/components/ImageGrid/ImageGridItemContainer.tsx new file mode 100644 index 0000000000..a09455ef2c --- /dev/null +++ b/invokeai/frontend/web/src/features/gallery/components/ImageGrid/ImageGridItemContainer.tsx @@ -0,0 +1,11 @@ +import { Box, FlexProps, forwardRef } from '@chakra-ui/react'; +import { PropsWithChildren } from 'react'; + +type ItemContainerProps = PropsWithChildren & FlexProps; +const ItemContainer = forwardRef((props: ItemContainerProps, ref) => ( + + {props.children} + +)); + +export default ItemContainer; diff --git a/invokeai/frontend/web/src/features/gallery/components/ImageGrid/ImageGridListContainer.tsx b/invokeai/frontend/web/src/features/gallery/components/ImageGrid/ImageGridListContainer.tsx new file mode 100644 index 0000000000..fbbca2b2cf --- /dev/null +++ b/invokeai/frontend/web/src/features/gallery/components/ImageGrid/ImageGridListContainer.tsx @@ -0,0 +1,26 @@ +import { FlexProps, Grid, forwardRef } from '@chakra-ui/react'; +import { RootState } from 'app/store/store'; +import { useAppSelector } from 'app/store/storeHooks'; +import { PropsWithChildren } from 'react'; + +type ListContainerProps = PropsWithChildren & FlexProps; +const ListContainer = forwardRef((props: ListContainerProps, ref) => { + const galleryImageMinimumWidth = useAppSelector( + (state: RootState) => state.gallery.galleryImageMinimumWidth + ); + + return ( + + {props.children} + + ); +}); + +export default ListContainer; diff --git a/invokeai/frontend/web/src/features/gallery/components/ImageMetaDataViewer/ImageMetadataActions.tsx b/invokeai/frontend/web/src/features/gallery/components/ImageMetadataViewer/ImageMetadataActions.tsx similarity index 94% rename from invokeai/frontend/web/src/features/gallery/components/ImageMetaDataViewer/ImageMetadataActions.tsx rename to invokeai/frontend/web/src/features/gallery/components/ImageMetadataViewer/ImageMetadataActions.tsx index 35685bde6f..89cd0a5005 100644 --- a/invokeai/frontend/web/src/features/gallery/components/ImageMetaDataViewer/ImageMetadataActions.tsx +++ b/invokeai/frontend/web/src/features/gallery/components/ImageMetadataViewer/ImageMetadataActions.tsx @@ -1,7 +1,7 @@ import { useRecallParameters } from 'features/parameters/hooks/useRecallParameters'; import { useCallback } from 'react'; import { UnsafeImageMetadata } from 'services/api/endpoints/images'; -import MetadataItem from './MetadataItem'; +import ImageMetadataItem from './ImageMetadataItem'; type Props = { metadata?: UnsafeImageMetadata['metadata']; @@ -73,13 +73,13 @@ const ImageMetadataActions = (props: Props) => { return ( <> {metadata.generation_mode && ( - )} {metadata.positive_prompt && ( - { /> )} {metadata.negative_prompt && ( - { /> )} {metadata.seed !== undefined && ( - )} {metadata.model !== undefined && ( - )} {metadata.width && ( - )} {metadata.height && ( - { /> )} */} {metadata.scheduler && ( - )} {metadata.steps && ( - )} {metadata.cfg_scale !== undefined && ( - { /> )} */} {metadata.strength && ( - { +const ImageMetadataJSON = (props: Props) => { const { copyTooltip, jsonObject } = props; const jsonString = useMemo( () => JSON.stringify(jsonObject, null, 2), @@ -67,4 +67,4 @@ const MetadataJSONViewer = (props: Props) => { ); }; -export default MetadataJSONViewer; +export default ImageMetadataJSON; diff --git a/invokeai/frontend/web/src/features/gallery/components/ImageMetaDataViewer/ImageMetadataViewer.tsx b/invokeai/frontend/web/src/features/gallery/components/ImageMetadataViewer/ImageMetadataViewer.tsx similarity index 97% rename from invokeai/frontend/web/src/features/gallery/components/ImageMetaDataViewer/ImageMetadataViewer.tsx rename to invokeai/frontend/web/src/features/gallery/components/ImageMetadataViewer/ImageMetadataViewer.tsx index 83be19658f..e1f2a9e46a 100644 --- a/invokeai/frontend/web/src/features/gallery/components/ImageMetaDataViewer/ImageMetadataViewer.tsx +++ b/invokeai/frontend/web/src/features/gallery/components/ImageMetadataViewer/ImageMetadataViewer.tsx @@ -15,7 +15,7 @@ import { useGetImageMetadataQuery } from 'services/api/endpoints/images'; import { ImageDTO } from 'services/api/types'; import { useDebounce } from 'use-debounce'; import ImageMetadataActions from './ImageMetadataActions'; -import MetadataJSONViewer from './MetadataJSONViewer'; +import ImageMetadataJSON from './ImageMetadataJSON'; type ImageMetadataViewerProps = { image: ImageDTO; @@ -123,7 +123,7 @@ const ImageMetadataViewer = ({ image }: ImageMetadataViewerProps) => { key={tab.label} sx={{ w: 'full', h: 'full', p: 0, pt: 4 }} > - diff --git a/invokeai/frontend/web/src/features/gallery/components/NextPrevImageButtons.tsx b/invokeai/frontend/web/src/features/gallery/components/NextPrevImageButtons.tsx index 5a510616a1..06e2a22cbd 100644 --- a/invokeai/frontend/web/src/features/gallery/components/NextPrevImageButtons.tsx +++ b/invokeai/frontend/web/src/features/gallery/components/NextPrevImageButtons.tsx @@ -1,17 +1,12 @@ -import { ChakraProps, Flex, Grid, IconButton, Spinner } from '@chakra-ui/react'; -import { memo, useCallback, useState } from 'react'; +import { Box, ChakraProps, Flex, IconButton, Spinner } from '@chakra-ui/react'; +import { memo } from 'react'; import { useTranslation } from 'react-i18next'; import { FaAngleDoubleRight, FaAngleLeft, FaAngleRight } from 'react-icons/fa'; import { useNextPrevImage } from '../hooks/useNextPrevImage'; -const nextPrevButtonTriggerAreaStyles: ChakraProps['sx'] = { - height: '100%', - width: '15%', - alignItems: 'center', - pointerEvents: 'auto', -}; const nextPrevButtonStyles: ChakraProps['sx'] = { color: 'base.100', + pointerEvents: 'auto', }; const NextPrevImageButtons = () => { @@ -27,35 +22,23 @@ const NextPrevImageButtons = () => { isFetching, } = useNextPrevImage(); - const [shouldShowNextPrevButtons, setShouldShowNextPrevButtons] = - useState(false); - - const handleCurrentImagePreviewMouseOver = useCallback(() => { - setShouldShowNextPrevButtons(true); - }, []); - - const handleCurrentImagePreviewMouseOut = useCallback(() => { - setShouldShowNextPrevButtons(false); - }, []); - return ( - - - {shouldShowNextPrevButtons && !isOnFirstImage && ( + {!isOnFirstImage && ( } @@ -65,16 +48,16 @@ const NextPrevImageButtons = () => { sx={nextPrevButtonStyles} /> )} - - + - {shouldShowNextPrevButtons && !isOnLastImage && ( + {!isOnLastImage && ( } @@ -84,36 +67,30 @@ const NextPrevImageButtons = () => { sx={nextPrevButtonStyles} /> )} - {shouldShowNextPrevButtons && - isOnLastImage && - areMoreImagesAvailable && - !isFetching && ( - } - variant="unstyled" - onClick={handleLoadMoreImages} - boxSize={16} - sx={nextPrevButtonStyles} - /> - )} - {shouldShowNextPrevButtons && - isOnLastImage && - areMoreImagesAvailable && - isFetching && ( - - - - )} - - + {isOnLastImage && areMoreImagesAvailable && !isFetching && ( + } + variant="unstyled" + onClick={handleLoadMoreImages} + boxSize={16} + sx={nextPrevButtonStyles} + /> + )} + {isOnLastImage && areMoreImagesAvailable && isFetching && ( + + + + )} + + ); }; diff --git a/invokeai/frontend/web/src/features/gallery/hooks/useNextPrevImage.ts b/invokeai/frontend/web/src/features/gallery/hooks/useNextPrevImage.ts index 5beadabbc1..44473bea83 100644 --- a/invokeai/frontend/web/src/features/gallery/hooks/useNextPrevImage.ts +++ b/invokeai/frontend/web/src/features/gallery/hooks/useNextPrevImage.ts @@ -3,12 +3,12 @@ import { stateSelector } from 'app/store/store'; import { useAppDispatch, useAppSelector } from 'app/store/storeHooks'; import { imageSelected, - selectFilteredImages, selectImagesById, } from 'features/gallery/store/gallerySlice'; import { clamp, isEqual } from 'lodash-es'; import { useCallback } from 'react'; import { receivedPageOfImages } from 'services/api/thunks/image'; +import { selectFilteredImages } from '../store/gallerySelectors'; export const nextPrevImageButtonsSelector = createSelector( [stateSelector, selectFilteredImages], diff --git a/invokeai/frontend/web/src/features/gallery/store/galleryPersistDenylist.ts b/invokeai/frontend/web/src/features/gallery/store/galleryPersistDenylist.ts index 5b4a439e38..acef7d6fc1 100644 --- a/invokeai/frontend/web/src/features/gallery/store/galleryPersistDenylist.ts +++ b/invokeai/frontend/web/src/features/gallery/store/galleryPersistDenylist.ts @@ -11,7 +11,6 @@ export const galleryPersistDenylist: (keyof typeof initialGalleryState)[] = [ 'limit', 'offset', 'selectedBoardId', - 'categories', 'galleryView', 'total', 'isInitialized', diff --git a/invokeai/frontend/web/src/features/gallery/store/gallerySelectors.ts b/invokeai/frontend/web/src/features/gallery/store/gallerySelectors.ts index 3c7e366bf7..045fb68737 100644 --- a/invokeai/frontend/web/src/features/gallery/store/gallerySelectors.ts +++ b/invokeai/frontend/web/src/features/gallery/store/gallerySelectors.ts @@ -1,3 +1,136 @@ +import { createSelector } from '@reduxjs/toolkit'; import { RootState } from 'app/store/store'; +import { defaultSelectorOptions } from 'app/store/util/defaultMemoizeOptions'; +import { clamp, keyBy } from 'lodash-es'; +import { ImageDTO } from 'services/api/types'; +import { + ASSETS_CATEGORIES, + BoardId, + IMAGE_CATEGORIES, + imagesAdapter, + initialGalleryState, +} from './gallerySlice'; export const gallerySelector = (state: RootState) => state.gallery; + +const isInSelectedBoard = ( + selectedBoardId: BoardId, + imageDTO: ImageDTO, + batchImageNames: string[] +) => { + if (selectedBoardId === 'all') { + // all images are in the "All Images" board + return true; + } + + if (selectedBoardId === 'none' && !imageDTO.board_id) { + // Only images without a board are in the "No Board" board + return true; + } + + if ( + selectedBoardId === 'batch' && + batchImageNames.includes(imageDTO.image_name) + ) { + // Only images with is_batch are in the "Batch" board + return true; + } + + return selectedBoardId === imageDTO.board_id; +}; + +export const selectFilteredImagesLocal = createSelector( + [(state: typeof initialGalleryState) => state], + (galleryState) => { + const allImages = imagesAdapter.getSelectors().selectAll(galleryState); + const { galleryView, selectedBoardId } = galleryState; + + const categories = + galleryView === 'images' ? IMAGE_CATEGORIES : ASSETS_CATEGORIES; + + const filteredImages = allImages.filter((i) => { + const isInCategory = categories.includes(i.image_category); + + const isInBoard = isInSelectedBoard( + selectedBoardId, + i, + galleryState.batchImageNames + ); + return isInCategory && isInBoard; + }); + + return filteredImages; + } +); + +export const selectFilteredImages = createSelector( + (state: RootState) => state, + (state) => { + return selectFilteredImagesLocal(state.gallery); + }, + defaultSelectorOptions +); + +export const selectFilteredImagesAsObject = createSelector( + selectFilteredImages, + (filteredImages) => keyBy(filteredImages, 'image_name') +); + +export const selectFilteredImagesIds = createSelector( + selectFilteredImages, + (filteredImages) => filteredImages.map((i) => i.image_name) +); + +export const selectLastSelectedImage = createSelector( + (state: RootState) => state, + (state) => state.gallery.selection[state.gallery.selection.length - 1], + defaultSelectorOptions +); + +export const selectSelectedImages = createSelector( + (state: RootState) => state, + (state) => + imagesAdapter + .getSelectors() + .selectAll(state.gallery) + .filter((i) => state.gallery.selection.includes(i.image_name)), + defaultSelectorOptions +); + +export const selectNextImageToSelectLocal = createSelector( + [ + (state: typeof initialGalleryState) => state, + (state: typeof initialGalleryState, image_name: string) => image_name, + ], + (state, image_name) => { + const filteredImages = selectFilteredImagesLocal(state); + const ids = filteredImages.map((i) => i.image_name); + + const deletedImageIndex = ids.findIndex( + (result) => result.toString() === image_name + ); + + const filteredIds = ids.filter((id) => id.toString() !== image_name); + + const newSelectedImageIndex = clamp( + deletedImageIndex, + 0, + filteredIds.length - 1 + ); + + const newSelectedImageId = filteredIds[newSelectedImageIndex]; + + return newSelectedImageId; + } +); + +export const selectNextImageToSelect = createSelector( + [ + (state: RootState) => state, + (state: RootState, image_name: string) => image_name, + ], + (state, image_name) => { + return selectNextImageToSelectLocal(state.gallery, image_name); + }, + defaultSelectorOptions +); diff --git a/invokeai/frontend/web/src/features/gallery/store/gallerySlice.ts b/invokeai/frontend/web/src/features/gallery/store/gallerySlice.ts index 63fd9625a0..fa1f6a6f1a 100644 --- a/invokeai/frontend/web/src/features/gallery/store/gallerySlice.ts +++ b/invokeai/frontend/web/src/features/gallery/store/gallerySlice.ts @@ -1,19 +1,15 @@ import type { PayloadAction, Update } from '@reduxjs/toolkit'; -import { - createEntityAdapter, - createSelector, - createSlice, -} from '@reduxjs/toolkit'; +import { createEntityAdapter, createSlice } from '@reduxjs/toolkit'; import { RootState } from 'app/store/store'; -import { defaultSelectorOptions } from 'app/store/util/defaultMemoizeOptions'; import { dateComparator } from 'common/util/dateComparator'; -import { keyBy, uniq } from 'lodash-es'; +import { uniq } from 'lodash-es'; import { boardsApi } from 'services/api/endpoints/boards'; import { imageUrlsReceived, receivedPageOfImages, } from 'services/api/thunks/image'; import { ImageCategory, ImageDTO } from 'services/api/types'; +import { selectFilteredImagesLocal } from './gallerySelectors'; export const imagesAdapter = createEntityAdapter({ selectId: (image) => image.image_name, @@ -27,23 +23,30 @@ export const ASSETS_CATEGORIES: ImageCategory[] = [ 'user', 'other', ]; - export const INITIAL_IMAGE_LIMIT = 100; export const IMAGE_LIMIT = 20; +export type GalleryView = 'images' | 'assets'; +export type BoardId = + | 'all' + | 'none' + | 'batch' + | (string & Record); + type AdditionaGalleryState = { offset: number; limit: number; total: number; isLoading: boolean; isFetching: boolean; - categories: ImageCategory[]; - selectedBoardId?: string; selection: string[]; shouldAutoSwitch: boolean; galleryImageMinimumWidth: number; - galleryView: 'images' | 'assets'; + galleryView: GalleryView; + selectedBoardId: BoardId; isInitialized: boolean; + batchImageNames: string[]; + isBatchEnabled: boolean; }; export const initialGalleryState = @@ -53,12 +56,14 @@ export const initialGalleryState = total: 0, isLoading: true, isFetching: true, - categories: IMAGE_CATEGORIES, selection: [], shouldAutoSwitch: true, galleryImageMinimumWidth: 96, galleryView: 'images', + selectedBoardId: 'all', isInitialized: false, + batchImageNames: [], + isBatchEnabled: false, }); export const gallerySlice = createSlice({ @@ -73,7 +78,7 @@ export const gallerySlice = createSlice({ ) { state.selection = [action.payload.image_name]; state.galleryView = 'images'; - state.categories = IMAGE_CATEGORIES; + state.selectedBoardId = 'all'; } }, imageUpdatedOne: (state, action: PayloadAction>) => { @@ -81,12 +86,15 @@ export const gallerySlice = createSlice({ }, imageRemoved: (state, action: PayloadAction) => { imagesAdapter.removeOne(state, action.payload); + state.batchImageNames = state.batchImageNames.filter( + (name) => name !== action.payload + ); }, imagesRemoved: (state, action: PayloadAction) => { imagesAdapter.removeMany(state, action.payload); - }, - imageCategoriesChanged: (state, action: PayloadAction) => { - state.categories = action.payload; + state.batchImageNames = state.batchImageNames.filter( + (name) => !action.payload.includes(name) + ); }, imageRangeEndSelected: (state, action: PayloadAction) => { const rangeEndImageName = action.payload; @@ -127,9 +135,7 @@ export const gallerySlice = createSlice({ } }, imageSelected: (state, action: PayloadAction) => { - state.selection = action.payload - ? [action.payload] - : [String(state.ids[0])]; + state.selection = action.payload ? [action.payload] : []; }, shouldAutoSwitchChanged: (state, action: PayloadAction) => { state.shouldAutoSwitch = action.payload; @@ -137,15 +143,43 @@ export const gallerySlice = createSlice({ setGalleryImageMinimumWidth: (state, action: PayloadAction) => { state.galleryImageMinimumWidth = action.payload; }, - setGalleryView: (state, action: PayloadAction<'images' | 'assets'>) => { + setGalleryView: (state, action: PayloadAction) => { state.galleryView = action.payload; }, - boardIdSelected: (state, action: PayloadAction) => { + boardIdSelected: (state, action: PayloadAction) => { state.selectedBoardId = action.payload; }, isLoadingChanged: (state, action: PayloadAction) => { state.isLoading = action.payload; }, + isBatchEnabledChanged: (state, action: PayloadAction) => { + state.isBatchEnabled = action.payload; + }, + imagesAddedToBatch: (state, action: PayloadAction) => { + state.batchImageNames = uniq( + state.batchImageNames.concat(action.payload) + ); + }, + imagesRemovedFromBatch: (state, action: PayloadAction) => { + state.batchImageNames = state.batchImageNames.filter( + (imageName) => !action.payload.includes(imageName) + ); + + const newSelection = state.selection.filter( + (imageName) => !action.payload.includes(imageName) + ); + + if (newSelection.length) { + state.selection = newSelection; + return; + } + + state.selection = [state.batchImageNames[0]] ?? []; + }, + batchReset: (state) => { + state.batchImageNames = []; + state.selection = []; + }, }, extraReducers: (builder) => { builder.addCase(receivedPageOfImages.pending, (state) => { @@ -188,7 +222,7 @@ export const gallerySlice = createSlice({ boardsApi.endpoints.deleteBoard.matchFulfilled, (state, action) => { if (action.meta.arg.originalArgs === state.selectedBoardId) { - state.selectedBoardId = undefined; + state.selectedBoardId = 'all'; } } ); @@ -208,7 +242,6 @@ export const { imageUpdatedOne, imageRemoved, imagesRemoved, - imageCategoriesChanged, imageRangeEndSelected, imageSelectionToggled, imageSelected, @@ -217,48 +250,9 @@ export const { setGalleryView, boardIdSelected, isLoadingChanged, + isBatchEnabledChanged, + imagesAddedToBatch, + imagesRemovedFromBatch, } = gallerySlice.actions; export default gallerySlice.reducer; - -export const selectFilteredImagesLocal = createSelector( - (state: typeof initialGalleryState) => state, - (galleryState) => { - const allImages = imagesAdapter.getSelectors().selectAll(galleryState); - const { categories, selectedBoardId } = galleryState; - - const filteredImages = allImages.filter((i) => { - const isInCategory = categories.includes(i.image_category); - const isInSelectedBoard = selectedBoardId - ? i.board_id === selectedBoardId - : true; - return isInCategory && isInSelectedBoard; - }); - - return filteredImages; - } -); - -export const selectFilteredImages = createSelector( - (state: RootState) => state, - (state) => { - return selectFilteredImagesLocal(state.gallery); - }, - defaultSelectorOptions -); - -export const selectFilteredImagesAsObject = createSelector( - selectFilteredImages, - (filteredImages) => keyBy(filteredImages, 'image_name') -); - -export const selectFilteredImagesIds = createSelector( - selectFilteredImages, - (filteredImages) => filteredImages.map((i) => i.image_name) -); - -export const selectLastSelectedImage = createSelector( - (state: RootState) => state, - (state) => state.gallery.selection[state.gallery.selection.length - 1], - defaultSelectorOptions -); diff --git a/invokeai/frontend/web/src/features/lightbox/components/Lightbox.tsx b/invokeai/frontend/web/src/features/lightbox/components/Lightbox.tsx deleted file mode 100644 index cd0ce55b1e..0000000000 --- a/invokeai/frontend/web/src/features/lightbox/components/Lightbox.tsx +++ /dev/null @@ -1,167 +0,0 @@ -import { Box, Flex } from '@chakra-ui/react'; -import { createSelector } from '@reduxjs/toolkit'; -import { RootState } from 'app/store/store'; -import { useAppDispatch, useAppSelector } from 'app/store/storeHooks'; -import IAIIconButton from 'common/components/IAIIconButton'; -import CurrentImageButtons from 'features/gallery/components/CurrentImageButtons'; -import ImageMetadataViewer from 'features/gallery/components/ImageMetaDataViewer/ImageMetadataViewer'; -import NextPrevImageButtons from 'features/gallery/components/NextPrevImageButtons'; -import { gallerySelector } from 'features/gallery/store/gallerySelectors'; -import { setIsLightboxOpen } from 'features/lightbox/store/lightboxSlice'; -import { uiSelector } from 'features/ui/store/uiSelectors'; -import { AnimatePresence, motion } from 'framer-motion'; -import { isEqual } from 'lodash-es'; -import { useHotkeys } from 'react-hotkeys-hook'; -import { BiExit } from 'react-icons/bi'; -import { TransformWrapper } from 'react-zoom-pan-pinch'; -import { PROGRESS_BAR_THICKNESS } from 'theme/util/constants'; -import useImageTransform from '../hooks/useImageTransform'; -import ReactPanZoomButtons from './ReactPanZoomButtons'; -import ReactPanZoomImage from './ReactPanZoomImage'; - -export const lightboxSelector = createSelector( - [gallerySelector, uiSelector], - (gallery, ui) => { - const { currentImage } = gallery; - const { shouldShowImageDetails } = ui; - - return { - viewerImageToDisplay: currentImage, - shouldShowImageDetails, - }; - }, - { - memoizeOptions: { - resultEqualityCheck: isEqual, - }, - } -); - -export default function Lightbox() { - const dispatch = useAppDispatch(); - const isLightBoxOpen = useAppSelector( - (state: RootState) => state.lightbox.isLightboxOpen - ); - - const { - rotation, - scaleX, - scaleY, - flipHorizontally, - flipVertically, - rotateCounterClockwise, - rotateClockwise, - reset, - } = useImageTransform(); - - const { viewerImageToDisplay, shouldShowImageDetails } = - useAppSelector(lightboxSelector); - - useHotkeys( - 'Esc', - () => { - if (isLightBoxOpen) dispatch(setIsLightboxOpen(false)); - }, - [isLightBoxOpen] - ); - - return ( - - {isLightBoxOpen && ( - - - - } - aria-label="Exit Viewer" - className="lightbox-close-btn" - onClick={() => { - dispatch(setIsLightboxOpen(false)); - }} - fontSize={20} - /> - - - - - - - {viewerImageToDisplay && ( - <> - - {shouldShowImageDetails && ( - - )} - - {!shouldShowImageDetails && ( - - - - )} - - )} - - - )} - - ); -} diff --git a/invokeai/frontend/web/src/features/lightbox/components/ReactPanZoomButtons.tsx b/invokeai/frontend/web/src/features/lightbox/components/ReactPanZoomButtons.tsx deleted file mode 100644 index 2e592e83d7..0000000000 --- a/invokeai/frontend/web/src/features/lightbox/components/ReactPanZoomButtons.tsx +++ /dev/null @@ -1,96 +0,0 @@ -import { ButtonGroup } from '@chakra-ui/react'; -import IAIIconButton from 'common/components/IAIIconButton'; -import { useTranslation } from 'react-i18next'; -import { - BiReset, - BiRotateLeft, - BiRotateRight, - BiZoomIn, - BiZoomOut, -} from 'react-icons/bi'; -import { MdFlip } from 'react-icons/md'; -import { useTransformContext } from 'react-zoom-pan-pinch'; - -type ReactPanZoomButtonsProps = { - flipHorizontally: () => void; - flipVertically: () => void; - rotateCounterClockwise: () => void; - rotateClockwise: () => void; - reset: () => void; -}; - -const ReactPanZoomButtons = ({ - flipHorizontally, - flipVertically, - rotateCounterClockwise, - rotateClockwise, - reset, -}: ReactPanZoomButtonsProps) => { - const { zoomIn, zoomOut, resetTransform } = useTransformContext(); - const { t } = useTranslation(); - - return ( - - } - aria-label={t('accessibility.zoomIn')} - tooltip={t('accessibility.zoomIn')} - onClick={() => zoomIn()} - fontSize={20} - /> - - } - aria-label={t('accessibility.zoomOut')} - tooltip={t('accessibility.zoomOut')} - onClick={() => zoomOut()} - fontSize={20} - /> - - } - aria-label={t('accessibility.rotateCounterClockwise')} - tooltip={t('accessibility.rotateCounterClockwise')} - onClick={rotateCounterClockwise} - fontSize={20} - /> - - } - aria-label={t('accessibility.rotateClockwise')} - tooltip={t('accessibility.rotateClockwise')} - onClick={rotateClockwise} - fontSize={20} - /> - - } - aria-label={t('accessibility.flipHorizontally')} - tooltip={t('accessibility.flipHorizontally')} - onClick={flipHorizontally} - fontSize={20} - /> - - } - aria-label={t('accessibility.flipVertically')} - tooltip={t('accessibility.flipVertically')} - onClick={flipVertically} - fontSize={20} - /> - - } - aria-label={t('accessibility.reset')} - tooltip={t('accessibility.reset')} - onClick={() => { - resetTransform(); - reset(); - }} - fontSize={20} - /> - - ); -}; - -export default ReactPanZoomButtons; diff --git a/invokeai/frontend/web/src/features/lightbox/components/ReactPanZoomImage.tsx b/invokeai/frontend/web/src/features/lightbox/components/ReactPanZoomImage.tsx deleted file mode 100644 index 73e7144163..0000000000 --- a/invokeai/frontend/web/src/features/lightbox/components/ReactPanZoomImage.tsx +++ /dev/null @@ -1,46 +0,0 @@ -import * as React from 'react'; -import { TransformComponent, useTransformContext } from 'react-zoom-pan-pinch'; -import { ImageDTO } from 'services/api/types'; - -type ReactPanZoomProps = { - image: ImageDTO; - styleClass?: string; - alt?: string; - ref?: React.Ref; - rotation: number; - scaleX: number; - scaleY: number; -}; - -export default function ReactPanZoomImage({ - image, - alt, - ref, - styleClass, - rotation, - scaleX, - scaleY, -}: ReactPanZoomProps) { - const { centerView } = useTransformContext(); - - return ( - - {alt} centerView(1, 0, 'easeOut')} - /> - - ); -} diff --git a/invokeai/frontend/web/src/features/lightbox/hooks/useImageTransform.ts b/invokeai/frontend/web/src/features/lightbox/hooks/useImageTransform.ts deleted file mode 100644 index c191d7d1d7..0000000000 --- a/invokeai/frontend/web/src/features/lightbox/hooks/useImageTransform.ts +++ /dev/null @@ -1,50 +0,0 @@ -import { useState } from 'react'; - -const useImageTransform = () => { - const [rotation, setRotation] = useState(0); - const [scaleX, setScaleX] = useState(1); - const [scaleY, setScaleY] = useState(1); - - const rotateCounterClockwise = () => { - if (rotation === -270) { - setRotation(0); - } else { - setRotation(rotation - 90); - } - }; - - const rotateClockwise = () => { - if (rotation === 270) { - setRotation(0); - } else { - setRotation(rotation + 90); - } - }; - - const flipHorizontally = () => { - setScaleX(scaleX * -1); - }; - - const flipVertically = () => { - setScaleY(scaleY * -1); - }; - - const reset = () => { - setRotation(0); - setScaleX(1); - setScaleY(1); - }; - - return { - rotation, - scaleX, - scaleY, - flipHorizontally, - flipVertically, - rotateCounterClockwise, - rotateClockwise, - reset, - }; -}; - -export default useImageTransform; diff --git a/invokeai/frontend/web/src/features/lightbox/store/lightboxPersistDenylist.ts b/invokeai/frontend/web/src/features/lightbox/store/lightboxPersistDenylist.ts deleted file mode 100644 index b8a1d12f44..0000000000 --- a/invokeai/frontend/web/src/features/lightbox/store/lightboxPersistDenylist.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { LightboxState } from './lightboxSlice'; - -/** - * Lightbox slice persist denylist - */ -export const lightboxPersistDenylist: (keyof LightboxState)[] = [ - 'isLightboxOpen', -]; diff --git a/invokeai/frontend/web/src/features/lightbox/store/lightboxSelectors.ts b/invokeai/frontend/web/src/features/lightbox/store/lightboxSelectors.ts deleted file mode 100644 index f7d7e0129a..0000000000 --- a/invokeai/frontend/web/src/features/lightbox/store/lightboxSelectors.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { createSelector } from '@reduxjs/toolkit'; -import { RootState } from 'app/store/store'; -import { isEqual } from 'lodash-es'; - -export const lightboxSelector = createSelector( - (state: RootState) => state.lightbox, - (lightbox) => lightbox, - { - memoizeOptions: { - equalityCheck: isEqual, - }, - } -); diff --git a/invokeai/frontend/web/src/features/lightbox/store/lightboxSlice.ts b/invokeai/frontend/web/src/features/lightbox/store/lightboxSlice.ts deleted file mode 100644 index ea73e5bb13..0000000000 --- a/invokeai/frontend/web/src/features/lightbox/store/lightboxSlice.ts +++ /dev/null @@ -1,26 +0,0 @@ -import type { PayloadAction } from '@reduxjs/toolkit'; -import { createSlice } from '@reduxjs/toolkit'; - -export interface LightboxState { - isLightboxOpen: boolean; -} - -export const initialLightboxState: LightboxState = { - isLightboxOpen: false, -}; - -const initialState: LightboxState = initialLightboxState; - -export const lightboxSlice = createSlice({ - name: 'lightbox', - initialState, - reducers: { - setIsLightboxOpen: (state, action: PayloadAction) => { - state.isLightboxOpen = action.payload; - }, - }, -}); - -export const { setIsLightboxOpen } = lightboxSlice.actions; - -export default lightboxSlice.reducer; diff --git a/invokeai/frontend/web/src/features/lora/components/ParamLora.tsx b/invokeai/frontend/web/src/features/lora/components/ParamLora.tsx index 7dba2aa6ed..a1584ca13a 100644 --- a/invokeai/frontend/web/src/features/lora/components/ParamLora.tsx +++ b/invokeai/frontend/web/src/features/lora/components/ParamLora.tsx @@ -5,14 +5,14 @@ import IAISlider from 'common/components/IAISlider'; import { memo, useCallback } from 'react'; import { FaTrash } from 'react-icons/fa'; import { - Lora, + LoRA, loraRemoved, loraWeightChanged, loraWeightReset, } from '../store/loraSlice'; type Props = { - lora: Lora; + lora: LoRA; }; const ParamLora = (props: Props) => { diff --git a/invokeai/frontend/web/src/features/lora/components/ParamLoraCollapse.tsx b/invokeai/frontend/web/src/features/lora/components/ParamLoraCollapse.tsx index 436c32f46b..e212efbfa2 100644 --- a/invokeai/frontend/web/src/features/lora/components/ParamLoraCollapse.tsx +++ b/invokeai/frontend/web/src/features/lora/components/ParamLoraCollapse.tsx @@ -6,9 +6,9 @@ import { defaultSelectorOptions } from 'app/store/util/defaultMemoizeOptions'; import IAICollapse from 'common/components/IAICollapse'; import { size } from 'lodash-es'; import { memo } from 'react'; -import ParamLoraList from './ParamLoraList'; -import ParamLoraSelect from './ParamLoraSelect'; import { useFeatureStatus } from '../../system/hooks/useFeatureStatus'; +import ParamLoraList from './ParamLoraList'; +import ParamLoRASelect from './ParamLoraSelect'; const selector = createSelector( stateSelector, @@ -33,7 +33,7 @@ const ParamLoraCollapse = () => { return ( - + diff --git a/invokeai/frontend/web/src/features/lora/components/ParamLoraSelect.tsx b/invokeai/frontend/web/src/features/lora/components/ParamLoraSelect.tsx index ebceeb34db..951037f9e3 100644 --- a/invokeai/frontend/web/src/features/lora/components/ParamLoraSelect.tsx +++ b/invokeai/frontend/web/src/features/lora/components/ParamLoraSelect.tsx @@ -4,10 +4,10 @@ import { createSelector } from '@reduxjs/toolkit'; import { RootState, stateSelector } from 'app/store/store'; import { useAppDispatch, useAppSelector } from 'app/store/storeHooks'; import { defaultSelectorOptions } from 'app/store/util/defaultMemoizeOptions'; -import IAIMantineSelect from 'common/components/IAIMantineSelect'; +import IAIMantineSearchableSelect from 'common/components/IAIMantineSearchableSelect'; import IAIMantineSelectItemWithTooltip from 'common/components/IAIMantineSelectItemWithTooltip'; import { loraAdded } from 'features/lora/store/loraSlice'; -import { MODEL_TYPE_MAP } from 'features/system/components/ModelSelect'; +import { MODEL_TYPE_MAP } from 'features/parameters/types/constants'; import { forEach } from 'lodash-es'; import { useCallback, useMemo } from 'react'; import { useGetLoRAModelsQuery } from 'services/api/endpoints/models'; @@ -20,23 +20,23 @@ const selector = createSelector( defaultSelectorOptions ); -const ParamLoraSelect = () => { +const ParamLoRASelect = () => { const dispatch = useAppDispatch(); const { loras } = useAppSelector(selector); - const { data: lorasQueryData } = useGetLoRAModelsQuery(); + const { data: loraModels } = useGetLoRAModelsQuery(); const currentMainModel = useAppSelector( (state: RootState) => state.generation.model ); const data = useMemo(() => { - if (!lorasQueryData) { + if (!loraModels) { return []; } const data: SelectItem[] = []; - forEach(lorasQueryData.entities, (lora, id) => { + forEach(loraModels.entities, (lora, id) => { if (!lora || Boolean(id in loras)) { return; } @@ -55,23 +55,25 @@ const ParamLoraSelect = () => { }); return data.sort((a, b) => (a.disabled && !b.disabled ? 1 : -1)); - }, [loras, lorasQueryData, currentMainModel?.base_model]); + }, [loras, loraModels, currentMainModel?.base_model]); const handleChange = useCallback( (v: string | null | undefined) => { if (!v) { return; } - const loraEntity = lorasQueryData?.entities[v]; + const loraEntity = loraModels?.entities[v]; + if (!loraEntity) { return; } + dispatch(loraAdded(loraEntity)); }, - [dispatch, lorasQueryData?.entities] + [dispatch, loraModels?.entities] ); - if (lorasQueryData?.ids.length === 0) { + if (loraModels?.ids.length === 0) { return ( @@ -82,7 +84,7 @@ const ParamLoraSelect = () => { } return ( - { ); }; -export default ParamLoraSelect; +export default ParamLoRASelect; diff --git a/invokeai/frontend/web/src/features/lora/store/loraSlice.ts b/invokeai/frontend/web/src/features/lora/store/loraSlice.ts index a97a0887a5..f0067a85a2 100644 --- a/invokeai/frontend/web/src/features/lora/store/loraSlice.ts +++ b/invokeai/frontend/web/src/features/lora/store/loraSlice.ts @@ -1,8 +1,9 @@ import { PayloadAction, createSlice } from '@reduxjs/toolkit'; -import { LoRAModelParam } from 'features/parameters/store/parameterZodSchemas'; +import { LoRAModelParam } from 'features/parameters/types/parameterSchemas'; import { LoRAModelConfigEntity } from 'services/api/endpoints/models'; -export type Lora = LoRAModelParam & { +export type LoRA = LoRAModelParam & { + id: string; weight: number; }; @@ -11,7 +12,7 @@ export const defaultLoRAConfig = { }; export type LoraState = { - loras: Record; + loras: Record; }; export const intialLoraState: LoraState = { diff --git a/invokeai/frontend/web/src/features/nodes/components/AddNodeMenu.tsx b/invokeai/frontend/web/src/features/nodes/components/AddNodeMenu.tsx index da462f4735..408bf74eed 100644 --- a/invokeai/frontend/web/src/features/nodes/components/AddNodeMenu.tsx +++ b/invokeai/frontend/web/src/features/nodes/components/AddNodeMenu.tsx @@ -3,7 +3,7 @@ import { createSelector } from '@reduxjs/toolkit'; import { useAppToaster } from 'app/components/Toaster'; import { useAppDispatch, useAppSelector } from 'app/store/storeHooks'; import { defaultSelectorOptions } from 'app/store/util/defaultMemoizeOptions'; -import IAIMantineSelect from 'common/components/IAIMantineSelect'; +import IAIMantineSearchableSelect from 'common/components/IAIMantineSearchableSelect'; import { map } from 'lodash-es'; import { forwardRef, useCallback } from 'react'; import 'reactflow/dist/style.css'; @@ -77,7 +77,7 @@ const AddNodeMenu = () => { return ( - ( return (
- {label} - + {label} + {description}
diff --git a/invokeai/frontend/web/src/features/nodes/components/IAINode/IAINodeHeader.tsx b/invokeai/frontend/web/src/features/nodes/components/IAINode/IAINodeHeader.tsx index 73705769b6..7b56bc95b4 100644 --- a/invokeai/frontend/web/src/features/nodes/components/IAINode/IAINodeHeader.tsx +++ b/invokeai/frontend/web/src/features/nodes/components/IAINode/IAINodeHeader.tsx @@ -1,4 +1,5 @@ import { Flex, Heading, Icon, Tooltip } from '@chakra-ui/react'; +import { DRAG_HANDLE_CLASSNAME } from 'features/nodes/hooks/useBuildInvocation'; import { memo } from 'react'; import { FaInfoCircle } from 'react-icons/fa'; @@ -12,14 +13,15 @@ const IAINodeHeader = (props: IAINodeHeaderProps) => { const { nodeId, title, description } = props; return ( @@ -28,7 +30,7 @@ const IAINodeHeader = (props: IAINodeHeaderProps) => { sx={{ fontWeight: 600, color: 'base.900', - _dark: { color: 'base.100' }, + _dark: { color: 'base.200' }, }} > {title} diff --git a/invokeai/frontend/web/src/features/nodes/components/IAINode/IAINodeInputs.tsx b/invokeai/frontend/web/src/features/nodes/components/IAINode/IAINodeInputs.tsx index 9ea383c09d..6f779e4295 100644 --- a/invokeai/frontend/web/src/features/nodes/components/IAINode/IAINodeInputs.tsx +++ b/invokeai/frontend/web/src/features/nodes/components/IAINode/IAINodeInputs.tsx @@ -1,25 +1,25 @@ -import { - InputFieldTemplate, - InputFieldValue, - InvocationTemplate, -} from 'features/nodes/types/types'; -import { memo, ReactNode, useCallback } from 'react'; -import { map } from 'lodash-es'; -import { useAppSelector } from 'app/store/storeHooks'; -import { RootState } from 'app/store/store'; import { Box, + Divider, Flex, FormControl, FormLabel, HStack, Tooltip, - Divider, } from '@chakra-ui/react'; -import FieldHandle from '../FieldHandle'; +import { RootState } from 'app/store/store'; +import { useAppSelector } from 'app/store/storeHooks'; import { useIsValidConnection } from 'features/nodes/hooks/useIsValidConnection'; -import InputFieldComponent from '../InputFieldComponent'; import { HANDLE_TOOLTIP_OPEN_DELAY } from 'features/nodes/types/constants'; +import { + InputFieldTemplate, + InputFieldValue, + InvocationTemplate, +} from 'features/nodes/types/types'; +import { map } from 'lodash-es'; +import { ReactNode, memo, useCallback } from 'react'; +import FieldHandle from '../FieldHandle'; +import InputFieldComponent from '../InputFieldComponent'; interface IAINodeInputProps { nodeId: string; @@ -35,6 +35,7 @@ function IAINodeInput(props: IAINodeInputProps) { return ( { }); return ( - + {IAINodeInputsToRender} ); diff --git a/invokeai/frontend/web/src/features/nodes/components/InputFieldComponent.tsx b/invokeai/frontend/web/src/features/nodes/components/InputFieldComponent.tsx index 9925a48381..23effc5375 100644 --- a/invokeai/frontend/web/src/features/nodes/components/InputFieldComponent.tsx +++ b/invokeai/frontend/web/src/features/nodes/components/InputFieldComponent.tsx @@ -7,6 +7,7 @@ import ClipInputFieldComponent from './fields/ClipInputFieldComponent'; import ColorInputFieldComponent from './fields/ColorInputFieldComponent'; import ConditioningInputFieldComponent from './fields/ConditioningInputFieldComponent'; import ControlInputFieldComponent from './fields/ControlInputFieldComponent'; +import ControlNetModelInputFieldComponent from './fields/ControlNetModelInputFieldComponent'; import EnumInputFieldComponent from './fields/EnumInputFieldComponent'; import ImageCollectionInputFieldComponent from './fields/ImageCollectionInputFieldComponent'; import ImageInputFieldComponent from './fields/ImageInputFieldComponent'; @@ -16,7 +17,7 @@ import LoRAModelInputFieldComponent from './fields/LoRAModelInputFieldComponent' import ModelInputFieldComponent from './fields/ModelInputFieldComponent'; import NumberInputFieldComponent from './fields/NumberInputFieldComponent'; import StringInputFieldComponent from './fields/StringInputFieldComponent'; -import UNetInputFieldComponent from './fields/UNetInputFieldComponent'; +import UnetInputFieldComponent from './fields/UnetInputFieldComponent'; import VaeInputFieldComponent from './fields/VaeInputFieldComponent'; import VaeModelInputFieldComponent from './fields/VaeModelInputFieldComponent'; @@ -106,7 +107,7 @@ const InputFieldComponent = (props: InputFieldComponentProps) => { if (type === 'unet' && template.type === 'unet') { return ( - { ); } + if (type === 'controlnet_model' && template.type === 'controlnet_model') { + return ( + + ); + } + if (type === 'array' && template.type === 'array') { return ( ) => { if (!template) { return ( - + ) => { description={template.description} /> diff --git a/invokeai/frontend/web/src/features/nodes/components/NodeEditor.tsx b/invokeai/frontend/web/src/features/nodes/components/NodeEditor.tsx index 2be98b1cb9..8c0480774c 100644 --- a/invokeai/frontend/web/src/features/nodes/components/NodeEditor.tsx +++ b/invokeai/frontend/web/src/features/nodes/components/NodeEditor.tsx @@ -1,9 +1,9 @@ -import 'reactflow/dist/style.css'; import { Box } from '@chakra-ui/react'; import { ReactFlowProvider } from 'reactflow'; +import 'reactflow/dist/style.css'; -import { Flow } from './Flow'; import { memo } from 'react'; +import { Flow } from './Flow'; const NodeEditor = () => { return ( diff --git a/invokeai/frontend/web/src/features/nodes/components/NodeWrapper.tsx b/invokeai/frontend/web/src/features/nodes/components/NodeWrapper.tsx index 7a76cd5902..882c6efd69 100644 --- a/invokeai/frontend/web/src/features/nodes/components/NodeWrapper.tsx +++ b/invokeai/frontend/web/src/features/nodes/components/NodeWrapper.tsx @@ -1,7 +1,9 @@ import { Box, useToken } from '@chakra-ui/react'; import { NODE_MIN_WIDTH } from 'app/constants'; +import { useAppSelector } from 'app/store/storeHooks'; import { PropsWithChildren } from 'react'; +import { DRAG_HANDLE_CLASSNAME } from '../hooks/useBuildInvocation'; type NodeWrapperProps = PropsWithChildren & { selected: boolean; @@ -13,8 +15,11 @@ const NodeWrapper = (props: NodeWrapperProps) => { 'dark-lg', ]); + const shift = useAppSelector((state) => state.hotkeys.shift); + return ( ) => { /> { + const { t } = useTranslation(); const { zoomIn, zoomOut, fitView } = useReactFlow(); const dispatch = useAppDispatch(); const shouldShowGraphOverlay = useAppSelector( (state) => state.nodes.shouldShowGraphOverlay ); + const shouldShowFieldTypeLegend = useAppSelector( + (state) => state.nodes.shouldShowFieldTypeLegend + ); + const shouldShowMinimapPanel = useAppSelector( + (state) => state.nodes.shouldShowMinimapPanel + ); const handleClickedZoomIn = useCallback(() => { zoomIn(); @@ -29,29 +48,64 @@ const ViewportControls = () => { dispatch(shouldShowGraphOverlayChanged(!shouldShowGraphOverlay)); }, [shouldShowGraphOverlay, dispatch]); + const handleClickedToggleFieldTypeLegend = useCallback(() => { + dispatch(shouldShowFieldTypeLegendChanged(!shouldShowFieldTypeLegend)); + }, [shouldShowFieldTypeLegend, dispatch]); + + const handleClickedToggleMiniMapPanel = useCallback(() => { + dispatch(shouldShowMinimapPanelChanged(!shouldShowMinimapPanel)); + }, [shouldShowMinimapPanel, dispatch]); + return ( - } - /> - } - /> - } - /> - } - /> + + } /> + + + } /> + + + } /> + + + } + /> + + + } + /> + + + } + /> + ); }; diff --git a/invokeai/frontend/web/src/features/nodes/components/fields/ControlNetModelInputFieldComponent.tsx b/invokeai/frontend/web/src/features/nodes/components/fields/ControlNetModelInputFieldComponent.tsx new file mode 100644 index 0000000000..b5d9fef312 --- /dev/null +++ b/invokeai/frontend/web/src/features/nodes/components/fields/ControlNetModelInputFieldComponent.tsx @@ -0,0 +1,103 @@ +import { SelectItem } from '@mantine/core'; +import { useAppDispatch } from 'app/store/storeHooks'; +import IAIMantineSelect from 'common/components/IAIMantineSelect'; +import { fieldValueChanged } from 'features/nodes/store/nodesSlice'; +import { + ControlNetModelInputFieldTemplate, + ControlNetModelInputFieldValue, +} from 'features/nodes/types/types'; +import { MODEL_TYPE_MAP } from 'features/parameters/types/constants'; +import { modelIdToControlNetModelParam } from 'features/parameters/util/modelIdToControlNetModelParam'; +import { forEach } from 'lodash-es'; +import { memo, useCallback, useMemo } from 'react'; +import { useTranslation } from 'react-i18next'; +import { useGetControlNetModelsQuery } from 'services/api/endpoints/models'; +import { FieldComponentProps } from './types'; + +const ControlNetModelInputFieldComponent = ( + props: FieldComponentProps< + ControlNetModelInputFieldValue, + ControlNetModelInputFieldTemplate + > +) => { + const { nodeId, field } = props; + const controlNetModel = field.value; + const dispatch = useAppDispatch(); + const { t } = useTranslation(); + + const { data: controlNetModels } = useGetControlNetModelsQuery(); + + // grab the full model entity from the RTK Query cache + const selectedModel = useMemo( + () => + controlNetModels?.entities[ + `${controlNetModel?.base_model}/controlnet/${controlNetModel?.model_name}` + ] ?? null, + [ + controlNetModel?.base_model, + controlNetModel?.model_name, + controlNetModels?.entities, + ] + ); + + const data = useMemo(() => { + if (!controlNetModels) { + return []; + } + + const data: SelectItem[] = []; + + forEach(controlNetModels.entities, (model, id) => { + if (!model) { + return; + } + + data.push({ + value: id, + label: model.model_name, + group: MODEL_TYPE_MAP[model.base_model], + }); + }); + + return data; + }, [controlNetModels]); + + const handleValueChanged = useCallback( + (v: string | null) => { + if (!v) { + return; + } + + const newControlNetModel = modelIdToControlNetModelParam(v); + + if (!newControlNetModel) { + return; + } + + dispatch( + fieldValueChanged({ + nodeId, + fieldName: field.name, + value: newControlNetModel, + }) + ); + }, + [dispatch, field.name, nodeId] + ); + + return ( + + ); +}; + +export default memo(ControlNetModelInputFieldComponent); diff --git a/invokeai/frontend/web/src/features/nodes/components/fields/LoRAModelInputFieldComponent.tsx b/invokeai/frontend/web/src/features/nodes/components/fields/LoRAModelInputFieldComponent.tsx index 271408b817..27d15fb93e 100644 --- a/invokeai/frontend/web/src/features/nodes/components/fields/LoRAModelInputFieldComponent.tsx +++ b/invokeai/frontend/web/src/features/nodes/components/fields/LoRAModelInputFieldComponent.tsx @@ -1,36 +1,31 @@ +import { Flex, Text } from '@chakra-ui/react'; import { SelectItem } from '@mantine/core'; import { useAppDispatch } from 'app/store/storeHooks'; -import IAIMantineSelect from 'common/components/IAIMantineSelect'; +import IAIMantineSearchableSelect from 'common/components/IAIMantineSearchableSelect'; +import IAIMantineSelectItemWithTooltip from 'common/components/IAIMantineSelectItemWithTooltip'; import { fieldValueChanged } from 'features/nodes/store/nodesSlice'; import { - VaeModelInputFieldTemplate, - VaeModelInputFieldValue, + LoRAModelInputFieldTemplate, + LoRAModelInputFieldValue, } from 'features/nodes/types/types'; -import { MODEL_TYPE_MAP as BASE_MODEL_NAME_MAP } from 'features/system/components/ModelSelect'; -import { forEach, isString } from 'lodash-es'; -import { memo, useCallback, useEffect, useMemo } from 'react'; -import { useTranslation } from 'react-i18next'; +import { MODEL_TYPE_MAP } from 'features/parameters/types/constants'; +import { modelIdToLoRAModelParam } from 'features/parameters/util/modelIdToLoRAModelParam'; +import { forEach } from 'lodash-es'; +import { memo, useCallback, useMemo } from 'react'; import { useGetLoRAModelsQuery } from 'services/api/endpoints/models'; import { FieldComponentProps } from './types'; const LoRAModelInputFieldComponent = ( props: FieldComponentProps< - VaeModelInputFieldValue, - VaeModelInputFieldTemplate + LoRAModelInputFieldValue, + LoRAModelInputFieldTemplate > ) => { const { nodeId, field } = props; - + const lora = field.value; const dispatch = useAppDispatch(); - const { t } = useTranslation(); - const { data: loraModels } = useGetLoRAModelsQuery(); - const selectedModel = useMemo( - () => loraModels?.entities[field.value ?? loraModels.ids[0]], - [loraModels?.entities, loraModels?.ids, field.value] - ); - const data = useMemo(() => { if (!loraModels) { return []; @@ -38,63 +33,78 @@ const LoRAModelInputFieldComponent = ( const data: SelectItem[] = []; - forEach(loraModels.entities, (model, id) => { - if (!model) { + forEach(loraModels.entities, (lora, id) => { + if (!lora) { return; } data.push({ value: id, - label: model.model_name, - group: BASE_MODEL_NAME_MAP[model.base_model], + label: lora.model_name, + group: MODEL_TYPE_MAP[lora.base_model], }); }); - return data; + return data.sort((a, b) => (a.disabled && !b.disabled ? 1 : -1)); }, [loraModels]); - const handleValueChanged = useCallback( + const selectedLoRAModel = useMemo( + () => + loraModels?.entities[`${lora?.base_model}/lora/${lora?.model_name}`] ?? + null, + [loraModels?.entities, lora?.base_model, lora?.model_name] + ); + + const handleChange = useCallback( (v: string | null) => { if (!v) { return; } + const newLoRAModel = modelIdToLoRAModelParam(v); + + if (!newLoRAModel) { + return; + } + dispatch( fieldValueChanged({ nodeId, fieldName: field.name, - value: v, + value: newLoRAModel, }) ); }, [dispatch, field.name, nodeId] ); - useEffect(() => { - if (field.value && loraModels?.ids.includes(field.value)) { - return; - } - - const firstLora = loraModels?.ids[0]; - - if (!isString(firstLora)) { - return; - } - - handleValueChanged(firstLora); - }, [field.value, handleValueChanged, loraModels?.ids]); + if (loraModels?.ids.length === 0) { + return ( + + + No LoRAs Loaded + + + ); + } return ( - 0 ? 'Select a LoRA' : 'No LoRAs available'} data={data} - onChange={handleValueChanged} + nothingFound="No matching LoRAs" + itemComponent={IAIMantineSelectItemWithTooltip} + disabled={data.length === 0} + filter={(value, item: SelectItem) => + item.label?.toLowerCase().includes(value.toLowerCase().trim()) || + item.value.toLowerCase().includes(value.toLowerCase().trim()) + } + onChange={handleChange} /> ); }; diff --git a/invokeai/frontend/web/src/features/nodes/components/fields/ModelInputFieldComponent.tsx b/invokeai/frontend/web/src/features/nodes/components/fields/ModelInputFieldComponent.tsx index 707eb54888..ea02052e76 100644 --- a/invokeai/frontend/web/src/features/nodes/components/fields/ModelInputFieldComponent.tsx +++ b/invokeai/frontend/web/src/features/nodes/components/fields/ModelInputFieldComponent.tsx @@ -1,15 +1,16 @@ -import { SelectItem } from '@mantine/core'; import { useAppDispatch } from 'app/store/storeHooks'; import { fieldValueChanged } from 'features/nodes/store/nodesSlice'; import { + MainModelInputFieldValue, ModelInputFieldTemplate, - ModelInputFieldValue, } from 'features/nodes/types/types'; -import IAIMantineSelect from 'common/components/IAIMantineSelect'; -import { MODEL_TYPE_MAP as BASE_MODEL_NAME_MAP } from 'features/system/components/ModelSelect'; -import { forEach, isString } from 'lodash-es'; -import { memo, useCallback, useEffect, useMemo } from 'react'; +import { SelectItem } from '@mantine/core'; +import IAIMantineSearchableSelect from 'common/components/IAIMantineSearchableSelect'; +import { MODEL_TYPE_MAP } from 'features/parameters/types/constants'; +import { modelIdToMainModelParam } from 'features/parameters/util/modelIdToMainModelParam'; +import { forEach } from 'lodash-es'; +import { memo, useCallback, useMemo } from 'react'; import { useTranslation } from 'react-i18next'; import { useGetMainModelsQuery, @@ -18,15 +19,15 @@ import { import { FieldComponentProps } from './types'; const ModelInputFieldComponent = ( - props: FieldComponentProps + props: FieldComponentProps ) => { const { nodeId, field } = props; const dispatch = useAppDispatch(); const { t } = useTranslation(); - const { data: mainModels } = useGetMainModelsQuery(); const { data: onnxModels } = useGetOnnxModelsQuery(); + const { data: mainModels, isLoading } = useGetMainModelsQuery(); const data = useMemo(() => { if (!mainModels) { @@ -43,7 +44,7 @@ const ModelInputFieldComponent = ( data.push({ value: id, label: model.model_name, - group: BASE_MODEL_NAME_MAP[model.base_model], + group: MODEL_TYPE_MAP[model.base_model], }); }); @@ -63,65 +64,67 @@ const ModelInputFieldComponent = ( return data; }, [mainModels, onnxModels]); + // grab the full model entity from the RTK Query cache + // TODO: maybe we should just store the full model entity in state? const selectedModel = useMemo( () => - mainModels?.entities[field.value ?? mainModels.ids[0]] || - onnxModels?.entities[field.value ?? onnxModels.ids[0]], + (mainModels?.entities[ + `${field.value?.base_model}/main/${field.value?.model_name}` + ] || + onnxModels?.entities[ + `${field.value?.base_model}/onnx/${field.value?.model_name}` + ]) ?? + null, [ + field.value?.base_model, + field.value?.model_name, mainModels?.entities, - mainModels?.ids, onnxModels?.entities, - onnxModels?.ids, - field.value, ] ); - const handleValueChanged = useCallback( + const handleChangeModel = useCallback( (v: string | null) => { if (!v) { return; } + const newModel = modelIdToMainModelParam(v); + + if (!newModel) { + return; + } + dispatch( fieldValueChanged({ nodeId, fieldName: field.name, - value: v, + value: newModel, }) ); }, [dispatch, field.name, nodeId] ); - useEffect(() => { - if ( - field.value && - (mainModels?.ids.includes(field.value) || - onnxModels?.ids.includes(field.value)) - ) { - return; - } - - const firstModel = mainModels?.ids[0] || onnxModels?.ids[0]; - - if (!isString(firstModel)) { - return; - } - - handleValueChanged(firstModel); - }, [field.value, handleValueChanged, mainModels?.ids, onnxModels?.ids]); - - return ( - + ) : ( + 0 ? 'Select a model' : 'No models available'} data={data} - onChange={handleValueChanged} + error={data.length === 0} + disabled={data.length === 0} + onChange={handleChangeModel} /> ); }; diff --git a/invokeai/frontend/web/src/features/nodes/components/fields/NumberInputFieldComponent.tsx b/invokeai/frontend/web/src/features/nodes/components/fields/NumberInputFieldComponent.tsx index f5df8989f5..50d69a6496 100644 --- a/invokeai/frontend/web/src/features/nodes/components/fields/NumberInputFieldComponent.tsx +++ b/invokeai/frontend/web/src/features/nodes/components/fields/NumberInputFieldComponent.tsx @@ -6,6 +6,7 @@ import { NumberInputStepper, } from '@chakra-ui/react'; import { useAppDispatch } from 'app/store/storeHooks'; +import { numberStringRegex } from 'common/components/IAINumberInput'; import { fieldValueChanged } from 'features/nodes/store/nodesSlice'; import { FloatInputFieldTemplate, @@ -13,7 +14,7 @@ import { IntegerInputFieldTemplate, IntegerInputFieldValue, } from 'features/nodes/types/types'; -import { memo } from 'react'; +import { memo, useEffect, useState } from 'react'; import { FieldComponentProps } from './types'; const NumberInputFieldComponent = ( @@ -23,17 +24,42 @@ const NumberInputFieldComponent = ( > ) => { const { nodeId, field } = props; - const dispatch = useAppDispatch(); + const [valueAsString, setValueAsString] = useState( + String(field.value) + ); - const handleValueChanged = (_: string, value: number) => { - dispatch(fieldValueChanged({ nodeId, fieldName: field.name, value })); + const handleValueChanged = (v: string) => { + setValueAsString(v); + // This allows negatives and decimals e.g. '-123', `.5`, `-0.2`, etc. + if (!v.match(numberStringRegex)) { + // Cast the value to number. Floor it if it should be an integer. + dispatch( + fieldValueChanged({ + nodeId, + fieldName: field.name, + value: + props.template.type === 'integer' + ? Math.floor(Number(v)) + : Number(v), + }) + ); + } }; + useEffect(() => { + if ( + !valueAsString.match(numberStringRegex) && + field.value !== Number(valueAsString) + ) { + setValueAsString(String(field.value)); + } + }, [field.value, valueAsString]); + return ( diff --git a/invokeai/frontend/web/src/features/nodes/components/fields/UNetInputFieldComponent.tsx b/invokeai/frontend/web/src/features/nodes/components/fields/UnetInputFieldComponent.tsx similarity index 99% rename from invokeai/frontend/web/src/features/nodes/components/fields/UNetInputFieldComponent.tsx rename to invokeai/frontend/web/src/features/nodes/components/fields/UnetInputFieldComponent.tsx index 5926bf113a..2b5438e802 100644 --- a/invokeai/frontend/web/src/features/nodes/components/fields/UNetInputFieldComponent.tsx +++ b/invokeai/frontend/web/src/features/nodes/components/fields/UnetInputFieldComponent.tsx @@ -9,7 +9,6 @@ const UNetInputFieldComponent = ( props: FieldComponentProps ) => { const { nodeId, field } = props; - return null; }; diff --git a/invokeai/frontend/web/src/features/nodes/components/fields/VaeInputFieldComponent.tsx b/invokeai/frontend/web/src/features/nodes/components/fields/VaeInputFieldComponent.tsx index 0fa11ae34e..b76e43830e 100644 --- a/invokeai/frontend/web/src/features/nodes/components/fields/VaeInputFieldComponent.tsx +++ b/invokeai/frontend/web/src/features/nodes/components/fields/VaeInputFieldComponent.tsx @@ -9,7 +9,6 @@ const VaeInputFieldComponent = ( props: FieldComponentProps ) => { const { nodeId, field } = props; - return null; }; diff --git a/invokeai/frontend/web/src/features/nodes/components/fields/VaeModelInputFieldComponent.tsx b/invokeai/frontend/web/src/features/nodes/components/fields/VaeModelInputFieldComponent.tsx index 0aefec0511..e30532a92f 100644 --- a/invokeai/frontend/web/src/features/nodes/components/fields/VaeModelInputFieldComponent.tsx +++ b/invokeai/frontend/web/src/features/nodes/components/fields/VaeModelInputFieldComponent.tsx @@ -1,14 +1,16 @@ import { SelectItem } from '@mantine/core'; import { useAppDispatch } from 'app/store/storeHooks'; -import IAIMantineSelect from 'common/components/IAIMantineSelect'; +import IAIMantineSearchableSelect from 'common/components/IAIMantineSearchableSelect'; +import IAIMantineSelectItemWithTooltip from 'common/components/IAIMantineSelectItemWithTooltip'; import { fieldValueChanged } from 'features/nodes/store/nodesSlice'; import { VaeModelInputFieldTemplate, VaeModelInputFieldValue, } from 'features/nodes/types/types'; -import { MODEL_TYPE_MAP as BASE_MODEL_NAME_MAP } from 'features/system/components/ModelSelect'; +import { MODEL_TYPE_MAP } from 'features/parameters/types/constants'; +import { modelIdToVAEModelParam } from 'features/parameters/util/modelIdToVAEModelParam'; import { forEach } from 'lodash-es'; -import { memo, useCallback, useEffect, useMemo } from 'react'; +import { memo, useCallback, useMemo } from 'react'; import { useTranslation } from 'react-i18next'; import { useGetVaeModelsQuery } from 'services/api/endpoints/models'; import { FieldComponentProps } from './types'; @@ -20,74 +22,83 @@ const VaeModelInputFieldComponent = ( > ) => { const { nodeId, field } = props; - + const vae = field.value; const dispatch = useAppDispatch(); const { t } = useTranslation(); - const { data: vaeModels } = useGetVaeModelsQuery(); - const selectedModel = useMemo( - () => vaeModels?.entities[field.value ?? vaeModels.ids[0]], - [vaeModels?.entities, vaeModels?.ids, field.value] - ); - const data = useMemo(() => { if (!vaeModels) { return []; } - const data: SelectItem[] = []; + const data: SelectItem[] = [ + { + value: 'default', + label: 'Default', + group: 'Default', + }, + ]; - forEach(vaeModels.entities, (model, id) => { - if (!model) { + forEach(vaeModels.entities, (vae, id) => { + if (!vae) { return; } data.push({ value: id, - label: model.model_name, - group: BASE_MODEL_NAME_MAP[model.base_model], + label: vae.model_name, + group: MODEL_TYPE_MAP[vae.base_model], }); }); - return data; + return data.sort((a, b) => (a.disabled && !b.disabled ? 1 : -1)); }, [vaeModels]); - const handleValueChanged = useCallback( + // grab the full model entity from the RTK Query cache + const selectedVaeModel = useMemo( + () => + vaeModels?.entities[`${vae?.base_model}/vae/${vae?.model_name}`] ?? null, + [vaeModels?.entities, vae] + ); + + const handleChangeModel = useCallback( (v: string | null) => { if (!v) { return; } + const newVaeModel = modelIdToVAEModelParam(v); + + if (!newVaeModel) { + return; + } + dispatch( fieldValueChanged({ nodeId, fieldName: field.name, - value: v, + value: newVaeModel, }) ); }, [dispatch, field.name, nodeId] ); - useEffect(() => { - if (field.value && vaeModels?.ids.includes(field.value)) { - return; - } - handleValueChanged('auto'); - }, [field.value, handleValueChanged, vaeModels?.ids]); - return ( - ); }; diff --git a/invokeai/frontend/web/src/features/nodes/components/panels/MinimapPanel.tsx b/invokeai/frontend/web/src/features/nodes/components/panels/MinimapPanel.tsx index 1ad4cc78ce..39142ed48e 100644 --- a/invokeai/frontend/web/src/features/nodes/components/panels/MinimapPanel.tsx +++ b/invokeai/frontend/web/src/features/nodes/components/panels/MinimapPanel.tsx @@ -1,3 +1,5 @@ +import { RootState } from 'app/store/store'; +import { useAppSelector } from 'app/store/storeHooks'; import { useColorModeValue } from '@chakra-ui/react'; import { memo } from 'react'; import { MiniMap } from 'reactflow'; @@ -12,6 +14,10 @@ const MinimapPanel = () => { } ); + const shouldShowMinimapPanel = useAppSelector( + (state: RootState) => state.nodes.shouldShowMinimapPanel + ); + const nodeColor = useColorModeValue( 'var(--invokeai-colors-accent-300)', 'var(--invokeai-colors-accent-700)' @@ -23,15 +29,19 @@ const MinimapPanel = () => { ); return ( - + <> + {shouldShowMinimapPanel && ( + + )} + ); }; diff --git a/invokeai/frontend/web/src/features/nodes/components/panels/TopRightPanel.tsx b/invokeai/frontend/web/src/features/nodes/components/panels/TopRightPanel.tsx index 3fe8c49880..e3e3a871c8 100644 --- a/invokeai/frontend/web/src/features/nodes/components/panels/TopRightPanel.tsx +++ b/invokeai/frontend/web/src/features/nodes/components/panels/TopRightPanel.tsx @@ -9,10 +9,13 @@ const TopRightPanel = () => { const shouldShowGraphOverlay = useAppSelector( (state: RootState) => state.nodes.shouldShowGraphOverlay ); + const shouldShowFieldTypeLegend = useAppSelector( + (state: RootState) => state.nodes.shouldShowFieldTypeLegend + ); return ( - + {shouldShowFieldTypeLegend && } {shouldShowGraphOverlay && } ); diff --git a/invokeai/frontend/web/src/features/nodes/hooks/useBuildInvocation.ts b/invokeai/frontend/web/src/features/nodes/hooks/useBuildInvocation.ts index 5ed631e9fa..50a19d6b45 100644 --- a/invokeai/frontend/web/src/features/nodes/hooks/useBuildInvocation.ts +++ b/invokeai/frontend/web/src/features/nodes/hooks/useBuildInvocation.ts @@ -18,6 +18,12 @@ const templatesSelector = createSelector( (nodes) => nodes.invocationTemplates ); +export const DRAG_HANDLE_CLASSNAME = 'node-drag-handle'; + +export const SHARED_NODE_PROPERTIES: Partial = { + dragHandle: `.${DRAG_HANDLE_CLASSNAME}`, +}; + export const useBuildInvocation = () => { const invocationTemplates = useAppSelector(templatesSelector); @@ -32,6 +38,7 @@ export const useBuildInvocation = () => { }); const node: Node = { + ...SHARED_NODE_PROPERTIES, id: 'progress_image', type: 'progress_image', position: { x: x, y: y }, @@ -91,6 +98,7 @@ export const useBuildInvocation = () => { }); const invocation: Node = { + ...SHARED_NODE_PROPERTIES, id: nodeId, type: 'invocation', position: { x: x, y: y }, diff --git a/invokeai/frontend/web/src/features/nodes/store/nodesSlice.ts b/invokeai/frontend/web/src/features/nodes/store/nodesSlice.ts index 91b6f685e6..833a220336 100644 --- a/invokeai/frontend/web/src/features/nodes/store/nodesSlice.ts +++ b/invokeai/frontend/web/src/features/nodes/store/nodesSlice.ts @@ -1,5 +1,11 @@ import { createSlice, PayloadAction } from '@reduxjs/toolkit'; import { RootState } from 'app/store/store'; +import { + ControlNetModelParam, + LoRAModelParam, + MainModelParam, + VaeModelParam, +} from 'features/parameters/types/parameterSchemas'; import { cloneDeep, uniqBy } from 'lodash-es'; import { OpenAPIV3 } from 'openapi-types'; import { RgbaColor } from 'react-colorful'; @@ -26,6 +32,8 @@ export type NodesState = { invocationTemplates: Record; connectionStartParams: OnConnectStartParams | null; shouldShowGraphOverlay: boolean; + shouldShowFieldTypeLegend: boolean; + shouldShowMinimapPanel: boolean; editorInstance: ReactFlowInstance | undefined; }; @@ -36,6 +44,8 @@ export const initialNodesState: NodesState = { invocationTemplates: {}, connectionStartParams: null, shouldShowGraphOverlay: false, + shouldShowFieldTypeLegend: false, + shouldShowMinimapPanel: true, editorInstance: undefined, }; @@ -73,7 +83,11 @@ const nodesSlice = createSlice({ | ImageField | RgbaColor | undefined - | ImageField[]; + | ImageField[] + | MainModelParam + | VaeModelParam + | LoRAModelParam + | ControlNetModelParam; }> ) => { const { nodeId, fieldName, value } = action.payload; @@ -115,6 +129,15 @@ const nodesSlice = createSlice({ shouldShowGraphOverlayChanged: (state, action: PayloadAction) => { state.shouldShowGraphOverlay = action.payload; }, + shouldShowFieldTypeLegendChanged: ( + state, + action: PayloadAction + ) => { + state.shouldShowFieldTypeLegend = action.payload; + }, + shouldShowMinimapPanelChanged: (state, action: PayloadAction) => { + state.shouldShowMinimapPanel = action.payload; + }, nodeTemplatesBuilt: ( state, action: PayloadAction> @@ -151,6 +174,8 @@ export const { connectionStarted, connectionEnded, shouldShowGraphOverlayChanged, + shouldShowFieldTypeLegendChanged, + shouldShowMinimapPanelChanged, nodeTemplatesBuilt, nodeEditorReset, imageCollectionFieldValueChanged, diff --git a/invokeai/frontend/web/src/features/nodes/types/constants.ts b/invokeai/frontend/web/src/features/nodes/types/constants.ts index 5fe780a286..3a70e52ee5 100644 --- a/invokeai/frontend/web/src/features/nodes/types/constants.ts +++ b/invokeai/frontend/web/src/features/nodes/types/constants.ts @@ -19,6 +19,8 @@ export const FIELD_TYPE_MAP: Record = { model: 'model', vae_model: 'vae_model', lora_model: 'lora_model', + controlnet_model: 'controlnet_model', + ControlNetModelField: 'controlnet_model', array: 'array', item: 'item', ColorField: 'color', @@ -130,6 +132,12 @@ export const FIELDS: Record = { title: 'LoRA', description: 'Models are models.', }, + controlnet_model: { + color: 'teal', + colorCssVar: getColorTokenCssVariable('teal'), + title: 'ControlNet', + description: 'Models are models.', + }, array: { color: 'gray', colorCssVar: getColorTokenCssVariable('gray'), diff --git a/invokeai/frontend/web/src/features/nodes/types/types.ts b/invokeai/frontend/web/src/features/nodes/types/types.ts index 3de8cae9ff..f111155a39 100644 --- a/invokeai/frontend/web/src/features/nodes/types/types.ts +++ b/invokeai/frontend/web/src/features/nodes/types/types.ts @@ -1,3 +1,9 @@ +import { + ControlNetModelParam, + LoRAModelParam, + MainModelParam, + VaeModelParam, +} from 'features/parameters/types/parameterSchemas'; import { OpenAPIV3 } from 'openapi-types'; import { RgbaColor } from 'react-colorful'; import { Graph, ImageDTO, ImageField } from 'services/api/types'; @@ -66,6 +72,7 @@ export type FieldType = | 'model' | 'vae_model' | 'lora_model' + | 'controlnet_model' | 'array' | 'item' | 'color' @@ -92,9 +99,10 @@ export type InputFieldValue = | VaeInputFieldValue | ControlInputFieldValue | EnumInputFieldValue - | ModelInputFieldValue + | MainModelInputFieldValue | VaeModelInputFieldValue | LoRAModelInputFieldValue + | ControlNetModelInputFieldValue | ArrayInputFieldValue | ItemInputFieldValue | ColorInputFieldValue @@ -122,6 +130,7 @@ export type InputFieldTemplate = | ModelInputFieldTemplate | VaeModelInputFieldTemplate | LoRAModelInputFieldTemplate + | ControlNetModelInputFieldTemplate | ArrayInputFieldTemplate | ItemInputFieldTemplate | ColorInputFieldTemplate @@ -229,19 +238,24 @@ export type ImageCollectionInputFieldValue = FieldValueBase & { value?: ImageField[]; }; -export type ModelInputFieldValue = FieldValueBase & { +export type MainModelInputFieldValue = FieldValueBase & { type: 'model'; - value?: string; + value?: MainModelParam; }; export type VaeModelInputFieldValue = FieldValueBase & { type: 'vae_model'; - value?: string; + value?: VaeModelParam; }; export type LoRAModelInputFieldValue = FieldValueBase & { type: 'lora_model'; - value?: string; + value?: LoRAModelParam; +}; + +export type ControlNetModelInputFieldValue = FieldValueBase & { + type: 'controlnet_model'; + value?: ControlNetModelParam; }; export type ArrayInputFieldValue = FieldValueBase & { @@ -363,6 +377,11 @@ export type LoRAModelInputFieldTemplate = InputFieldTemplateBase & { type: 'lora_model'; }; +export type ControlNetModelInputFieldTemplate = InputFieldTemplateBase & { + default: string; + type: 'controlnet_model'; +}; + export type ArrayInputFieldTemplate = InputFieldTemplateBase & { default: []; type: 'array'; diff --git a/invokeai/frontend/web/src/features/nodes/util/fieldTemplateBuilders.ts b/invokeai/frontend/web/src/features/nodes/util/fieldTemplateBuilders.ts index 1c2dbc0c3e..eaa7fe66fc 100644 --- a/invokeai/frontend/web/src/features/nodes/util/fieldTemplateBuilders.ts +++ b/invokeai/frontend/web/src/features/nodes/util/fieldTemplateBuilders.ts @@ -9,6 +9,7 @@ import { ColorInputFieldTemplate, ConditioningInputFieldTemplate, ControlInputFieldTemplate, + ControlNetModelInputFieldTemplate, EnumInputFieldTemplate, FieldType, FloatInputFieldTemplate, @@ -207,6 +208,21 @@ const buildLoRAModelInputFieldTemplate = ({ return template; }; +const buildControlNetModelInputFieldTemplate = ({ + schemaObject, + baseField, +}: BuildInputFieldArg): ControlNetModelInputFieldTemplate => { + const template: ControlNetModelInputFieldTemplate = { + ...baseField, + type: 'controlnet_model', + inputRequirement: 'always', + inputKind: 'direct', + default: schemaObject.default ?? undefined, + }; + + return template; +}; + const buildImageInputFieldTemplate = ({ schemaObject, baseField, @@ -479,6 +495,9 @@ export const buildInputFieldTemplate = ( if (['lora_model'].includes(fieldType)) { return buildLoRAModelInputFieldTemplate({ schemaObject, baseField }); } + if (['controlnet_model'].includes(fieldType)) { + return buildControlNetModelInputFieldTemplate({ schemaObject, baseField }); + } if (['enum'].includes(fieldType)) { return buildEnumInputFieldTemplate({ schemaObject, baseField }); } diff --git a/invokeai/frontend/web/src/features/nodes/util/fieldValueBuilders.ts b/invokeai/frontend/web/src/features/nodes/util/fieldValueBuilders.ts index 950038b691..f54a7640bd 100644 --- a/invokeai/frontend/web/src/features/nodes/util/fieldValueBuilders.ts +++ b/invokeai/frontend/web/src/features/nodes/util/fieldValueBuilders.ts @@ -83,6 +83,10 @@ export const buildInputFieldValue = ( if (template.type === 'lora_model') { fieldValue.value = undefined; } + + if (template.type === 'controlnet_model') { + fieldValue.value = undefined; + } } return fieldValue; diff --git a/invokeai/frontend/web/src/features/nodes/util/graphBuilders/addDynamicPromptsToGraph.ts b/invokeai/frontend/web/src/features/nodes/util/graphBuilders/addDynamicPromptsToGraph.ts index d4289433eb..90011ff4c2 100644 --- a/invokeai/frontend/web/src/features/nodes/util/graphBuilders/addDynamicPromptsToGraph.ts +++ b/invokeai/frontend/web/src/features/nodes/util/graphBuilders/addDynamicPromptsToGraph.ts @@ -81,16 +81,18 @@ export const addDynamicPromptsToGraph = ( ); // hook up positive prompt to metadata - graph.edges.push({ - source: { - node_id: ITERATE, - field: 'item', - }, - destination: { - node_id: METADATA_ACCUMULATOR, - field: 'positive_prompt', - }, - }); + if (metadataAccumulator) { + graph.edges.push({ + source: { + node_id: ITERATE, + field: 'item', + }, + destination: { + node_id: METADATA_ACCUMULATOR, + field: 'positive_prompt', + }, + }); + } if (shouldRandomizeSeed) { // Random int node to generate the starting seed @@ -107,10 +109,12 @@ export const addDynamicPromptsToGraph = ( destination: { node_id: NOISE, field: 'seed' }, }); - graph.edges.push({ - source: { node_id: RANDOM_INT, field: 'a' }, - destination: { node_id: METADATA_ACCUMULATOR, field: 'seed' }, - }); + if (metadataAccumulator) { + graph.edges.push({ + source: { node_id: RANDOM_INT, field: 'a' }, + destination: { node_id: METADATA_ACCUMULATOR, field: 'seed' }, + }); + } } else { // User specified seed, so set the start of the range of size to the seed (graph.nodes[NOISE] as NoiseInvocation).seed = seed; @@ -164,17 +168,18 @@ export const addDynamicPromptsToGraph = ( }); // hook up seed to metadata - graph.edges.push({ - source: { - node_id: ITERATE, - field: 'item', - }, - destination: { - node_id: METADATA_ACCUMULATOR, - field: 'seed', - }, - }); - + if (metadataAccumulator) { + graph.edges.push({ + source: { + node_id: ITERATE, + field: 'item', + }, + destination: { + node_id: METADATA_ACCUMULATOR, + field: 'seed', + }, + }); + } // handle seed if (shouldRandomizeSeed) { // Random int node to generate the starting seed diff --git a/invokeai/frontend/web/src/features/nodes/util/graphBuilders/addLoRAsToGraph.ts b/invokeai/frontend/web/src/features/nodes/util/graphBuilders/addLoRAsToGraph.ts index ac2a5793ca..80a60bd9f5 100644 --- a/invokeai/frontend/web/src/features/nodes/util/graphBuilders/addLoRAsToGraph.ts +++ b/invokeai/frontend/web/src/features/nodes/util/graphBuilders/addLoRAsToGraph.ts @@ -5,7 +5,6 @@ import { LoraLoaderInvocation, MetadataAccumulatorInvocation, } from 'services/api/types'; -import { modelIdToLoRAModelField } from '../modelIdToLoRAName'; import { CLIP_SKIP, LORA_LOADER, @@ -61,23 +60,22 @@ export const addLoRAsToGraph = ( let currentLoraIndex = 0; forEach(loras, (lora) => { - const { id, name, weight } = lora; - const loraField = modelIdToLoRAModelField(id); - const currentLoraNodeId = `${LORA_LOADER}_${loraField.model_name.replace( - '.', - '_' - )}`; + const { model_name, base_model, weight } = lora; + const currentLoraNodeId = `${LORA_LOADER}_${model_name.replace('.', '_')}`; const loraLoaderNode: LoraLoaderInvocation = { type: 'lora_loader', id: currentLoraNodeId, - lora: loraField, + lora: { model_name, base_model }, weight, }; // add the lora to the metadata accumulator if (metadataAccumulator) { - metadataAccumulator.loras.push({ lora: loraField, weight }); + metadataAccumulator.loras.push({ + lora: { model_name, base_model }, + weight, + }); } // add to graph diff --git a/invokeai/frontend/web/src/features/nodes/util/graphBuilders/addVAEToGraph.ts b/invokeai/frontend/web/src/features/nodes/util/graphBuilders/addVAEToGraph.ts index 2575c3a482..45fe79f3c4 100644 --- a/invokeai/frontend/web/src/features/nodes/util/graphBuilders/addVAEToGraph.ts +++ b/invokeai/frontend/web/src/features/nodes/util/graphBuilders/addVAEToGraph.ts @@ -1,7 +1,6 @@ import { RootState } from 'app/store/store'; import { NonNullableGraph } from 'features/nodes/types/types'; import { MetadataAccumulatorInvocation } from 'services/api/types'; -import { modelIdToVAEModelField } from '../modelIdToVAEModelField'; import { IMAGE_TO_IMAGE_GRAPH, IMAGE_TO_LATENTS, @@ -21,7 +20,6 @@ export const addVAEToGraph = ( modelLoader: string = MAIN_MODEL_LOADER ): void => { const { vae } = state.generation; - const vae_model = modelIdToVAEModelField(vae?.id || ''); const isAutoVae = !vae; const metadataAccumulator = graph.nodes[METADATA_ACCUMULATOR] as @@ -32,7 +30,7 @@ export const addVAEToGraph = ( graph.nodes[VAE_LOADER] = { type: 'vae_loader', id: VAE_LOADER, - vae_model, + vae_model: vae, }; } const isOnnxModel = modelLoader == ONNX_MODEL_LOADER; @@ -76,6 +74,6 @@ export const addVAEToGraph = ( } if (vae && metadataAccumulator) { - metadataAccumulator.vae = vae_model; + metadataAccumulator.vae = vae; } }; diff --git a/invokeai/frontend/web/src/features/nodes/util/graphBuilders/buildAdHocUpscaleGraph.ts b/invokeai/frontend/web/src/features/nodes/util/graphBuilders/buildAdHocUpscaleGraph.ts new file mode 100644 index 0000000000..10e3ba5152 --- /dev/null +++ b/invokeai/frontend/web/src/features/nodes/util/graphBuilders/buildAdHocUpscaleGraph.ts @@ -0,0 +1,32 @@ +import { NonNullableGraph } from 'features/nodes/types/types'; +import { ESRGANModelName } from 'features/parameters/store/postprocessingSlice'; +import { Graph, ESRGANInvocation } from 'services/api/types'; +import { REALESRGAN as ESRGAN } from './constants'; + +type Arg = { + image_name: string; + esrganModelName: ESRGANModelName; +}; + +export const buildAdHocUpscaleGraph = ({ + image_name, + esrganModelName, +}: Arg): Graph => { + const realesrganNode: ESRGANInvocation = { + id: ESRGAN, + type: 'esrgan', + image: { image_name }, + model_name: esrganModelName, + is_intermediate: false, + }; + + const graph: NonNullableGraph = { + id: `adhoc-esrgan-graph`, + nodes: { + [ESRGAN]: realesrganNode, + }, + edges: [], + }; + + return graph; +}; diff --git a/invokeai/frontend/web/src/features/nodes/util/graphBuilders/buildNodesGraph.ts b/invokeai/frontend/web/src/features/nodes/util/graphBuilders/buildNodesGraph.ts index ea68ac50fb..64d579ce8b 100644 --- a/invokeai/frontend/web/src/features/nodes/util/graphBuilders/buildNodesGraph.ts +++ b/invokeai/frontend/web/src/features/nodes/util/graphBuilders/buildNodesGraph.ts @@ -4,9 +4,6 @@ import { cloneDeep, omit, reduce } from 'lodash-es'; import { Graph } from 'services/api/types'; import { AnyInvocation } from 'services/events/types'; import { v4 as uuidv4 } from 'uuid'; -import { modelIdToLoRAModelField } from '../modelIdToLoRAName'; -import { modelIdToMainModelField } from '../modelIdToMainModelField'; -import { modelIdToVAEModelField } from '../modelIdToVAEModelField'; /** * We need to do special handling for some fields @@ -27,24 +24,6 @@ export const parseFieldValue = (field: InputFieldValue) => { } } - if (field.type === 'model') { - if (field.value) { - return modelIdToMainModelField(field.value); - } - } - - if (field.type === 'vae_model') { - if (field.value) { - return modelIdToVAEModelField(field.value); - } - } - - if (field.type === 'lora_model') { - if (field.value) { - return modelIdToLoRAModelField(field.value); - } - } - return field.value; }; diff --git a/invokeai/frontend/web/src/features/nodes/util/graphBuilders/constants.ts b/invokeai/frontend/web/src/features/nodes/util/graphBuilders/constants.ts index cc4fff8777..d73604dd34 100644 --- a/invokeai/frontend/web/src/features/nodes/util/graphBuilders/constants.ts +++ b/invokeai/frontend/web/src/features/nodes/util/graphBuilders/constants.ts @@ -21,6 +21,9 @@ export const DYNAMIC_PROMPT = 'dynamic_prompt'; export const IMAGE_COLLECTION = 'image_collection'; export const IMAGE_COLLECTION_ITERATE = 'image_collection_iterate'; export const METADATA_ACCUMULATOR = 'metadata_accumulator'; +export const REALESRGAN = 'esrgan'; +export const DIVIDE = 'divide'; +export const SCALE = 'scale_image'; // friendly graph ids export const TEXT_TO_IMAGE_GRAPH = 'text_to_image_graph'; diff --git a/invokeai/frontend/web/src/features/nodes/util/modelIdToLoRAName.ts b/invokeai/frontend/web/src/features/nodes/util/modelIdToLoRAName.ts deleted file mode 100644 index 052b58484b..0000000000 --- a/invokeai/frontend/web/src/features/nodes/util/modelIdToLoRAName.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { BaseModelType, LoRAModelField } from 'services/api/types'; - -export const modelIdToLoRAModelField = (loraId: string): LoRAModelField => { - const [base_model, model_type, model_name] = loraId.split('/'); - - const field: LoRAModelField = { - base_model: base_model as BaseModelType, - model_name, - }; - - return field; -}; diff --git a/invokeai/frontend/web/src/features/nodes/util/modelIdToVAEModelField.ts b/invokeai/frontend/web/src/features/nodes/util/modelIdToVAEModelField.ts deleted file mode 100644 index 0cb608a936..0000000000 --- a/invokeai/frontend/web/src/features/nodes/util/modelIdToVAEModelField.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { BaseModelType, VAEModelField } from 'services/api/types'; - -/** - * Crudely converts a model id to a main model field - * TODO: Make better - */ -export const modelIdToVAEModelField = (modelId: string): VAEModelField => { - const [base_model, model_type, model_name] = modelId.split('/'); - - const field: VAEModelField = { - base_model: base_model as BaseModelType, - model_name, - }; - - return field; -}; diff --git a/invokeai/frontend/web/src/features/parameters/components/Parameters/Advanced/ParamClipSkip.tsx b/invokeai/frontend/web/src/features/parameters/components/Parameters/Advanced/ParamClipSkip.tsx index 8965bc9f0c..a2162e6c9d 100644 --- a/invokeai/frontend/web/src/features/parameters/components/Parameters/Advanced/ParamClipSkip.tsx +++ b/invokeai/frontend/web/src/features/parameters/components/Parameters/Advanced/ParamClipSkip.tsx @@ -14,6 +14,14 @@ export const clipSkipMap = { maxClip: 24, markers: [0, 1, 2, 3, 5, 10, 15, 20, 24], }, + sdxl: { + maxClip: 24, + markers: [0, 1, 2, 3, 5, 10, 15, 20, 24], + }, + 'sdxl-refiner': { + maxClip: 24, + markers: [0, 1, 2, 3, 5, 10, 15, 20, 24], + }, }; export default function ParamClipSkip() { diff --git a/invokeai/frontend/web/src/features/parameters/components/Parameters/Canvas/InfillAndScaling/ParamScaleBeforeProcessing.tsx b/invokeai/frontend/web/src/features/parameters/components/Parameters/Canvas/InfillAndScaling/ParamScaleBeforeProcessing.tsx index 827fe77e0d..e00d56b639 100644 --- a/invokeai/frontend/web/src/features/parameters/components/Parameters/Canvas/InfillAndScaling/ParamScaleBeforeProcessing.tsx +++ b/invokeai/frontend/web/src/features/parameters/components/Parameters/Canvas/InfillAndScaling/ParamScaleBeforeProcessing.tsx @@ -1,7 +1,7 @@ import { createSelector } from '@reduxjs/toolkit'; import { useAppDispatch, useAppSelector } from 'app/store/storeHooks'; import { defaultSelectorOptions } from 'app/store/util/defaultMemoizeOptions'; -import IAIMantineSelect from 'common/components/IAIMantineSelect'; +import IAIMantineSearchableSelect from 'common/components/IAIMantineSearchableSelect'; import { canvasSelector } from 'features/canvas/store/canvasSelectors'; import { setBoundingBoxScaleMethod } from 'features/canvas/store/canvasSlice'; import { @@ -35,7 +35,7 @@ const ParamScaleBeforeProcessing = () => { }; return ( - { const { controlNetsArray, activeLabel } = useAppSelector(selector); const isControlNetDisabled = useFeatureStatus('controlNet').isFeatureDisabled; const dispatch = useAppDispatch(); + const { firstModel } = useGetControlNetModelsQuery(undefined, { + selectFromResult: (result) => { + const firstModel = result.data?.entities[result.data?.ids[0]]; + return { + firstModel, + }; + }, + }); const handleClickedAddControlNet = useCallback(() => { - dispatch(controlNetAdded({ controlNetId: uuidv4() })); - }, [dispatch]); + if (!firstModel) { + return; + } + const controlNetId = uuidv4(); + dispatch(controlNetAdded({ controlNetId })); + dispatch(controlNetModelChanged({ controlNetId, model: firstModel })); + }, [dispatch, firstModel]); if (isControlNetDisabled) { return null; @@ -51,16 +67,39 @@ const ParamControlNetCollapse = () => { return ( - + + + + + } + isDisabled={!firstModel} + flexGrow={1} + size="md" + onClick={handleClickedAddControlNet} + /> + {controlNetsArray.map((c, i) => ( {i > 0 && } - + ))} - - Add ControlNet - ); diff --git a/invokeai/frontend/web/src/features/parameters/components/Parameters/Core/ParamModelandVAEandScheduler.tsx b/invokeai/frontend/web/src/features/parameters/components/Parameters/Core/ParamModelandVAEandScheduler.tsx index 9054afcca2..74418de1d3 100644 --- a/invokeai/frontend/web/src/features/parameters/components/Parameters/Core/ParamModelandVAEandScheduler.tsx +++ b/invokeai/frontend/web/src/features/parameters/components/Parameters/Core/ParamModelandVAEandScheduler.tsx @@ -1,8 +1,8 @@ import { Box, Flex } from '@chakra-ui/react'; -import ModelSelect from 'features/system/components/ModelSelect'; -import VAESelect from 'features/system/components/VAESelect'; +import { useFeatureStatus } from 'features/system/hooks/useFeatureStatus'; import { memo } from 'react'; -import { useFeatureStatus } from '../../../../system/hooks/useFeatureStatus'; +import ParamMainModelSelect from '../MainModel/ParamMainModelSelect'; +import ParamVAEModelSelect from '../VAEModel/ParamVAEModelSelect'; import ParamScheduler from './ParamScheduler'; const ParamModelandVAEandScheduler = () => { @@ -11,12 +11,12 @@ const ParamModelandVAEandScheduler = () => { return ( - + {isVaeEnabled && ( - + )} diff --git a/invokeai/frontend/web/src/features/parameters/components/Parameters/Core/ParamScheduler.tsx b/invokeai/frontend/web/src/features/parameters/components/Parameters/Core/ParamScheduler.tsx index 8818dcba9b..5be09a2ff5 100644 --- a/invokeai/frontend/web/src/features/parameters/components/Parameters/Core/ParamScheduler.tsx +++ b/invokeai/frontend/web/src/features/parameters/components/Parameters/Core/ParamScheduler.tsx @@ -2,10 +2,10 @@ import { createSelector } from '@reduxjs/toolkit'; import { SCHEDULER_LABEL_MAP, SCHEDULER_NAMES } from 'app/constants'; import { useAppDispatch, useAppSelector } from 'app/store/storeHooks'; import { defaultSelectorOptions } from 'app/store/util/defaultMemoizeOptions'; -import IAIMantineSelect from 'common/components/IAIMantineSelect'; +import IAIMantineSearchableSelect from 'common/components/IAIMantineSearchableSelect'; import { generationSelector } from 'features/parameters/store/generationSelectors'; import { setScheduler } from 'features/parameters/store/generationSlice'; -import { SchedulerParam } from 'features/parameters/store/parameterZodSchemas'; +import { SchedulerParam } from 'features/parameters/types/parameterSchemas'; import { uiSelector } from 'features/ui/store/uiSelectors'; import { memo, useCallback } from 'react'; import { useTranslation } from 'react-i18next'; @@ -48,7 +48,7 @@ const ParamScheduler = () => { ); return ( - state.system.isGFPGANAvailable - ); - - const codeformerFidelity = useAppSelector( - (state: RootState) => state.postprocessing.codeformerFidelity - ); - - const { t } = useTranslation(); - const dispatch = useAppDispatch(); - - return ( - dispatch(setCodeformerFidelity(v))} - handleReset={() => dispatch(setCodeformerFidelity(1))} - value={codeformerFidelity} - withReset - withSliderMarks - withInput - /> - ); -} diff --git a/invokeai/frontend/web/src/features/parameters/components/Parameters/FaceRestore/FaceRestoreSettings.tsx b/invokeai/frontend/web/src/features/parameters/components/Parameters/FaceRestore/FaceRestoreSettings.tsx deleted file mode 100644 index f4d5ca07bc..0000000000 --- a/invokeai/frontend/web/src/features/parameters/components/Parameters/FaceRestore/FaceRestoreSettings.tsx +++ /dev/null @@ -1,25 +0,0 @@ -import { VStack } from '@chakra-ui/react'; -import { useAppSelector } from 'app/store/storeHooks'; -import type { RootState } from 'app/store/store'; -import FaceRestoreType from './FaceRestoreType'; -import FaceRestoreStrength from './FaceRestoreStrength'; -import CodeformerFidelity from './CodeformerFidelity'; - -/** - * Displays face-fixing/GFPGAN options (strength). - */ -const FaceRestoreSettings = () => { - const facetoolType = useAppSelector( - (state: RootState) => state.postprocessing.facetoolType - ); - - return ( - - - - {facetoolType === 'codeformer' && } - - ); -}; - -export default FaceRestoreSettings; diff --git a/invokeai/frontend/web/src/features/parameters/components/Parameters/FaceRestore/FaceRestoreStrength.tsx b/invokeai/frontend/web/src/features/parameters/components/Parameters/FaceRestore/FaceRestoreStrength.tsx deleted file mode 100644 index eeb5417c6e..0000000000 --- a/invokeai/frontend/web/src/features/parameters/components/Parameters/FaceRestore/FaceRestoreStrength.tsx +++ /dev/null @@ -1,34 +0,0 @@ -import { RootState } from 'app/store/store'; -import { useAppDispatch, useAppSelector } from 'app/store/storeHooks'; -import IAISlider from 'common/components/IAISlider'; -import { setFacetoolStrength } from 'features/parameters/store/postprocessingSlice'; -import { useTranslation } from 'react-i18next'; - -export default function FaceRestoreStrength() { - const isGFPGANAvailable = useAppSelector( - (state: RootState) => state.system.isGFPGANAvailable - ); - - const facetoolStrength = useAppSelector( - (state: RootState) => state.postprocessing.facetoolStrength - ); - - const { t } = useTranslation(); - const dispatch = useAppDispatch(); - - return ( - dispatch(setFacetoolStrength(v))} - handleReset={() => dispatch(setFacetoolStrength(0.75))} - value={facetoolStrength} - withReset - withSliderMarks - withInput - /> - ); -} diff --git a/invokeai/frontend/web/src/features/parameters/components/Parameters/FaceRestore/FaceRestoreToggle.tsx b/invokeai/frontend/web/src/features/parameters/components/Parameters/FaceRestore/FaceRestoreToggle.tsx deleted file mode 100644 index a314c0ad73..0000000000 --- a/invokeai/frontend/web/src/features/parameters/components/Parameters/FaceRestore/FaceRestoreToggle.tsx +++ /dev/null @@ -1,28 +0,0 @@ -import { RootState } from 'app/store/store'; -import { useAppDispatch, useAppSelector } from 'app/store/storeHooks'; -import IAISwitch from 'common/components/IAISwitch'; -import { setShouldRunFacetool } from 'features/parameters/store/postprocessingSlice'; -import { ChangeEvent } from 'react'; - -export default function FaceRestoreToggle() { - const isGFPGANAvailable = useAppSelector( - (state: RootState) => state.system.isGFPGANAvailable - ); - - const shouldRunFacetool = useAppSelector( - (state: RootState) => state.postprocessing.shouldRunFacetool - ); - - const dispatch = useAppDispatch(); - - const handleChangeShouldRunFacetool = (e: ChangeEvent) => - dispatch(setShouldRunFacetool(e.target.checked)); - - return ( - - ); -} diff --git a/invokeai/frontend/web/src/features/parameters/components/Parameters/FaceRestore/FaceRestoreType.tsx b/invokeai/frontend/web/src/features/parameters/components/Parameters/FaceRestore/FaceRestoreType.tsx deleted file mode 100644 index 9246b3bd5c..0000000000 --- a/invokeai/frontend/web/src/features/parameters/components/Parameters/FaceRestore/FaceRestoreType.tsx +++ /dev/null @@ -1,30 +0,0 @@ -import { FACETOOL_TYPES } from 'app/constants'; -import { RootState } from 'app/store/store'; -import { useAppDispatch, useAppSelector } from 'app/store/storeHooks'; -import IAIMantineSelect from 'common/components/IAIMantineSelect'; -import { - FacetoolType, - setFacetoolType, -} from 'features/parameters/store/postprocessingSlice'; -import { useTranslation } from 'react-i18next'; - -export default function FaceRestoreType() { - const facetoolType = useAppSelector( - (state: RootState) => state.postprocessing.facetoolType - ); - - const dispatch = useAppDispatch(); - const { t } = useTranslation(); - - const handleChangeFacetoolType = (v: string) => - dispatch(setFacetoolType(v as FacetoolType)); - - return ( - - ); -} diff --git a/invokeai/frontend/web/src/features/parameters/components/Parameters/Hires/ParamHiresCollapse.tsx b/invokeai/frontend/web/src/features/parameters/components/Parameters/Hires/ParamHiresCollapse.tsx deleted file mode 100644 index fa8606d610..0000000000 --- a/invokeai/frontend/web/src/features/parameters/components/Parameters/Hires/ParamHiresCollapse.tsx +++ /dev/null @@ -1,43 +0,0 @@ -import { Flex } from '@chakra-ui/react'; -import { createSelector } from '@reduxjs/toolkit'; -import { stateSelector } from 'app/store/store'; -import { useAppSelector } from 'app/store/storeHooks'; -import { defaultSelectorOptions } from 'app/store/util/defaultMemoizeOptions'; -import IAICollapse from 'common/components/IAICollapse'; -import { useFeatureStatus } from 'features/system/hooks/useFeatureStatus'; -import { memo } from 'react'; -import { useTranslation } from 'react-i18next'; -import { ParamHiresStrength } from './ParamHiresStrength'; -import { ParamHiresToggle } from './ParamHiresToggle'; - -const selector = createSelector( - stateSelector, - (state) => { - const activeLabel = state.postprocessing.hiresFix ? 'Enabled' : undefined; - - return { activeLabel }; - }, - defaultSelectorOptions -); - -const ParamHiresCollapse = () => { - const { t } = useTranslation(); - const { activeLabel } = useAppSelector(selector); - - const isHiresEnabled = useFeatureStatus('hires').isFeatureEnabled; - - if (!isHiresEnabled) { - return null; - } - - return ( - - - - - - - ); -}; - -export default memo(ParamHiresCollapse); diff --git a/invokeai/frontend/web/src/features/parameters/components/Parameters/Hires/ParamHiresHeight.tsx b/invokeai/frontend/web/src/features/parameters/components/Parameters/Hires/ParamHiresHeight.tsx deleted file mode 100644 index 80a15f591b..0000000000 --- a/invokeai/frontend/web/src/features/parameters/components/Parameters/Hires/ParamHiresHeight.tsx +++ /dev/null @@ -1,3 +0,0 @@ -// TODO - -export default {}; diff --git a/invokeai/frontend/web/src/features/parameters/components/Parameters/Hires/ParamHiresSteps.tsx b/invokeai/frontend/web/src/features/parameters/components/Parameters/Hires/ParamHiresSteps.tsx deleted file mode 100644 index 80a15f591b..0000000000 --- a/invokeai/frontend/web/src/features/parameters/components/Parameters/Hires/ParamHiresSteps.tsx +++ /dev/null @@ -1,3 +0,0 @@ -// TODO - -export default {}; diff --git a/invokeai/frontend/web/src/features/parameters/components/Parameters/Hires/ParamHiresStrength.tsx b/invokeai/frontend/web/src/features/parameters/components/Parameters/Hires/ParamHiresStrength.tsx deleted file mode 100644 index 2655841590..0000000000 --- a/invokeai/frontend/web/src/features/parameters/components/Parameters/Hires/ParamHiresStrength.tsx +++ /dev/null @@ -1,51 +0,0 @@ -import { createSelector } from '@reduxjs/toolkit'; -import { useAppDispatch, useAppSelector } from 'app/store/storeHooks'; -import IAISlider from 'common/components/IAISlider'; -import { postprocessingSelector } from 'features/parameters/store/postprocessingSelectors'; -import { setHiresStrength } from 'features/parameters/store/postprocessingSlice'; -import { isEqual } from 'lodash-es'; -import { useTranslation } from 'react-i18next'; - -const hiresStrengthSelector = createSelector( - [postprocessingSelector], - ({ hiresFix, hiresStrength }) => ({ hiresFix, hiresStrength }), - { - memoizeOptions: { - resultEqualityCheck: isEqual, - }, - } -); - -export const ParamHiresStrength = () => { - const { hiresFix, hiresStrength } = useAppSelector(hiresStrengthSelector); - - const dispatch = useAppDispatch(); - - const { t } = useTranslation(); - - const handleHiresStrength = (v: number) => { - dispatch(setHiresStrength(v)); - }; - - const handleHiResStrengthReset = () => { - dispatch(setHiresStrength(0.75)); - }; - - return ( - - ); -}; diff --git a/invokeai/frontend/web/src/features/parameters/components/Parameters/Hires/ParamHiresToggle.tsx b/invokeai/frontend/web/src/features/parameters/components/Parameters/Hires/ParamHiresToggle.tsx deleted file mode 100644 index f8e6f22aa4..0000000000 --- a/invokeai/frontend/web/src/features/parameters/components/Parameters/Hires/ParamHiresToggle.tsx +++ /dev/null @@ -1,30 +0,0 @@ -import type { RootState } from 'app/store/store'; -import { useAppDispatch, useAppSelector } from 'app/store/storeHooks'; -import IAISwitch from 'common/components/IAISwitch'; -import { setHiresFix } from 'features/parameters/store/postprocessingSlice'; -import { ChangeEvent } from 'react'; -import { useTranslation } from 'react-i18next'; - -/** - * Hires Fix Toggle - */ -export const ParamHiresToggle = () => { - const dispatch = useAppDispatch(); - - const hiresFix = useAppSelector( - (state: RootState) => state.postprocessing.hiresFix - ); - - const { t } = useTranslation(); - - const handleChangeHiresFix = (e: ChangeEvent) => - dispatch(setHiresFix(e.target.checked)); - - return ( - - ); -}; diff --git a/invokeai/frontend/web/src/features/parameters/components/Parameters/Hires/ParamHiresWidth.tsx b/invokeai/frontend/web/src/features/parameters/components/Parameters/Hires/ParamHiresWidth.tsx deleted file mode 100644 index 80a15f591b..0000000000 --- a/invokeai/frontend/web/src/features/parameters/components/Parameters/Hires/ParamHiresWidth.tsx +++ /dev/null @@ -1,3 +0,0 @@ -// TODO - -export default {}; diff --git a/invokeai/frontend/web/src/features/parameters/components/Parameters/ImageToImage/InitialImage.tsx b/invokeai/frontend/web/src/features/parameters/components/Parameters/ImageToImage/InitialImage.tsx index 7951df31a7..c95149393e 100644 --- a/invokeai/frontend/web/src/features/parameters/components/Parameters/ImageToImage/InitialImage.tsx +++ b/invokeai/frontend/web/src/features/parameters/components/Parameters/ImageToImage/InitialImage.tsx @@ -1,30 +1,24 @@ -import { Flex, Icon, Text } from '@chakra-ui/react'; import { createSelector } from '@reduxjs/toolkit'; -import { useAppSelector } from 'app/store/storeHooks'; -import { useMemo } from 'react'; -import { defaultSelectorOptions } from 'app/store/util/defaultMemoizeOptions'; -import IAIDndImage from 'common/components/IAIDndImage'; -import { useGetImageDTOQuery } from 'services/api/endpoints/images'; import { skipToken } from '@reduxjs/toolkit/dist/query'; -import { FaImage } from 'react-icons/fa'; -import { stateSelector } from 'app/store/store'; import { TypesafeDraggableData, TypesafeDroppableData, } from 'app/components/ImageDnd/typesafeDnd'; +import { stateSelector } from 'app/store/store'; +import { useAppSelector } from 'app/store/storeHooks'; +import { defaultSelectorOptions } from 'app/store/util/defaultMemoizeOptions'; +import IAIDndImage from 'common/components/IAIDndImage'; import { IAINoContentFallback } from 'common/components/IAIImageFallback'; +import { useMemo } from 'react'; +import { useGetImageDTOQuery } from 'services/api/endpoints/images'; const selector = createSelector( [stateSelector], (state) => { const { initialImage } = state.generation; - const { asInitialImage: useBatchAsInitialImage, imageNames } = state.batch; return { initialImage, - useBatchAsInitialImage, - isResetButtonDisabled: useBatchAsInitialImage - ? imageNames.length === 0 - : !initialImage, + isResetButtonDisabled: !initialImage, }; }, defaultSelectorOptions diff --git a/invokeai/frontend/web/src/features/parameters/components/Parameters/ImageToImage/InitialImageDisplay.tsx b/invokeai/frontend/web/src/features/parameters/components/Parameters/ImageToImage/InitialImageDisplay.tsx index c08f714488..2422e6f542 100644 --- a/invokeai/frontend/web/src/features/parameters/components/Parameters/ImageToImage/InitialImageDisplay.tsx +++ b/invokeai/frontend/web/src/features/parameters/components/Parameters/ImageToImage/InitialImageDisplay.tsx @@ -1,22 +1,14 @@ import { Flex, Spacer, Text } from '@chakra-ui/react'; import { createSelector } from '@reduxjs/toolkit'; -import { useAppDispatch, useAppSelector } from 'app/store/storeHooks'; -import { clearInitialImage } from 'features/parameters/store/generationSlice'; -import { useCallback, useMemo } from 'react'; -import { defaultSelectorOptions } from 'app/store/util/defaultMemoizeOptions'; -import { useGetImageDTOQuery } from 'services/api/endpoints/images'; -import { skipToken } from '@reduxjs/toolkit/dist/query'; -import IAIIconButton from 'common/components/IAIIconButton'; -import { FaLayerGroup, FaUndo, FaUpload } from 'react-icons/fa'; -import useImageUploader from 'common/hooks/useImageUploader'; -import { useImageUploadButton } from 'common/hooks/useImageUploadButton'; -import IAIButton from 'common/components/IAIButton'; import { stateSelector } from 'app/store/store'; -import { - asInitialImageToggled, - batchReset, -} from 'features/batch/store/batchSlice'; -import BatchImageContainer from 'features/batch/components/BatchImageContainer'; +import { useAppDispatch, useAppSelector } from 'app/store/storeHooks'; +import { defaultSelectorOptions } from 'app/store/util/defaultMemoizeOptions'; +import IAIIconButton from 'common/components/IAIIconButton'; +import { useImageUploadButton } from 'common/hooks/useImageUploadButton'; +import useImageUploader from 'common/hooks/useImageUploader'; +import { clearInitialImage } from 'features/parameters/store/generationSlice'; +import { useCallback } from 'react'; +import { FaUndo, FaUpload } from 'react-icons/fa'; import { PostUploadAction } from 'services/api/thunks/image'; import InitialImage from './InitialImage'; @@ -24,59 +16,34 @@ const selector = createSelector( [stateSelector], (state) => { const { initialImage } = state.generation; - const { asInitialImage: useBatchAsInitialImage, imageNames } = state.batch; return { - initialImage, - useBatchAsInitialImage, - isResetButtonDisabled: useBatchAsInitialImage - ? imageNames.length === 0 - : !initialImage, + isResetButtonDisabled: !initialImage, }; }, defaultSelectorOptions ); +const postUploadAction: PostUploadAction = { + type: 'SET_INITIAL_IMAGE', +}; + const InitialImageDisplay = () => { - const { initialImage, useBatchAsInitialImage, isResetButtonDisabled } = - useAppSelector(selector); + const { isResetButtonDisabled } = useAppSelector(selector); const dispatch = useAppDispatch(); const { openUploader } = useImageUploader(); - const { - currentData: imageDTO, - isLoading, - isError, - isSuccess, - } = useGetImageDTOQuery(initialImage?.imageName ?? skipToken); - - const postUploadAction = useMemo( - () => - useBatchAsInitialImage - ? { type: 'ADD_TO_BATCH' } - : { type: 'SET_INITIAL_IMAGE' }, - [useBatchAsInitialImage] - ); - const { getUploadButtonProps, getUploadInputProps } = useImageUploadButton({ postUploadAction, }); const handleReset = useCallback(() => { - if (useBatchAsInitialImage) { - dispatch(batchReset()); - } else { - dispatch(clearInitialImage()); - } - }, [dispatch, useBatchAsInitialImage]); + dispatch(clearInitialImage()); + }, [dispatch]); const handleUpload = useCallback(() => { openUploader(); }, [openUploader]); - const handleClickUseBatch = useCallback(() => { - dispatch(asInitialImageToggled()); - }, [dispatch]); - return ( { Initial Image - {/* } - isChecked={useBatchAsInitialImage} - onClick={handleClickUseBatch} - > - {useBatchAsInitialImage ? 'Batch' : 'Single'} - */} } onClick={handleUpload} {...getUploadButtonProps()} /> } onClick={handleReset} isDisabled={isResetButtonDisabled} /> - {/* {useBatchAsInitialImage ? : } */} ); diff --git a/invokeai/frontend/web/src/features/parameters/components/Parameters/MainModel/ParamMainModelSelect.tsx b/invokeai/frontend/web/src/features/parameters/components/Parameters/MainModel/ParamMainModelSelect.tsx new file mode 100644 index 0000000000..a03f129d63 --- /dev/null +++ b/invokeai/frontend/web/src/features/parameters/components/Parameters/MainModel/ParamMainModelSelect.tsx @@ -0,0 +1,123 @@ +import { memo, useCallback, useMemo } from 'react'; +import { useTranslation } from 'react-i18next'; + +import { useAppDispatch, useAppSelector } from 'app/store/storeHooks'; +import IAIMantineSearchableSelect from 'common/components/IAIMantineSearchableSelect'; + +import { SelectItem } from '@mantine/core'; +import { createSelector } from '@reduxjs/toolkit'; +import { stateSelector } from 'app/store/store'; +import { defaultSelectorOptions } from 'app/store/util/defaultMemoizeOptions'; +import { modelSelected } from 'features/parameters/store/actions'; +import { MODEL_TYPE_MAP } from 'features/parameters/types/constants'; +import { modelIdToMainModelParam } from 'features/parameters/util/modelIdToMainModelParam'; +import { forEach } from 'lodash-es'; +import { + useGetMainModelsQuery, + useGetOnnxModelsQuery, +} from 'services/api/endpoints/models'; +import { modelIdToOnnxModelField } from 'features/nodes/util/modelIdToOnnxModelField'; + +const selector = createSelector( + stateSelector, + (state) => ({ model: state.generation.model }), + defaultSelectorOptions +); + +const ParamMainModelSelect = () => { + const dispatch = useAppDispatch(); + const { t } = useTranslation(); + + const { model } = useAppSelector(selector); + + const { data: mainModels, isLoading } = useGetMainModelsQuery(); + const { data: onnxModels, isLoading: onnxLoading } = useGetOnnxModelsQuery(); + + const data = useMemo(() => { + if (!mainModels) { + return []; + } + + const data: SelectItem[] = []; + + forEach(mainModels.entities, (model, id) => { + if (!model || ['sdxl', 'sdxl-refiner'].includes(model.base_model)) { + return; + } + + data.push({ + value: id, + label: model.model_name, + group: MODEL_TYPE_MAP[model.base_model], + }); + }); + forEach(onnxModels?.entities, (model, id) => { + if (!model) { + return; + } + + data.push({ + value: id, + label: model.model_name, + group: MODEL_TYPE_MAP[model.base_model], + }); + }); + + return data; + }, [mainModels, onnxModels]); + + // grab the full model entity from the RTK Query cache + // TODO: maybe we should just store the full model entity in state? + const selectedModel = useMemo( + () => + (mainModels?.entities[`${model?.base_model}/main/${model?.model_name}`] || + onnxModels?.entities[ + `${model?.base_model}/onnx/${model?.model_name}` + ]) ?? + null, + [mainModels?.entities, model, onnxModels?.entities] + ); + + const handleChangeModel = useCallback( + (v: string | null) => { + if (!v) { + return; + } + + let newModel = modelIdToMainModelParam(v); + + if (v.includes('onnx')) { + newModel = modelIdToOnnxModelField(v); + } + + if (!newModel) { + return; + } + + dispatch(modelSelected(newModel)); + }, + [dispatch] + ); + + return isLoading || onnxLoading ? ( + + ) : ( + 0 ? 'Select a model' : 'No models available'} + data={data} + error={data.length === 0} + disabled={data.length === 0} + onChange={handleChangeModel} + /> + ); +}; + +export default memo(ParamMainModelSelect); diff --git a/invokeai/frontend/web/src/features/parameters/components/Parameters/Upscale/ParamRealESRGANModel.tsx b/invokeai/frontend/web/src/features/parameters/components/Parameters/Upscale/ParamRealESRGANModel.tsx new file mode 100644 index 0000000000..563165105b --- /dev/null +++ b/invokeai/frontend/web/src/features/parameters/components/Parameters/Upscale/ParamRealESRGANModel.tsx @@ -0,0 +1,58 @@ +import { SelectItem } from '@mantine/core'; +import type { RootState } from 'app/store/store'; +import { useAppDispatch, useAppSelector } from 'app/store/storeHooks'; +import IAIMantineSelect from 'common/components/IAIMantineSelect'; +import IAIMantineSelectItemWithTooltip from 'common/components/IAIMantineSelectItemWithTooltip'; +import { + ESRGANModelName, + esrganModelNameChanged, +} from 'features/parameters/store/postprocessingSlice'; +import { useTranslation } from 'react-i18next'; + +export const ESRGAN_MODEL_NAMES: SelectItem[] = [ + { + label: 'RealESRGAN x2 Plus', + value: 'RealESRGAN_x2plus.pth', + tooltip: 'Attempts to retain sharpness, low smoothing', + group: 'x2 Upscalers', + }, + { + label: 'RealESRGAN x4 Plus', + value: 'RealESRGAN_x4plus.pth', + tooltip: 'Best for photos and highly detailed images, medium smoothing', + group: 'x4 Upscalers', + }, + { + label: 'RealESRGAN x4 Plus (anime 6B)', + value: 'RealESRGAN_x4plus_anime_6B.pth', + tooltip: 'Best for anime/manga, high smoothing', + group: 'x4 Upscalers', + }, + { + label: 'ESRGAN SRx4', + value: 'ESRGAN_SRx4_DF2KOST_official-ff704c30.pth', + tooltip: 'Retains sharpness, low smoothing', + group: 'x4 Upscalers', + }, +]; + +export default function ParamESRGANModel() { + const esrganModelName = useAppSelector( + (state: RootState) => state.postprocessing.esrganModelName + ); + + const dispatch = useAppDispatch(); + + const handleChange = (v: string) => + dispatch(esrganModelNameChanged(v as ESRGANModelName)); + + return ( + + ); +} diff --git a/invokeai/frontend/web/src/features/parameters/components/Parameters/Upscale/ParamUpscaleSettings.tsx b/invokeai/frontend/web/src/features/parameters/components/Parameters/Upscale/ParamUpscaleSettings.tsx new file mode 100644 index 0000000000..5824c38123 --- /dev/null +++ b/invokeai/frontend/web/src/features/parameters/components/Parameters/Upscale/ParamUpscaleSettings.tsx @@ -0,0 +1,62 @@ +import { Flex, useDisclosure } from '@chakra-ui/react'; +import { upscaleRequested } from 'app/store/middleware/listenerMiddleware/listeners/upscaleRequested'; +import { useAppDispatch, useAppSelector } from 'app/store/storeHooks'; +import IAIButton from 'common/components/IAIButton'; +import IAIIconButton from 'common/components/IAIIconButton'; +import IAIPopover from 'common/components/IAIPopover'; +import { selectIsBusy } from 'features/system/store/systemSelectors'; +import { useCallback } from 'react'; +import { useTranslation } from 'react-i18next'; +import { FaExpandArrowsAlt } from 'react-icons/fa'; +import { ImageDTO } from 'services/api/types'; +import ParamESRGANModel from './ParamRealESRGANModel'; + +type Props = { imageDTO?: ImageDTO }; + +const ParamUpscalePopover = (props: Props) => { + const { imageDTO } = props; + const dispatch = useAppDispatch(); + const isBusy = useAppSelector(selectIsBusy); + const { t } = useTranslation(); + const { isOpen, onOpen, onClose } = useDisclosure(); + + const handleClickUpscale = useCallback(() => { + onClose(); + if (!imageDTO) { + return; + } + dispatch(upscaleRequested({ image_name: imageDTO.image_name })); + }, [dispatch, imageDTO, onClose]); + + return ( + } + aria-label={t('parameters.upscale')} + /> + } + > + + + + {t('parameters.upscaleImage')} + + + + ); +}; + +export default ParamUpscalePopover; diff --git a/invokeai/frontend/web/src/features/parameters/components/Parameters/Upscale/UpscaleDenoisingStrength.tsx b/invokeai/frontend/web/src/features/parameters/components/Parameters/Upscale/UpscaleDenoisingStrength.tsx deleted file mode 100644 index 7abcd55c03..0000000000 --- a/invokeai/frontend/web/src/features/parameters/components/Parameters/Upscale/UpscaleDenoisingStrength.tsx +++ /dev/null @@ -1,36 +0,0 @@ -import { RootState } from 'app/store/store'; -import { useAppDispatch, useAppSelector } from 'app/store/storeHooks'; -import IAISlider from 'common/components/IAISlider'; -import { setUpscalingDenoising } from 'features/parameters/store/postprocessingSlice'; -import { useTranslation } from 'react-i18next'; - -export default function UpscaleDenoisingStrength() { - const isESRGANAvailable = useAppSelector( - (state: RootState) => state.system.isESRGANAvailable - ); - - const upscalingDenoising = useAppSelector( - (state: RootState) => state.postprocessing.upscalingDenoising - ); - - const { t } = useTranslation(); - const dispatch = useAppDispatch(); - - return ( - { - dispatch(setUpscalingDenoising(v)); - }} - handleReset={() => dispatch(setUpscalingDenoising(0.75))} - withSliderMarks - withInput - withReset - isDisabled={!isESRGANAvailable} - /> - ); -} diff --git a/invokeai/frontend/web/src/features/parameters/components/Parameters/Upscale/UpscaleScale.tsx b/invokeai/frontend/web/src/features/parameters/components/Parameters/Upscale/UpscaleScale.tsx deleted file mode 100644 index fadc8a7419..0000000000 --- a/invokeai/frontend/web/src/features/parameters/components/Parameters/Upscale/UpscaleScale.tsx +++ /dev/null @@ -1,35 +0,0 @@ -import { UPSCALING_LEVELS } from 'app/constants'; -import type { RootState } from 'app/store/store'; -import { useAppDispatch, useAppSelector } from 'app/store/storeHooks'; -import IAIMantineSelect from 'common/components/IAIMantineSelect'; -import { - UpscalingLevel, - setUpscalingLevel, -} from 'features/parameters/store/postprocessingSlice'; -import { useTranslation } from 'react-i18next'; - -export default function UpscaleScale() { - const isESRGANAvailable = useAppSelector( - (state: RootState) => state.system.isESRGANAvailable - ); - - const upscalingLevel = useAppSelector( - (state: RootState) => state.postprocessing.upscalingLevel - ); - - const { t } = useTranslation(); - const dispatch = useAppDispatch(); - - const handleChangeLevel = (v: string) => - dispatch(setUpscalingLevel(Number(v) as UpscalingLevel)); - - return ( - - ); -} diff --git a/invokeai/frontend/web/src/features/parameters/components/Parameters/Upscale/UpscaleSettings.tsx b/invokeai/frontend/web/src/features/parameters/components/Parameters/Upscale/UpscaleSettings.tsx deleted file mode 100644 index 291b8f9dc2..0000000000 --- a/invokeai/frontend/web/src/features/parameters/components/Parameters/Upscale/UpscaleSettings.tsx +++ /dev/null @@ -1,19 +0,0 @@ -import { VStack } from '@chakra-ui/react'; -import UpscaleDenoisingStrength from './UpscaleDenoisingStrength'; -import UpscaleStrength from './UpscaleStrength'; -import UpscaleScale from './UpscaleScale'; - -/** - * Displays upscaling/ESRGAN options (level and strength). - */ -const UpscaleSettings = () => { - return ( - - - - - - ); -}; - -export default UpscaleSettings; diff --git a/invokeai/frontend/web/src/features/parameters/components/Parameters/Upscale/UpscaleStrength.tsx b/invokeai/frontend/web/src/features/parameters/components/Parameters/Upscale/UpscaleStrength.tsx deleted file mode 100644 index 68f61cf1e0..0000000000 --- a/invokeai/frontend/web/src/features/parameters/components/Parameters/Upscale/UpscaleStrength.tsx +++ /dev/null @@ -1,33 +0,0 @@ -import type { RootState } from 'app/store/store'; -import { useAppDispatch, useAppSelector } from 'app/store/storeHooks'; -import IAISlider from 'common/components/IAISlider'; -import { setUpscalingStrength } from 'features/parameters/store/postprocessingSlice'; -import { useTranslation } from 'react-i18next'; - -export default function UpscaleStrength() { - const isESRGANAvailable = useAppSelector( - (state: RootState) => state.system.isESRGANAvailable - ); - const upscalingStrength = useAppSelector( - (state: RootState) => state.postprocessing.upscalingStrength - ); - - const { t } = useTranslation(); - const dispatch = useAppDispatch(); - - return ( - dispatch(setUpscalingStrength(v))} - handleReset={() => dispatch(setUpscalingStrength(0.75))} - withSliderMarks - withInput - withReset - isDisabled={!isESRGANAvailable} - /> - ); -} diff --git a/invokeai/frontend/web/src/features/parameters/components/Parameters/Upscale/UpscaleToggle.tsx b/invokeai/frontend/web/src/features/parameters/components/Parameters/Upscale/UpscaleToggle.tsx deleted file mode 100644 index 172a9f2de9..0000000000 --- a/invokeai/frontend/web/src/features/parameters/components/Parameters/Upscale/UpscaleToggle.tsx +++ /dev/null @@ -1,26 +0,0 @@ -import { RootState } from 'app/store/store'; -import { useAppDispatch, useAppSelector } from 'app/store/storeHooks'; -import IAISwitch from 'common/components/IAISwitch'; -import { setShouldRunESRGAN } from 'features/parameters/store/postprocessingSlice'; -import { ChangeEvent } from 'react'; - -export default function UpscaleToggle() { - const isESRGANAvailable = useAppSelector( - (state: RootState) => state.system.isESRGANAvailable - ); - - const shouldRunESRGAN = useAppSelector( - (state: RootState) => state.postprocessing.shouldRunESRGAN - ); - - const dispatch = useAppDispatch(); - const handleChangeShouldRunESRGAN = (e: ChangeEvent) => - dispatch(setShouldRunESRGAN(e.target.checked)); - return ( - - ); -} diff --git a/invokeai/frontend/web/src/features/parameters/components/Parameters/VAEModel/ParamVAEModelSelect.tsx b/invokeai/frontend/web/src/features/parameters/components/Parameters/VAEModel/ParamVAEModelSelect.tsx new file mode 100644 index 0000000000..f82b02b5af --- /dev/null +++ b/invokeai/frontend/web/src/features/parameters/components/Parameters/VAEModel/ParamVAEModelSelect.tsx @@ -0,0 +1,110 @@ +import { memo, useCallback, useMemo } from 'react'; +import { useTranslation } from 'react-i18next'; + +import { useAppDispatch, useAppSelector } from 'app/store/storeHooks'; +import IAIMantineSearchableSelect from 'common/components/IAIMantineSearchableSelect'; + +import { SelectItem } from '@mantine/core'; +import { forEach } from 'lodash-es'; +import { useGetVaeModelsQuery } from 'services/api/endpoints/models'; + +import { createSelector } from '@reduxjs/toolkit'; +import { stateSelector } from 'app/store/store'; +import { defaultSelectorOptions } from 'app/store/util/defaultMemoizeOptions'; +import IAIMantineSelectItemWithTooltip from 'common/components/IAIMantineSelectItemWithTooltip'; +import { vaeSelected } from 'features/parameters/store/generationSlice'; +import { MODEL_TYPE_MAP } from 'features/parameters/types/constants'; +import { modelIdToVAEModelParam } from 'features/parameters/util/modelIdToVAEModelParam'; + +const selector = createSelector( + stateSelector, + ({ generation }) => { + const { model, vae } = generation; + return { model, vae }; + }, + defaultSelectorOptions +); + +const ParamVAEModelSelect = () => { + const dispatch = useAppDispatch(); + const { t } = useTranslation(); + const { model, vae } = useAppSelector(selector); + + const { data: vaeModels } = useGetVaeModelsQuery(); + + const data = useMemo(() => { + if (!vaeModels) { + return []; + } + + // add a "default" option, this means use the main model's included VAE + const data: SelectItem[] = [ + { + value: 'default', + label: 'Default', + group: 'Default', + }, + ]; + + forEach(vaeModels.entities, (vae, id) => { + if (!vae) { + return; + } + + const disabled = model?.base_model !== vae.base_model; + + data.push({ + value: id, + label: vae.model_name, + group: MODEL_TYPE_MAP[vae.base_model], + disabled, + tooltip: disabled + ? `Incompatible base model: ${vae.base_model}` + : undefined, + }); + }); + + return data.sort((a, b) => (a.disabled && !b.disabled ? 1 : -1)); + }, [vaeModels, model?.base_model]); + + // grab the full model entity from the RTK Query cache + const selectedVaeModel = useMemo( + () => + vaeModels?.entities[`${vae?.base_model}/vae/${vae?.model_name}`] ?? null, + [vaeModels?.entities, vae] + ); + + const handleChangeModel = useCallback( + (v: string | null) => { + if (!v || v === 'default') { + dispatch(vaeSelected(null)); + return; + } + + const newVaeModel = modelIdToVAEModelParam(v); + + if (!newVaeModel) { + return; + } + + dispatch(vaeSelected(newVaeModel)); + }, + [dispatch] + ); + + return ( + + ); +}; + +export default memo(ParamVAEModelSelect); diff --git a/invokeai/frontend/web/src/features/parameters/components/ProcessButtons/InvokeButton.tsx b/invokeai/frontend/web/src/features/parameters/components/ProcessButtons/InvokeButton.tsx index 2e399647d8..ab4949392d 100644 --- a/invokeai/frontend/web/src/features/parameters/components/ProcessButtons/InvokeButton.tsx +++ b/invokeai/frontend/web/src/features/parameters/components/ProcessButtons/InvokeButton.tsx @@ -17,8 +17,10 @@ import { FaPlay } from 'react-icons/fa'; const IN_PROGRESS_STYLES: ChakraProps['sx'] = { _disabled: { bg: 'none', + color: 'base.600', cursor: 'not-allowed', _hover: { + color: 'base.600', bg: 'none', }, }, diff --git a/invokeai/frontend/web/src/features/parameters/hooks/useRecallParameters.ts b/invokeai/frontend/web/src/features/parameters/hooks/useRecallParameters.ts index 9e4f5aeff0..6329d9d677 100644 --- a/invokeai/frontend/web/src/features/parameters/hooks/useRecallParameters.ts +++ b/invokeai/frontend/web/src/features/parameters/hooks/useRecallParameters.ts @@ -28,7 +28,7 @@ import { isValidSteps, isValidStrength, isValidWidth, -} from '../store/parameterZodSchemas'; +} from '../types/parameterSchemas'; export const useRecallParameters = () => { const dispatch = useAppDispatch(); diff --git a/invokeai/frontend/web/src/features/parameters/store/generationSlice.ts b/invokeai/frontend/web/src/features/parameters/store/generationSlice.ts index cf33f36ce6..37d304bbc7 100644 --- a/invokeai/frontend/web/src/features/parameters/store/generationSlice.ts +++ b/invokeai/frontend/web/src/features/parameters/store/generationSlice.ts @@ -13,6 +13,7 @@ import { clipSkipMap } from '../components/Parameters/Advanced/ParamClipSkip'; import { CfgScaleParam, HeightParam, + MainModelParam, NegativePromptParam, PositivePromptParam, SchedulerParam, @@ -22,7 +23,7 @@ import { VaeModelParam, WidthParam, zMainModel, -} from './parameterZodSchemas'; +} from '../types/parameterSchemas'; export interface GenerationState { cfgScale: CfgScaleParam; @@ -228,19 +229,20 @@ export const generationSlice = createSlice({ }, modelChanged: ( state, - action: PayloadAction + action: PayloadAction ) => { - if (!action.payload) { - state.model = null; - } + state.model = action.payload; - state.model = zMainModel.parse(action.payload); + if (state.model === null) { + return; + } // Clamp ClipSkip Based On Selected Model const { maxClip } = clipSkipMap[state.model.base_model]; state.clipSkip = clamp(state.clipSkip, 0, maxClip); }, vaeSelected: (state, action: PayloadAction) => { + // null is a valid VAE! state.vae = action.payload; }, setClipSkip: (state, action: PayloadAction) => { @@ -256,12 +258,16 @@ export const generationSlice = createSlice({ if (defaultModel && !state.model) { const [base_model, model_type, model_name] = defaultModel.split('/'); - state.model = zMainModel.parse({ - id: defaultModel, - name: model_name, + + const result = zMainModel.safeParse({ + model_name, base_model, model_type, }); + + if (result.success) { + state.model = result.data; + } } }); builder.addCase(setShouldShowAdvancedOptions, (state, action) => { diff --git a/invokeai/frontend/web/src/features/parameters/store/postprocessingSlice.ts b/invokeai/frontend/web/src/features/parameters/store/postprocessingSlice.ts index 399a474008..a1fbf3648f 100644 --- a/invokeai/frontend/web/src/features/parameters/store/postprocessingSlice.ts +++ b/invokeai/frontend/web/src/features/parameters/store/postprocessingSlice.ts @@ -1,98 +1,27 @@ import type { PayloadAction } from '@reduxjs/toolkit'; import { createSlice } from '@reduxjs/toolkit'; -import { FACETOOL_TYPES } from 'app/constants'; +import { ESRGANInvocation } from 'services/api/types'; -export type UpscalingLevel = 2 | 4; - -export type FacetoolType = (typeof FACETOOL_TYPES)[number]; +export type ESRGANModelName = NonNullable; export interface PostprocessingState { - codeformerFidelity: number; - facetoolStrength: number; - facetoolType: FacetoolType; - hiresFix: boolean; - hiresStrength: number; - shouldLoopback: boolean; - shouldRunESRGAN: boolean; - shouldRunFacetool: boolean; - upscalingLevel: UpscalingLevel; - upscalingDenoising: number; - upscalingStrength: number; + esrganModelName: ESRGANModelName; } export const initialPostprocessingState: PostprocessingState = { - codeformerFidelity: 0.75, - facetoolStrength: 0.75, - facetoolType: 'gfpgan', - hiresFix: false, - hiresStrength: 0.75, - shouldLoopback: false, - shouldRunESRGAN: false, - shouldRunFacetool: false, - upscalingLevel: 4, - upscalingDenoising: 0.75, - upscalingStrength: 0.75, + esrganModelName: 'RealESRGAN_x4plus.pth', }; export const postprocessingSlice = createSlice({ name: 'postprocessing', initialState: initialPostprocessingState, reducers: { - setFacetoolStrength: (state, action: PayloadAction) => { - state.facetoolStrength = action.payload; - }, - setCodeformerFidelity: (state, action: PayloadAction) => { - state.codeformerFidelity = action.payload; - }, - setUpscalingLevel: (state, action: PayloadAction) => { - state.upscalingLevel = action.payload; - }, - setUpscalingDenoising: (state, action: PayloadAction) => { - state.upscalingDenoising = action.payload; - }, - setUpscalingStrength: (state, action: PayloadAction) => { - state.upscalingStrength = action.payload; - }, - setHiresFix: (state, action: PayloadAction) => { - state.hiresFix = action.payload; - }, - setHiresStrength: (state, action: PayloadAction) => { - state.hiresStrength = action.payload; - }, - resetPostprocessingState: (state) => { - return { - ...state, - ...initialPostprocessingState, - }; - }, - setShouldRunFacetool: (state, action: PayloadAction) => { - state.shouldRunFacetool = action.payload; - }, - setFacetoolType: (state, action: PayloadAction) => { - state.facetoolType = action.payload; - }, - setShouldRunESRGAN: (state, action: PayloadAction) => { - state.shouldRunESRGAN = action.payload; - }, - setShouldLoopback: (state, action: PayloadAction) => { - state.shouldLoopback = action.payload; + esrganModelNameChanged: (state, action: PayloadAction) => { + state.esrganModelName = action.payload; }, }, }); -export const { - resetPostprocessingState, - setCodeformerFidelity, - setFacetoolStrength, - setFacetoolType, - setHiresFix, - setHiresStrength, - setShouldLoopback, - setShouldRunESRGAN, - setShouldRunFacetool, - setUpscalingLevel, - setUpscalingDenoising, - setUpscalingStrength, -} = postprocessingSlice.actions; +export const { esrganModelNameChanged } = postprocessingSlice.actions; export default postprocessingSlice.reducer; diff --git a/invokeai/frontend/web/src/features/parameters/types/constants.ts b/invokeai/frontend/web/src/features/parameters/types/constants.ts new file mode 100644 index 0000000000..04917646d1 --- /dev/null +++ b/invokeai/frontend/web/src/features/parameters/types/constants.ts @@ -0,0 +1,6 @@ +export const MODEL_TYPE_MAP = { + 'sd-1': 'Stable Diffusion 1.x', + 'sd-2': 'Stable Diffusion 2.x', + sdxl: 'Stable Diffusion XL', + 'sdxl-refiner': 'Stable Diffusion XL Refiner', +}; diff --git a/invokeai/frontend/web/src/features/parameters/store/parameterZodSchemas.ts b/invokeai/frontend/web/src/features/parameters/types/parameterSchemas.ts similarity index 90% rename from invokeai/frontend/web/src/features/parameters/store/parameterZodSchemas.ts rename to invokeai/frontend/web/src/features/parameters/types/parameterSchemas.ts index 068f2bec2d..ae28f55c0f 100644 --- a/invokeai/frontend/web/src/features/parameters/store/parameterZodSchemas.ts +++ b/invokeai/frontend/web/src/features/parameters/types/parameterSchemas.ts @@ -126,7 +126,6 @@ export type HeightParam = z.infer; export const isValidHeight = (val: unknown): val is HeightParam => zHeight.safeParse(val).success; -const zBaseModel = z.enum(['sd-1', 'sd-2']); const zModelType = z.enum([ 'vae', 'lora', @@ -135,6 +134,7 @@ const zModelType = z.enum([ 'controlnet', 'embedding', ]); +const zBaseModel = z.enum(['sd-1', 'sd-2', 'sdxl', 'sdxl-refiner']); export type BaseModelParam = z.infer; @@ -143,7 +143,7 @@ export type BaseModelParam = z.infer; * TODO: Make this a dynamically generated enum? */ export const zMainModel = z.object({ - model_name: z.string(), + model_name: z.string().min(1), base_model: zBaseModel, model_type: zModelType, }); @@ -161,8 +161,7 @@ export const isValidMainModel = (val: unknown): val is MainModelParam => * Zod schema for VAE parameter */ export const zVaeModel = z.object({ - id: z.string(), - name: z.string(), + model_name: z.string().min(1), base_model: zBaseModel, }); /** @@ -178,8 +177,7 @@ export const isValidVaeModel = (val: unknown): val is VaeModelParam => * Zod schema for LoRA */ export const zLoRAModel = z.object({ - id: z.string(), - model_name: z.string(), + model_name: z.string().min(1), base_model: zBaseModel, }); /** @@ -191,6 +189,23 @@ export type LoRAModelParam = z.infer; */ export const isValidLoRAModel = (val: unknown): val is LoRAModelParam => zLoRAModel.safeParse(val).success; +/** + * Zod schema for ControlNet models + */ +export const zControlNetModel = z.object({ + model_name: z.string().min(1), + base_model: zBaseModel, +}); +/** + * Type alias for model parameter, inferred from its zod schema + */ +export type ControlNetModelParam = z.infer; +/** + * Validates/type-guards a value as a model parameter + */ +export const isValidControlNetModel = ( + val: unknown +): val is ControlNetModelParam => zControlNetModel.safeParse(val).success; /** * Zod schema for l2l strength parameter diff --git a/invokeai/frontend/web/src/features/parameters/util/modelIdToControlNetModelParam.ts b/invokeai/frontend/web/src/features/parameters/util/modelIdToControlNetModelParam.ts new file mode 100644 index 0000000000..c08bca0bbc --- /dev/null +++ b/invokeai/frontend/web/src/features/parameters/util/modelIdToControlNetModelParam.ts @@ -0,0 +1,30 @@ +import { log } from 'app/logging/useLogger'; +import { zControlNetModel } from 'features/parameters/types/parameterSchemas'; +import { ControlNetModelField } from 'services/api/types'; + +const moduleLog = log.child({ module: 'models' }); + +export const modelIdToControlNetModelParam = ( + controlNetModelId: string +): ControlNetModelField | undefined => { + const [base_model, model_type, model_name] = controlNetModelId.split('/'); + + const result = zControlNetModel.safeParse({ + base_model, + model_name, + }); + + if (!result.success) { + moduleLog.error( + { + controlNetModelId, + errors: result.error.format(), + }, + 'Failed to parse ControlNet model id' + ); + + return; + } + + return result.data; +}; diff --git a/invokeai/frontend/web/src/features/parameters/util/modelIdToLoRAModelParam.ts b/invokeai/frontend/web/src/features/parameters/util/modelIdToLoRAModelParam.ts new file mode 100644 index 0000000000..206246c79e --- /dev/null +++ b/invokeai/frontend/web/src/features/parameters/util/modelIdToLoRAModelParam.ts @@ -0,0 +1,28 @@ +import { LoRAModelParam, zLoRAModel } from '../types/parameterSchemas'; +import { log } from 'app/logging/useLogger'; + +const moduleLog = log.child({ module: 'models' }); + +export const modelIdToLoRAModelParam = ( + loraModelId: string +): LoRAModelParam | undefined => { + const [base_model, model_type, model_name] = loraModelId.split('/'); + + const result = zLoRAModel.safeParse({ + base_model, + model_name, + }); + + if (!result.success) { + moduleLog.error( + { + loraModelId, + errors: result.error.format(), + }, + 'Failed to parse LoRA model id' + ); + return; + } + + return result.data; +}; diff --git a/invokeai/frontend/web/src/features/parameters/util/modelIdToMainModelParam.ts b/invokeai/frontend/web/src/features/parameters/util/modelIdToMainModelParam.ts new file mode 100644 index 0000000000..70fb219bed --- /dev/null +++ b/invokeai/frontend/web/src/features/parameters/util/modelIdToMainModelParam.ts @@ -0,0 +1,31 @@ +import { + MainModelParam, + zMainModel, +} from 'features/parameters/types/parameterSchemas'; +import { log } from 'app/logging/useLogger'; + +const moduleLog = log.child({ module: 'models' }); + +export const modelIdToMainModelParam = ( + mainModelId: string +): MainModelParam | undefined => { + const [base_model, model_type, model_name] = mainModelId.split('/'); + + const result = zMainModel.safeParse({ + base_model, + model_name, + }); + + if (!result.success) { + moduleLog.error( + { + mainModelId, + errors: result.error.format(), + }, + 'Failed to parse main model id' + ); + return; + } + + return result.data; +}; diff --git a/invokeai/frontend/web/src/features/parameters/util/modelIdToVAEModelParam.ts b/invokeai/frontend/web/src/features/parameters/util/modelIdToVAEModelParam.ts new file mode 100644 index 0000000000..eb57d07f0e --- /dev/null +++ b/invokeai/frontend/web/src/features/parameters/util/modelIdToVAEModelParam.ts @@ -0,0 +1,28 @@ +import { VaeModelParam, zVaeModel } from '../types/parameterSchemas'; +import { log } from 'app/logging/useLogger'; + +const moduleLog = log.child({ module: 'models' }); + +export const modelIdToVAEModelParam = ( + vaeModelId: string +): VaeModelParam | undefined => { + const [base_model, model_type, model_name] = vaeModelId.split('/'); + + const result = zVaeModel.safeParse({ + base_model, + model_name, + }); + + if (!result.success) { + moduleLog.error( + { + vaeModelId, + errors: result.error.format(), + }, + 'Failed to parse VAE model id' + ); + return; + } + + return result.data; +}; diff --git a/invokeai/frontend/web/src/features/system/components/HotkeysModal/HotkeysModal.tsx b/invokeai/frontend/web/src/features/system/components/HotkeysModal/HotkeysModal.tsx index 4a7f4292eb..4da46fdac9 100644 --- a/invokeai/frontend/web/src/features/system/components/HotkeysModal/HotkeysModal.tsx +++ b/invokeai/frontend/web/src/features/system/components/HotkeysModal/HotkeysModal.tsx @@ -15,7 +15,7 @@ import { ModalOverlay, useDisclosure, } from '@chakra-ui/react'; -import { cloneElement, ReactElement } from 'react'; +import { ReactElement, cloneElement } from 'react'; import { useTranslation } from 'react-i18next'; import HotkeysModalItem from './HotkeysModalItem'; @@ -65,11 +65,6 @@ export default function HotkeysModal({ children }: HotkeysModalProps) { desc: t('hotkeys.pinOptions.desc'), hotkey: 'Shift+O', }, - { - title: t('hotkeys.toggleViewer.title'), - desc: t('hotkeys.toggleViewer.desc'), - hotkey: 'Z', - }, { title: t('hotkeys.toggleGallery.title'), desc: t('hotkeys.toggleGallery.desc'), @@ -85,12 +80,6 @@ export default function HotkeysModal({ children }: HotkeysModalProps) { desc: t('hotkeys.changeTabs.desc'), hotkey: '1-5', }, - - { - title: t('hotkeys.consoleToggle.title'), - desc: t('hotkeys.consoleToggle.desc'), - hotkey: '`', - }, ]; const generalHotkeys = [ @@ -109,11 +98,6 @@ export default function HotkeysModal({ children }: HotkeysModalProps) { desc: t('hotkeys.setParameters.desc'), hotkey: 'A', }, - { - title: t('hotkeys.restoreFaces.title'), - desc: t('hotkeys.restoreFaces.desc'), - hotkey: 'Shift+R', - }, { title: t('hotkeys.upscale.title'), desc: t('hotkeys.upscale.desc'), diff --git a/invokeai/frontend/web/src/features/system/components/InvokeAILogoComponent.tsx b/invokeai/frontend/web/src/features/system/components/InvokeAILogoComponent.tsx index 71a711386f..aa4a3dfdfc 100644 --- a/invokeai/frontend/web/src/features/system/components/InvokeAILogoComponent.tsx +++ b/invokeai/frontend/web/src/features/system/components/InvokeAILogoComponent.tsx @@ -5,7 +5,11 @@ import { useRef } from 'react'; import { useHoverDirty } from 'react-use'; import { useGetAppVersionQuery } from 'services/api/endpoints/appInfo'; -const InvokeAILogoComponent = () => { +interface Props { + showVersion?: boolean; +} + +const InvokeAILogoComponent = ({ showVersion = true }: Props) => { const { data: appVersion } = useGetAppVersionQuery(); const ref = useRef(null); const isHovered = useHoverDirty(ref); @@ -28,7 +32,7 @@ const InvokeAILogoComponent = () => { invoke ai - {isHovered && appVersion && ( + {showVersion && isHovered && appVersion && ( { > - {t('common.settingsLabel')} + {t('common.settingsLabel')} @@ -331,12 +331,15 @@ export default SettingsModal; const StyledFlex = (props: PropsWithChildren) => { return ( {props.children} diff --git a/invokeai/frontend/web/src/features/system/components/SettingsModal/SettingsSchedulers.tsx b/invokeai/frontend/web/src/features/system/components/SettingsModal/SettingsSchedulers.tsx index 26c11604e1..959559548e 100644 --- a/invokeai/frontend/web/src/features/system/components/SettingsModal/SettingsSchedulers.tsx +++ b/invokeai/frontend/web/src/features/system/components/SettingsModal/SettingsSchedulers.tsx @@ -2,7 +2,7 @@ import { SCHEDULER_LABEL_MAP, SCHEDULER_NAMES } from 'app/constants'; import { RootState } from 'app/store/store'; import { useAppDispatch, useAppSelector } from 'app/store/storeHooks'; import IAIMantineMultiSelect from 'common/components/IAIMantineMultiSelect'; -import { SchedulerParam } from 'features/parameters/store/parameterZodSchemas'; +import { SchedulerParam } from 'features/parameters/types/parameterSchemas'; import { favoriteSchedulersChanged } from 'features/ui/store/uiSlice'; import { map } from 'lodash-es'; import { useCallback } from 'react'; diff --git a/invokeai/frontend/web/src/features/system/components/VAESelect.tsx b/invokeai/frontend/web/src/features/system/components/VAESelect.tsx deleted file mode 100644 index bed1b72123..0000000000 --- a/invokeai/frontend/web/src/features/system/components/VAESelect.tsx +++ /dev/null @@ -1,112 +0,0 @@ -import { memo, useCallback, useEffect, useMemo } from 'react'; -import { useTranslation } from 'react-i18next'; - -import { useAppDispatch, useAppSelector } from 'app/store/storeHooks'; -import IAIMantineSelect from 'common/components/IAIMantineSelect'; - -import { SelectItem } from '@mantine/core'; -import { forEach } from 'lodash-es'; -import { useGetVaeModelsQuery } from 'services/api/endpoints/models'; - -import { RootState } from 'app/store/store'; -import IAIMantineSelectItemWithTooltip from 'common/components/IAIMantineSelectItemWithTooltip'; -import { vaeSelected } from 'features/parameters/store/generationSlice'; -import { zVaeModel } from 'features/parameters/store/parameterZodSchemas'; -import { MODEL_TYPE_MAP } from './ModelSelect'; - -const VAESelect = () => { - const dispatch = useAppDispatch(); - const { t } = useTranslation(); - - const { data: vaeModels } = useGetVaeModelsQuery(); - - const currentMainModel = useAppSelector( - (state: RootState) => state.generation.model - ); - - const selectedVae = useAppSelector( - (state: RootState) => state.generation.vae - ); - - const data = useMemo(() => { - if (!vaeModels) { - return []; - } - - const data: SelectItem[] = [ - { - value: 'default', - label: 'Default', - group: 'Default', - }, - ]; - - forEach(vaeModels.entities, (model, id) => { - if (!model) { - return; - } - - const disabled = currentMainModel?.base_model !== model.base_model; - - data.push({ - value: id, - label: model.model_name, - group: MODEL_TYPE_MAP[model.base_model], - disabled, - tooltip: disabled - ? `Incompatible base model: ${model.base_model}` - : undefined, - }); - }); - - return data.sort((a, b) => (a.disabled && !b.disabled ? 1 : -1)); - }, [vaeModels, currentMainModel?.base_model]); - - const selectedVaeModel = useMemo( - () => (selectedVae?.id ? vaeModels?.entities[selectedVae?.id] : null), - [vaeModels?.entities, selectedVae] - ); - - const handleChangeModel = useCallback( - (v: string | null) => { - if (!v || v === 'default') { - dispatch(vaeSelected(null)); - return; - } - - const [base_model, type, name] = v.split('/'); - - const model = zVaeModel.parse({ - id: v, - name, - base_model, - }); - - dispatch(vaeSelected(model)); - }, - [dispatch] - ); - - useEffect(() => { - if (selectedVae && vaeModels?.ids.includes(selectedVae.id)) { - return; - } - dispatch(vaeSelected(null)); - }, [handleChangeModel, vaeModels?.ids, selectedVae, dispatch]); - - return ( - - ); -}; - -export default memo(VAESelect); diff --git a/invokeai/frontend/web/src/features/system/store/configSlice.ts b/invokeai/frontend/web/src/features/system/store/configSlice.ts index c69d596b78..6cff92a136 100644 --- a/invokeai/frontend/web/src/features/system/store/configSlice.ts +++ b/invokeai/frontend/web/src/features/system/store/configSlice.ts @@ -6,7 +6,7 @@ import { merge } from 'lodash-es'; export const initialConfigState: AppConfig = { shouldUpdateImagesOnConnect: false, disabledTabs: [], - disabledFeatures: ['lightbox', 'faceRestore'], + disabledFeatures: ['lightbox', 'faceRestore', 'batches'], disabledSDFeatures: [ 'variation', 'seamless', diff --git a/invokeai/frontend/web/src/features/system/store/systemPersistDenylist.ts b/invokeai/frontend/web/src/features/system/store/systemPersistDenylist.ts index c2481c29df..bba279c4bc 100644 --- a/invokeai/frontend/web/src/features/system/store/systemPersistDenylist.ts +++ b/invokeai/frontend/web/src/features/system/store/systemPersistDenylist.ts @@ -13,7 +13,6 @@ export const systemPersistDenylist: (keyof SystemState)[] = [ 'isProcessing', 'totalIterations', 'totalSteps', - 'openModel', 'isCancelScheduled', 'progressImage', 'wereModelsReceived', diff --git a/invokeai/frontend/web/src/features/system/store/systemSelectors.ts b/invokeai/frontend/web/src/features/system/store/systemSelectors.ts index e280210069..0d53da85e6 100644 --- a/invokeai/frontend/web/src/features/system/store/systemSelectors.ts +++ b/invokeai/frontend/web/src/features/system/store/systemSelectors.ts @@ -1,7 +1,7 @@ import { createSelector } from '@reduxjs/toolkit'; import { RootState } from 'app/store/store'; import { defaultSelectorOptions } from 'app/store/util/defaultMemoizeOptions'; -import { reduce, pickBy } from 'lodash-es'; +import { pickBy, reduce } from 'lodash-es'; export const systemSelector = (state: RootState) => state.system; @@ -50,3 +50,8 @@ export const languageSelector = createSelector( export const isProcessingSelector = (state: RootState) => state.system.isProcessing; + +export const selectIsBusy = createSelector( + (state: RootState) => state, + (state) => state.system.isProcessing || !state.system.isConnected +); diff --git a/invokeai/frontend/web/src/features/system/store/systemSlice.ts b/invokeai/frontend/web/src/features/system/store/systemSlice.ts index 01c1344263..875ae7a693 100644 --- a/invokeai/frontend/web/src/features/system/store/systemSlice.ts +++ b/invokeai/frontend/web/src/features/system/store/systemSlice.ts @@ -1,11 +1,10 @@ import { UseToastOptions } from '@chakra-ui/react'; import { PayloadAction, createSlice } from '@reduxjs/toolkit'; -import * as InvokeAI from 'app/types/invokeai'; import { InvokeLogLevel } from 'app/logging/useLogger'; import { userInvoked } from 'app/store/actions'; import { nodeTemplatesBuilt } from 'features/nodes/store/nodesSlice'; -import { TFuncKey, t } from 'i18next'; +import { t } from 'i18next'; import { LogLevelName } from 'roarr'; import { imageUploaded } from 'services/api/thunks/image'; import { @@ -44,9 +43,6 @@ export interface SystemState { isCancelable: boolean; enableImageDebugging: boolean; toastQueue: UseToastOptions[]; - searchFolder: string | null; - foundModels: InvokeAI.FoundModel[] | null; - openModel: string | null; /** * The current progress image */ @@ -80,7 +76,7 @@ export interface SystemState { */ consoleLogLevel: InvokeLogLevel; shouldLogToConsole: boolean; - statusTranslationKey: TFuncKey; + statusTranslationKey: any; /** * When a session is canceled, its ID is stored here until a new session is created. */ @@ -107,9 +103,6 @@ export const initialSystemState: SystemState = { isCancelable: true, enableImageDebugging: false, toastQueue: [], - searchFolder: null, - foundModels: null, - openModel: null, progressImage: null, shouldAntialiasProgressImage: false, sessionId: null, @@ -134,7 +127,7 @@ export const systemSlice = createSlice({ setIsProcessing: (state, action: PayloadAction) => { state.isProcessing = action.payload; }, - setCurrentStatus: (state, action: PayloadAction) => { + setCurrentStatus: (state, action: any) => { state.statusTranslationKey = action.payload; }, setShouldConfirmOnDelete: (state, action: PayloadAction) => { @@ -155,18 +148,6 @@ export const systemSlice = createSlice({ clearToastQueue: (state) => { state.toastQueue = []; }, - setSearchFolder: (state, action: PayloadAction) => { - state.searchFolder = action.payload; - }, - setFoundModels: ( - state, - action: PayloadAction - ) => { - state.foundModels = action.payload; - }, - setOpenModel: (state, action: PayloadAction) => { - state.openModel = action.payload; - }, /** * A cancel was scheduled */ @@ -431,9 +412,6 @@ export const { setEnableImageDebugging, addToast, clearToastQueue, - setSearchFolder, - setFoundModels, - setOpenModel, cancelScheduled, scheduledCancelAborted, cancelTypeChanged, diff --git a/invokeai/frontend/web/src/features/ui/components/InvokeTabs.tsx b/invokeai/frontend/web/src/features/ui/components/InvokeTabs.tsx index ef168285ee..a4e0773695 100644 --- a/invokeai/frontend/web/src/features/ui/components/InvokeTabs.tsx +++ b/invokeai/frontend/web/src/features/ui/components/InvokeTabs.tsx @@ -15,7 +15,6 @@ import { RootState } from 'app/store/store'; import { useAppDispatch, useAppSelector } from 'app/store/storeHooks'; import { requestCanvasRescale } from 'features/canvas/store/thunks/requestCanvasScale'; import ImageGalleryContent from 'features/gallery/components/ImageGalleryContent'; -import { setIsLightboxOpen } from 'features/lightbox/store/lightboxSlice'; import { configSelector } from 'features/system/store/configSelectors'; import { InvokeTabName } from 'features/ui/store/tabMap'; import { setActiveTab, togglePanels } from 'features/ui/store/uiSlice'; @@ -38,7 +37,6 @@ import NodesTab from './tabs/Nodes/NodesTab'; import ResizeHandle from './tabs/ResizeHandle'; import TextToImageTab from './tabs/TextToImage/TextToImageTab'; import UnifiedCanvasTab from './tabs/UnifiedCanvas/UnifiedCanvasTab'; -import { useFeatureStatus } from '../../system/hooks/useFeatureStatus'; export interface InvokeTabInfo { id: InvokeTabName; @@ -105,10 +103,6 @@ const InvokeTabs = () => { const activeTab = useAppSelector(activeTabIndexSelector); const activeTabName = useAppSelector(activeTabNameSelector); const enabledTabs = useAppSelector(enabledTabsSelector); - const isLightBoxOpen = useAppSelector( - (state: RootState) => state.lightbox.isLightboxOpen - ); - const isLightboxEnabled = useFeatureStatus('lightbox').isFeatureEnabled; const { shouldPinGallery, shouldPinParametersPanel, shouldShowGallery } = useAppSelector((state: RootState) => state.ui); @@ -117,17 +111,6 @@ const InvokeTabs = () => { const dispatch = useAppDispatch(); - // Lightbox Hotkey - useHotkeys( - 'z', - () => { - if (isLightboxEnabled) { - dispatch(setIsLightboxOpen(!isLightBoxOpen)); - } - }, - [isLightBoxOpen] - ); - useHotkeys( 'f', () => { diff --git a/invokeai/frontend/web/src/features/ui/components/ParametersDrawer.tsx b/invokeai/frontend/web/src/features/ui/components/ParametersDrawer.tsx index 0777463ec4..ee9cc4bbb8 100644 --- a/invokeai/frontend/web/src/features/ui/components/ParametersDrawer.tsx +++ b/invokeai/frontend/web/src/features/ui/components/ParametersDrawer.tsx @@ -2,7 +2,6 @@ import { Flex } from '@chakra-ui/react'; import { createSelector } from '@reduxjs/toolkit'; import { useAppDispatch, useAppSelector } from 'app/store/storeHooks'; import { defaultSelectorOptions } from 'app/store/util/defaultMemoizeOptions'; -import { lightboxSelector } from 'features/lightbox/store/lightboxSelectors'; import InvokeAILogoComponent from 'features/system/components/InvokeAILogoComponent'; import { activeTabNameSelector, @@ -12,19 +11,16 @@ import { setShouldShowParametersPanel } from 'features/ui/store/uiSlice'; import { memo, useMemo } from 'react'; import { PARAMETERS_PANEL_WIDTH } from 'theme/util/constants'; import PinParametersPanelButton from './PinParametersPanelButton'; -import OverlayScrollable from './common/OverlayScrollable'; import ResizableDrawer from './common/ResizableDrawer/ResizableDrawer'; import ImageToImageTabParameters from './tabs/ImageToImage/ImageToImageTabParameters'; import TextToImageTabParameters from './tabs/TextToImage/TextToImageTabParameters'; import UnifiedCanvasParameters from './tabs/UnifiedCanvas/UnifiedCanvasParameters'; const selector = createSelector( - [uiSelector, activeTabNameSelector, lightboxSelector], - (ui, activeTabName, lightbox) => { + [uiSelector, activeTabNameSelector], + (ui, activeTabName) => { const { shouldPinParametersPanel, shouldShowParametersPanel } = ui; - const { isLightboxOpen } = lightbox; - return { activeTabName, shouldPinParametersPanel, diff --git a/invokeai/frontend/web/src/features/ui/components/tabs/ImageToImage/ImageToImageTabParameters.tsx b/invokeai/frontend/web/src/features/ui/components/tabs/ImageToImage/ImageToImageTabParameters.tsx index 16c0f44158..87e19993d7 100644 --- a/invokeai/frontend/web/src/features/ui/components/tabs/ImageToImage/ImageToImageTabParameters.tsx +++ b/invokeai/frontend/web/src/features/ui/components/tabs/ImageToImage/ImageToImageTabParameters.tsx @@ -19,9 +19,9 @@ const ImageToImageTabParameters = () => { + - diff --git a/invokeai/frontend/web/src/features/ui/components/tabs/ModelManager/ModelManagerTab.tsx b/invokeai/frontend/web/src/features/ui/components/tabs/ModelManager/ModelManagerTab.tsx index 8d675b17c8..d397058795 100644 --- a/invokeai/frontend/web/src/features/ui/components/tabs/ModelManager/ModelManagerTab.tsx +++ b/invokeai/frontend/web/src/features/ui/components/tabs/ModelManager/ModelManagerTab.tsx @@ -1,11 +1,11 @@ import { Tab, TabList, TabPanel, TabPanels, Tabs } from '@chakra-ui/react'; import i18n from 'i18n'; import { ReactNode, memo } from 'react'; -import AddModelsPanel from './subpanels/AddModelsPanel'; +import ImportModelsPanel from './subpanels/ImportModelsPanel'; import MergeModelsPanel from './subpanels/MergeModelsPanel'; import ModelManagerPanel from './subpanels/ModelManagerPanel'; -type ModelManagerTabName = 'modelManager' | 'addModels' | 'mergeModels'; +type ModelManagerTabName = 'modelManager' | 'importModels' | 'mergeModels'; type ModelManagerTabInfo = { id: ModelManagerTabName; @@ -13,16 +13,16 @@ type ModelManagerTabInfo = { content: ReactNode; }; -const modelManagerTabs: ModelManagerTabInfo[] = [ +const tabs: ModelManagerTabInfo[] = [ { id: 'modelManager', label: i18n.t('modelManager.modelManager'), content: , }, { - id: 'addModels', - label: i18n.t('modelManager.addModel'), - content: , + id: 'importModels', + label: i18n.t('modelManager.importModels'), + content: , }, { id: 'mergeModels', @@ -31,49 +31,28 @@ const modelManagerTabs: ModelManagerTabInfo[] = [ }, ]; -const renderTabsList = () => { - const modelManagerTabListsToRender: ReactNode[] = []; - modelManagerTabs.forEach((modelManagerTab) => { - modelManagerTabListsToRender.push( - {modelManagerTab.label} - ); - }); - - return ( - - {modelManagerTabListsToRender} - - ); -}; - -const renderTabPanels = () => { - const modelManagerTabPanelsToRender: ReactNode[] = []; - modelManagerTabs.forEach((modelManagerTab) => { - modelManagerTabPanelsToRender.push( - {modelManagerTab.content} - ); - }); - - return {modelManagerTabPanelsToRender}; -}; - const ModelManagerTab = () => { return ( - {renderTabsList()} - {renderTabPanels()} + + {tabs.map((tab) => ( + + {tab.label} + + ))} + + + {tabs.map((tab) => ( + + {tab.content} + + ))} + ); }; diff --git a/invokeai/frontend/web/src/features/ui/components/tabs/ModelManager/store/modelManagerSlice.ts b/invokeai/frontend/web/src/features/ui/components/tabs/ModelManager/store/modelManagerSlice.ts new file mode 100644 index 0000000000..30f0c5c41b --- /dev/null +++ b/invokeai/frontend/web/src/features/ui/components/tabs/ModelManager/store/modelManagerSlice.ts @@ -0,0 +1,29 @@ +import { PayloadAction, createSlice } from '@reduxjs/toolkit'; + +type ModelManagerState = { + searchFolder: string | null; + advancedAddScanModel: string | null; +}; + +const initialModelManagerState: ModelManagerState = { + searchFolder: null, + advancedAddScanModel: null, +}; + +export const modelManagerSlice = createSlice({ + name: 'modelmanager', + initialState: initialModelManagerState, + reducers: { + setSearchFolder: (state, action: PayloadAction) => { + state.searchFolder = action.payload; + }, + setAdvancedAddScanModel: (state, action: PayloadAction) => { + state.advancedAddScanModel = action.payload; + }, + }, +}); + +export const { setSearchFolder, setAdvancedAddScanModel } = + modelManagerSlice.actions; + +export default modelManagerSlice.reducer; diff --git a/invokeai/frontend/web/src/features/ui/components/tabs/ModelManager/store/modelmanagerSelectors.tsx b/invokeai/frontend/web/src/features/ui/components/tabs/ModelManager/store/modelmanagerSelectors.tsx new file mode 100644 index 0000000000..593282760a --- /dev/null +++ b/invokeai/frontend/web/src/features/ui/components/tabs/ModelManager/store/modelmanagerSelectors.tsx @@ -0,0 +1,3 @@ +import { RootState } from 'app/store/store'; + +export const modelmanagerSelector = (state: RootState) => state.modelmanager; diff --git a/invokeai/frontend/web/src/features/ui/components/tabs/ModelManager/subpanels/AddModelsPanel.tsx b/invokeai/frontend/web/src/features/ui/components/tabs/ModelManager/subpanels/AddModelsPanel.tsx deleted file mode 100644 index 25f4adf4aa..0000000000 --- a/invokeai/frontend/web/src/features/ui/components/tabs/ModelManager/subpanels/AddModelsPanel.tsx +++ /dev/null @@ -1,55 +0,0 @@ -import { Divider, Flex } from '@chakra-ui/react'; -import { RootState } from 'app/store/store'; -import { useAppDispatch, useAppSelector } from 'app/store/storeHooks'; -import IAIButton from 'common/components/IAIButton'; -import { setAddNewModelUIOption } from 'features/ui/store/uiSlice'; -import { useTranslation } from 'react-i18next'; -import AddCheckpointModel from './AddModelsPanel/AddCheckpointModel'; -import AddDiffusersModel from './AddModelsPanel/AddDiffusersModel'; - -export default function AddModelsPanel() { - const addNewModelUIOption = useAppSelector( - (state: RootState) => state.ui.addNewModelUIOption - ); - - const dispatch = useAppDispatch(); - const { t } = useTranslation(); - - return ( - - - dispatch(setAddNewModelUIOption('ckpt'))} - sx={{ - backgroundColor: - addNewModelUIOption == 'ckpt' ? 'accent.700' : 'base.700', - '&:hover': { - backgroundColor: - addNewModelUIOption == 'ckpt' ? 'accent.700' : 'base.600', - }, - }} - > - {t('modelManager.addCheckpointModel')} - - dispatch(setAddNewModelUIOption('diffusers'))} - sx={{ - backgroundColor: - addNewModelUIOption == 'diffusers' ? 'accent.700' : 'base.700', - '&:hover': { - backgroundColor: - addNewModelUIOption == 'diffusers' ? 'accent.700' : 'base.600', - }, - }} - > - {t('modelManager.addDiffuserModel')} - - - - - - {addNewModelUIOption == 'ckpt' && } - {addNewModelUIOption == 'diffusers' && } - - ); -} diff --git a/invokeai/frontend/web/src/features/ui/components/tabs/ModelManager/subpanels/AddModelsPanel/AddCheckpointModel.tsx b/invokeai/frontend/web/src/features/ui/components/tabs/ModelManager/subpanels/AddModelsPanel/AddCheckpointModel.tsx deleted file mode 100644 index 75e2017bb8..0000000000 --- a/invokeai/frontend/web/src/features/ui/components/tabs/ModelManager/subpanels/AddModelsPanel/AddCheckpointModel.tsx +++ /dev/null @@ -1,337 +0,0 @@ -import { - Flex, - FormControl, - FormErrorMessage, - FormHelperText, - FormLabel, - HStack, - Text, - VStack, -} from '@chakra-ui/react'; - -import IAIButton from 'common/components/IAIButton'; -import IAIInput from 'common/components/IAIInput'; -import IAINumberInput from 'common/components/IAINumberInput'; -import IAISimpleCheckbox from 'common/components/IAISimpleCheckbox'; -import React from 'react'; - -// import { addNewModel } from 'app/socketio/actions'; - -import { useAppDispatch, useAppSelector } from 'app/store/storeHooks'; - -import { Field, Formik } from 'formik'; -import { useTranslation } from 'react-i18next'; - -import type { RootState } from 'app/store/store'; -import type { InvokeModelConfigProps } from 'app/types/invokeai'; -import IAIForm from 'common/components/IAIForm'; -import { IAIFormItemWrapper } from 'common/components/IAIForms/IAIFormItemWrapper'; -import { setAddNewModelUIOption } from 'features/ui/store/uiSlice'; -import type { FieldInputProps, FormikProps } from 'formik'; -import SearchModels from './SearchModels'; - -const MIN_MODEL_SIZE = 64; -const MAX_MODEL_SIZE = 2048; - -export default function AddCheckpointModel() { - const dispatch = useAppDispatch(); - const { t } = useTranslation(); - - const isProcessing = useAppSelector( - (state: RootState) => state.system.isProcessing - ); - - function hasWhiteSpace(s: string) { - return /\s/.test(s); - } - - function baseValidation(value: string) { - let error; - if (hasWhiteSpace(value)) error = t('modelManager.cannotUseSpaces'); - return error; - } - - const addModelFormValues: InvokeModelConfigProps = { - name: '', - description: '', - config: 'configs/stable-diffusion/v1-inference.yaml', - weights: '', - vae: '', - width: 512, - height: 512, - format: 'ckpt', - default: false, - }; - - const addModelFormSubmitHandler = (values: InvokeModelConfigProps) => { - dispatch(addNewModel(values)); - dispatch(setAddNewModelUIOption(null)); - }; - - const [addManually, setAddmanually] = React.useState(false); - - return ( - - - setAddmanually(!addManually)} - /> - setAddmanually(!addManually)} - /> - - - {addManually ? ( - - {({ handleSubmit, errors, touched }) => ( - - - - {t('modelManager.manual')} - - {/* Name */} - - - - {t('modelManager.name')} - - - - {!!errors.name && touched.name ? ( - {errors.name} - ) : ( - - {t('modelManager.nameValidationMsg')} - - )} - - - - - {/* Description */} - - - - {t('modelManager.description')} - - - - {!!errors.description && touched.description ? ( - - {errors.description} - - ) : ( - - {t('modelManager.descriptionValidationMsg')} - - )} - - - - - {/* Config */} - - - - {t('modelManager.config')} - - - - {!!errors.config && touched.config ? ( - {errors.config} - ) : ( - - {t('modelManager.configValidationMsg')} - - )} - - - - - {/* Weights */} - - - - {t('modelManager.modelLocation')} - - - - {!!errors.weights && touched.weights ? ( - {errors.weights} - ) : ( - - {t('modelManager.modelLocationValidationMsg')} - - )} - - - - - {/* VAE */} - - - - {t('modelManager.vaeLocation')} - - - - {!!errors.vae && touched.vae ? ( - {errors.vae} - ) : ( - - {t('modelManager.vaeLocationValidationMsg')} - - )} - - - - - - {/* Width */} - - - - {t('modelManager.width')} - - - - {({ - field, - form, - }: { - field: FieldInputProps; - form: FormikProps; - }) => ( - - form.setFieldValue(field.name, Number(value)) - } - /> - )} - - - {!!errors.width && touched.width ? ( - {errors.width} - ) : ( - - {t('modelManager.widthValidationMsg')} - - )} - - - - - {/* Height */} - - - - {t('modelManager.height')} - - - - {({ - field, - form, - }: { - field: FieldInputProps; - form: FormikProps; - }) => ( - - form.setFieldValue(field.name, Number(value)) - } - /> - )} - - - {!!errors.height && touched.height ? ( - {errors.height} - ) : ( - - {t('modelManager.heightValidationMsg')} - - )} - - - - - - - {t('modelManager.addModel')} - - - - )} - - ) : ( - - )} - - ); -} diff --git a/invokeai/frontend/web/src/features/ui/components/tabs/ModelManager/subpanels/AddModelsPanel/AddDiffusersModel.tsx b/invokeai/frontend/web/src/features/ui/components/tabs/ModelManager/subpanels/AddModelsPanel/AddDiffusersModel.tsx deleted file mode 100644 index dd491828da..0000000000 --- a/invokeai/frontend/web/src/features/ui/components/tabs/ModelManager/subpanels/AddModelsPanel/AddDiffusersModel.tsx +++ /dev/null @@ -1,270 +0,0 @@ -import { - Flex, - FormControl, - FormErrorMessage, - FormHelperText, - FormLabel, - Text, - VStack, -} from '@chakra-ui/react'; -import { InvokeDiffusersModelConfigProps } from 'app/types/invokeai'; -// import { addNewModel } from 'app/socketio/actions'; -import { useAppDispatch, useAppSelector } from 'app/store/storeHooks'; -import IAIButton from 'common/components/IAIButton'; -import IAIInput from 'common/components/IAIInput'; -import { setAddNewModelUIOption } from 'features/ui/store/uiSlice'; -import { Field, Formik } from 'formik'; -import { useTranslation } from 'react-i18next'; - -import type { RootState } from 'app/store/store'; -import IAIForm from 'common/components/IAIForm'; -import { IAIFormItemWrapper } from 'common/components/IAIForms/IAIFormItemWrapper'; - -export default function AddDiffusersModel() { - const dispatch = useAppDispatch(); - const { t } = useTranslation(); - - const isProcessing = useAppSelector( - (state: RootState) => state.system.isProcessing - ); - - function hasWhiteSpace(s: string) { - return /\s/.test(s); - } - - function baseValidation(value: string) { - let error; - if (hasWhiteSpace(value)) error = t('modelManager.cannotUseSpaces'); - return error; - } - - const addModelFormValues: InvokeDiffusersModelConfigProps = { - name: '', - description: '', - repo_id: '', - path: '', - format: 'diffusers', - default: false, - vae: { - repo_id: '', - path: '', - }, - }; - - const addModelFormSubmitHandler = ( - values: InvokeDiffusersModelConfigProps - ) => { - const diffusersModelToAdd = values; - - if (values.path === '') delete diffusersModelToAdd.path; - if (values.repo_id === '') delete diffusersModelToAdd.repo_id; - if (values.vae.path === '') delete diffusersModelToAdd.vae.path; - if (values.vae.repo_id === '') delete diffusersModelToAdd.vae.repo_id; - - dispatch(addNewModel(diffusersModelToAdd)); - dispatch(setAddNewModelUIOption(null)); - }; - - return ( - - - {({ handleSubmit, errors, touched }) => ( - - - - {/* Name */} - - - {t('modelManager.name')} - - - - {!!errors.name && touched.name ? ( - {errors.name} - ) : ( - - {t('modelManager.nameValidationMsg')} - - )} - - - - - - {/* Description */} - - - {t('modelManager.description')} - - - - {!!errors.description && touched.description ? ( - {errors.description} - ) : ( - - {t('modelManager.descriptionValidationMsg')} - - )} - - - - - - - {t('modelManager.formMessageDiffusersModelLocation')} - - - {t('modelManager.formMessageDiffusersModelLocationDesc')} - - - {/* Path */} - - - {t('modelManager.modelLocation')} - - - - {!!errors.path && touched.path ? ( - {errors.path} - ) : ( - - {t('modelManager.modelLocationValidationMsg')} - - )} - - - - {/* Repo ID */} - - - {t('modelManager.repo_id')} - - - - {!!errors.repo_id && touched.repo_id ? ( - {errors.repo_id} - ) : ( - - {t('modelManager.repoIDValidationMsg')} - - )} - - - - - - {/* VAE Path */} - - {t('modelManager.formMessageDiffusersVAELocation')} - - - {t('modelManager.formMessageDiffusersVAELocationDesc')} - - - - {t('modelManager.vaeLocation')} - - - - {!!errors.vae?.path && touched.vae?.path ? ( - {errors.vae?.path} - ) : ( - - {t('modelManager.vaeLocationValidationMsg')} - - )} - - - - {/* VAE Repo ID */} - - - {t('modelManager.vaeRepoID')} - - - - {!!errors.vae?.repo_id && touched.vae?.repo_id ? ( - {errors.vae?.repo_id} - ) : ( - - {t('modelManager.vaeRepoIDValidationMsg')} - - )} - - - - - - {t('modelManager.addModel')} - - - - )} - - - ); -} diff --git a/invokeai/frontend/web/src/features/ui/components/tabs/ModelManager/subpanels/AddModelsPanel/AddModels.tsx b/invokeai/frontend/web/src/features/ui/components/tabs/ModelManager/subpanels/AddModelsPanel/AddModels.tsx new file mode 100644 index 0000000000..0fa46ec57f --- /dev/null +++ b/invokeai/frontend/web/src/features/ui/components/tabs/ModelManager/subpanels/AddModelsPanel/AddModels.tsx @@ -0,0 +1,48 @@ +import { ButtonGroup, Flex } from '@chakra-ui/react'; +import IAIButton from 'common/components/IAIButton'; +import { useState } from 'react'; +import AdvancedAddModels from './AdvancedAddModels'; +import SimpleAddModels from './SimpleAddModels'; + +export default function AddModels() { + const [addModelMode, setAddModelMode] = useState<'simple' | 'advanced'>( + 'simple' + ); + return ( + + + setAddModelMode('simple')} + > + Simple + + setAddModelMode('advanced')} + > + Advanced + + + + {addModelMode === 'simple' && } + {addModelMode === 'advanced' && } + + + ); +} diff --git a/invokeai/frontend/web/src/features/ui/components/tabs/ModelManager/subpanels/AddModelsPanel/AdvancedAddCheckpoint.tsx b/invokeai/frontend/web/src/features/ui/components/tabs/ModelManager/subpanels/AddModelsPanel/AdvancedAddCheckpoint.tsx new file mode 100644 index 0000000000..ededadaa06 --- /dev/null +++ b/invokeai/frontend/web/src/features/ui/components/tabs/ModelManager/subpanels/AddModelsPanel/AdvancedAddCheckpoint.tsx @@ -0,0 +1,143 @@ +import { Flex } from '@chakra-ui/react'; +import { useForm } from '@mantine/form'; +import { makeToast } from 'app/components/Toaster'; +import { useAppDispatch } from 'app/store/storeHooks'; +import IAIButton from 'common/components/IAIButton'; +import IAIMantineTextInput from 'common/components/IAIMantineInput'; +import IAISimpleCheckbox from 'common/components/IAISimpleCheckbox'; +import { addToast } from 'features/system/store/systemSlice'; +import { useState } from 'react'; +import { useTranslation } from 'react-i18next'; +import { useAddMainModelsMutation } from 'services/api/endpoints/models'; +import { CheckpointModelConfig } from 'services/api/types'; +import { setAdvancedAddScanModel } from '../../store/modelManagerSlice'; +import BaseModelSelect from '../shared/BaseModelSelect'; +import CheckpointConfigsSelect from '../shared/CheckpointConfigsSelect'; +import ModelVariantSelect from '../shared/ModelVariantSelect'; + +type AdvancedAddCheckpointProps = { + model_path?: string; +}; + +export default function AdvancedAddCheckpoint( + props: AdvancedAddCheckpointProps +) { + const { t } = useTranslation(); + const dispatch = useAppDispatch(); + const { model_path } = props; + + const advancedAddCheckpointForm = useForm({ + initialValues: { + model_name: model_path + ? model_path.split('\\').splice(-1)[0].split('.')[0] + : '', + base_model: 'sd-1', + model_type: 'main', + path: model_path ? model_path : '', + description: '', + model_format: 'checkpoint', + error: undefined, + vae: '', + variant: 'normal', + config: 'configs\\stable-diffusion\\v1-inference.yaml', + }, + }); + + const [addMainModel] = useAddMainModelsMutation(); + + const [useCustomConfig, setUseCustomConfig] = useState(false); + + const advancedAddCheckpointFormHandler = (values: CheckpointModelConfig) => { + addMainModel({ + body: values, + }) + .unwrap() + .then((_) => { + dispatch( + addToast( + makeToast({ + title: `Model Added: ${values.model_name}`, + status: 'success', + }) + ) + ); + advancedAddCheckpointForm.reset(); + + // Close Advanced Panel in Scan Models tab + if (model_path) { + dispatch(setAdvancedAddScanModel(null)); + } + }) + .catch((error) => { + if (error) { + dispatch( + addToast( + makeToast({ + title: 'Model Add Failed', + status: 'error', + }) + ) + ); + } + }); + }; + + return ( +
+ advancedAddCheckpointFormHandler(v) + )} + style={{ width: '100%' }} + > + + + + + + + + + {!useCustomConfig ? ( + + ) : ( + + )} + setUseCustomConfig(!useCustomConfig)} + label="Use Custom Config" + /> + + {t('modelManager.addModel')} + + + +
+ ); +} diff --git a/invokeai/frontend/web/src/features/ui/components/tabs/ModelManager/subpanels/AddModelsPanel/AdvancedAddDiffusers.tsx b/invokeai/frontend/web/src/features/ui/components/tabs/ModelManager/subpanels/AddModelsPanel/AdvancedAddDiffusers.tsx new file mode 100644 index 0000000000..ce8da9289b --- /dev/null +++ b/invokeai/frontend/web/src/features/ui/components/tabs/ModelManager/subpanels/AddModelsPanel/AdvancedAddDiffusers.tsx @@ -0,0 +1,113 @@ +import { Flex } from '@chakra-ui/react'; +import { useForm } from '@mantine/form'; +import { makeToast } from 'app/components/Toaster'; +import { useAppDispatch } from 'app/store/storeHooks'; +import IAIButton from 'common/components/IAIButton'; +import IAIMantineTextInput from 'common/components/IAIMantineInput'; +import { addToast } from 'features/system/store/systemSlice'; +import { useTranslation } from 'react-i18next'; +import { useAddMainModelsMutation } from 'services/api/endpoints/models'; +import { DiffusersModelConfig } from 'services/api/types'; +import { setAdvancedAddScanModel } from '../../store/modelManagerSlice'; +import BaseModelSelect from '../shared/BaseModelSelect'; +import ModelVariantSelect from '../shared/ModelVariantSelect'; + +type AdvancedAddDiffusersProps = { + model_path?: string; +}; + +export default function AdvancedAddDiffusers(props: AdvancedAddDiffusersProps) { + const { t } = useTranslation(); + const dispatch = useAppDispatch(); + const { model_path } = props; + + const [addMainModel] = useAddMainModelsMutation(); + + const advancedAddDiffusersForm = useForm({ + initialValues: { + model_name: model_path ? model_path.split('\\').splice(-1)[0] : '', + base_model: 'sd-1', + model_type: 'main', + path: model_path ? model_path : '', + description: '', + model_format: 'diffusers', + error: undefined, + vae: '', + variant: 'normal', + }, + }); + + const advancedAddDiffusersFormHandler = (values: DiffusersModelConfig) => { + addMainModel({ + body: values, + }) + .unwrap() + .then((_) => { + dispatch( + addToast( + makeToast({ + title: `Model Added: ${values.model_name}`, + status: 'success', + }) + ) + ); + advancedAddDiffusersForm.reset(); + // Close Advanced Panel in Scan Models tab + if (model_path) { + dispatch(setAdvancedAddScanModel(null)); + } + }) + .catch((error) => { + if (error) { + dispatch( + addToast( + makeToast({ + title: 'Model Add Failed', + status: 'error', + }) + ) + ); + } + }); + }; + + return ( +
+ advancedAddDiffusersFormHandler(v) + )} + style={{ width: '100%' }} + > + + + + + + + + + {t('modelManager.addModel')} + + +
+ ); +} diff --git a/invokeai/frontend/web/src/features/ui/components/tabs/ModelManager/subpanels/AddModelsPanel/AdvancedAddModels.tsx b/invokeai/frontend/web/src/features/ui/components/tabs/ModelManager/subpanels/AddModelsPanel/AdvancedAddModels.tsx new file mode 100644 index 0000000000..88e83fadc8 --- /dev/null +++ b/invokeai/frontend/web/src/features/ui/components/tabs/ModelManager/subpanels/AddModelsPanel/AdvancedAddModels.tsx @@ -0,0 +1,46 @@ +import { Flex } from '@chakra-ui/react'; +import { SelectItem } from '@mantine/core'; +import IAIMantineSelect from 'common/components/IAIMantineSelect'; +import { useState } from 'react'; +import AdvancedAddCheckpoint from './AdvancedAddCheckpoint'; +import AdvancedAddDiffusers from './AdvancedAddDiffusers'; + +export const advancedAddModeData: SelectItem[] = [ + { label: 'Diffusers', value: 'diffusers' }, + { label: 'Checkpoint / Safetensors', value: 'checkpoint' }, +]; + +export type ManualAddMode = 'diffusers' | 'checkpoint'; + +export default function AdvancedAddModels() { + const [advancedAddMode, setAdvancedAddMode] = + useState('diffusers'); + + return ( + + { + if (!v) return; + setAdvancedAddMode(v as ManualAddMode); + }} + /> + + + {advancedAddMode === 'diffusers' && } + {advancedAddMode === 'checkpoint' && } + + + ); +} diff --git a/invokeai/frontend/web/src/features/ui/components/tabs/ModelManager/subpanels/AddModelsPanel/FoundModelsList.tsx b/invokeai/frontend/web/src/features/ui/components/tabs/ModelManager/subpanels/AddModelsPanel/FoundModelsList.tsx new file mode 100644 index 0000000000..82a492b40d --- /dev/null +++ b/invokeai/frontend/web/src/features/ui/components/tabs/ModelManager/subpanels/AddModelsPanel/FoundModelsList.tsx @@ -0,0 +1,253 @@ +import { Flex, Text } from '@chakra-ui/react'; +import { makeToast } from 'app/components/Toaster'; +import { RootState } from 'app/store/store'; +import { useAppDispatch, useAppSelector } from 'app/store/storeHooks'; +import IAIButton from 'common/components/IAIButton'; +import IAIInput from 'common/components/IAIInput'; +import IAIScrollArea from 'common/components/IAIScrollArea'; +import { addToast } from 'features/system/store/systemSlice'; +import { difference, forEach, intersection, map, values } from 'lodash-es'; +import { ChangeEvent, MouseEvent, useCallback, useState } from 'react'; +import { useTranslation } from 'react-i18next'; +import { + SearchFolderResponse, + useGetMainModelsQuery, + useGetModelsInFolderQuery, + useImportMainModelsMutation, +} from 'services/api/endpoints/models'; +import { setAdvancedAddScanModel } from '../../store/modelManagerSlice'; + +export default function FoundModelsList() { + const searchFolder = useAppSelector( + (state: RootState) => state.modelmanager.searchFolder + ); + const [nameFilter, setNameFilter] = useState(''); + + // Get paths of models that are already installed + const { data: installedModels } = useGetMainModelsQuery(); + + // Get all model paths from a given directory + const { foundModels, alreadyInstalled, filteredModels } = + useGetModelsInFolderQuery( + { + search_path: searchFolder ? searchFolder : '', + }, + { + selectFromResult: ({ data }) => { + const installedModelValues = values(installedModels?.entities); + const installedModelPaths = map(installedModelValues, 'path'); + // Only select models those that aren't already installed to Invoke + const notInstalledModels = difference(data, installedModelPaths); + const alreadyInstalled = intersection(data, installedModelPaths); + return { + foundModels: data, + alreadyInstalled: foundModelsFilter(alreadyInstalled, nameFilter), + filteredModels: foundModelsFilter(notInstalledModels, nameFilter), + }; + }, + } + ); + + const [importMainModel, { isLoading }] = useImportMainModelsMutation(); + const dispatch = useAppDispatch(); + const { t } = useTranslation(); + + const quickAddHandler = useCallback( + (e: MouseEvent) => { + const model_name = e.currentTarget.id.split('\\').splice(-1)[0]; + importMainModel({ + body: { + location: e.currentTarget.id, + }, + }) + .unwrap() + .then((_) => { + dispatch( + addToast( + makeToast({ + title: `Added Model: ${model_name}`, + status: 'success', + }) + ) + ); + }) + .catch((error) => { + if (error) { + dispatch( + addToast( + makeToast({ + title: 'Faile To Add Model', + status: 'error', + }) + ) + ); + } + }); + }, + [dispatch, importMainModel] + ); + + const handleSearchFilter = useCallback((e: ChangeEvent) => { + setNameFilter(e.target.value); + }, []); + + const renderModels = ({ + models, + showActions = true, + }: { + models: string[]; + showActions?: boolean; + }) => { + return models.map((model) => { + return ( + + + + {model.split('\\').slice(-1)[0]} + + + {model} + + + {showActions ? ( + + + Quick Add + + dispatch(setAdvancedAddScanModel(model))} + isLoading={isLoading} + > + Advanced + + + ) : ( + + Installed + + )} + + ); + }); + }; + + const renderFoundModels = () => { + if (!searchFolder) return; + + if (!foundModels || foundModels.length === 0) { + return ( + + No Models Found + + ); + } + + return ( + + + + + Models Found: {foundModels.length} + + + Not Installed: {filteredModels.length} + + + + + + {renderModels({ models: filteredModels })} + {renderModels({ models: alreadyInstalled, showActions: false })} + + + + ); + }; + + return renderFoundModels(); +} + +const foundModelsFilter = ( + data: SearchFolderResponse | undefined, + nameFilter: string +) => { + const filteredModels: SearchFolderResponse = []; + forEach(data, (model) => { + if (!model) { + return; + } + + if (model.includes(nameFilter)) { + filteredModels.push(model); + } + }); + return filteredModels; +}; diff --git a/invokeai/frontend/web/src/features/ui/components/tabs/ModelManager/subpanels/AddModelsPanel/ScanAdvancedAddModels.tsx b/invokeai/frontend/web/src/features/ui/components/tabs/ModelManager/subpanels/AddModelsPanel/ScanAdvancedAddModels.tsx new file mode 100644 index 0000000000..3ae4773009 --- /dev/null +++ b/invokeai/frontend/web/src/features/ui/components/tabs/ModelManager/subpanels/AddModelsPanel/ScanAdvancedAddModels.tsx @@ -0,0 +1,97 @@ +import { Box, Flex, Text } from '@chakra-ui/react'; +import { RootState } from 'app/store/store'; +import { useAppDispatch, useAppSelector } from 'app/store/storeHooks'; +import IAIIconButton from 'common/components/IAIIconButton'; +import IAIMantineSelect from 'common/components/IAIMantineSelect'; +import { motion } from 'framer-motion'; +import { useEffect, useState } from 'react'; +import { FaTimes } from 'react-icons/fa'; +import { setAdvancedAddScanModel } from '../../store/modelManagerSlice'; +import AdvancedAddCheckpoint from './AdvancedAddCheckpoint'; +import AdvancedAddDiffusers from './AdvancedAddDiffusers'; +import { ManualAddMode, advancedAddModeData } from './AdvancedAddModels'; + +export default function ScanAdvancedAddModels() { + const advancedAddScanModel = useAppSelector( + (state: RootState) => state.modelmanager.advancedAddScanModel + ); + + const [advancedAddMode, setAdvancedAddMode] = + useState('diffusers'); + + const [isCheckpoint, setIsCheckpoint] = useState(true); + + useEffect(() => { + advancedAddScanModel && + ['.ckpt', '.safetensors', '.pth', '.pt'].some((ext) => + advancedAddScanModel.endsWith(ext) + ) + ? setAdvancedAddMode('checkpoint') + : setAdvancedAddMode('diffusers'); + }, [advancedAddScanModel, setAdvancedAddMode, isCheckpoint]); + + const dispatch = useAppDispatch(); + + return ( + advancedAddScanModel && ( + + + + {isCheckpoint || advancedAddMode === 'checkpoint' + ? 'Add Checkpoint Model' + : 'Add Diffusers Model'} + + } + aria-label="Close Advanced" + onClick={() => dispatch(setAdvancedAddScanModel(null))} + size="sm" + /> + + { + if (!v) return; + setAdvancedAddMode(v as ManualAddMode); + if (v === 'checkpoint') { + setIsCheckpoint(true); + } else { + setIsCheckpoint(false); + } + }} + /> + {isCheckpoint ? ( + + ) : ( + + )} + + ) + ); +} diff --git a/invokeai/frontend/web/src/features/ui/components/tabs/ModelManager/subpanels/AddModelsPanel/ScanModels.tsx b/invokeai/frontend/web/src/features/ui/components/tabs/ModelManager/subpanels/AddModelsPanel/ScanModels.tsx new file mode 100644 index 0000000000..fc1b6b321f --- /dev/null +++ b/invokeai/frontend/web/src/features/ui/components/tabs/ModelManager/subpanels/AddModelsPanel/ScanModels.tsx @@ -0,0 +1,25 @@ +import { Flex } from '@chakra-ui/react'; +import FoundModelsList from './FoundModelsList'; +import ScanAdvancedAddModels from './ScanAdvancedAddModels'; +import SearchFolderForm from './SearchFolderForm'; + +export default function ScanModels() { + return ( + + + + + + + + + + ); +} diff --git a/invokeai/frontend/web/src/features/ui/components/tabs/ModelManager/subpanels/AddModelsPanel/SearchFolderForm.tsx b/invokeai/frontend/web/src/features/ui/components/tabs/ModelManager/subpanels/AddModelsPanel/SearchFolderForm.tsx new file mode 100644 index 0000000000..129e82738f --- /dev/null +++ b/invokeai/frontend/web/src/features/ui/components/tabs/ModelManager/subpanels/AddModelsPanel/SearchFolderForm.tsx @@ -0,0 +1,139 @@ +import { Flex, Text } from '@chakra-ui/react'; +import { useForm } from '@mantine/form'; +import { RootState } from 'app/store/store'; +import { useAppDispatch, useAppSelector } from 'app/store/storeHooks'; +import IAIIconButton from 'common/components/IAIIconButton'; +import IAIInput from 'common/components/IAIInput'; +import { memo, useCallback } from 'react'; +import { useTranslation } from 'react-i18next'; +import { FaSearch, FaSync, FaTrash } from 'react-icons/fa'; +import { useGetModelsInFolderQuery } from 'services/api/endpoints/models'; +import { + setAdvancedAddScanModel, + setSearchFolder, +} from '../../store/modelManagerSlice'; + +type SearchFolderForm = { + folder: string; +}; + +function SearchFolderForm() { + const dispatch = useAppDispatch(); + const { t } = useTranslation(); + + const searchFolder = useAppSelector( + (state: RootState) => state.modelmanager.searchFolder + ); + + const { refetch: refetchFoundModels } = useGetModelsInFolderQuery({ + search_path: searchFolder ? searchFolder : '', + }); + + const searchFolderForm = useForm({ + initialValues: { + folder: '', + }, + }); + + const searchFolderFormSubmitHandler = useCallback( + (values: SearchFolderForm) => { + dispatch(setSearchFolder(values.folder)); + }, + [dispatch] + ); + + const scanAgainHandler = () => { + refetchFoundModels(); + }; + + return ( +
+ searchFolderFormSubmitHandler(values) + )} + style={{ width: '100%' }} + > + + + + Folder + + {!searchFolder ? ( + + ) : ( + + {searchFolder} + + )} + + + + {!searchFolder ? ( + } + fontSize={18} + size="sm" + type="submit" + /> + ) : ( + } + onClick={scanAgainHandler} + fontSize={18} + size="sm" + /> + )} + + } + size="sm" + onClick={() => { + dispatch(setSearchFolder(null)); + dispatch(setAdvancedAddScanModel(null)); + }} + isDisabled={!searchFolder} + colorScheme="red" + /> + + +
+ ); +} + +export default memo(SearchFolderForm); diff --git a/invokeai/frontend/web/src/features/ui/components/tabs/ModelManager/subpanels/AddModelsPanel/SearchModels.tsx b/invokeai/frontend/web/src/features/ui/components/tabs/ModelManager/subpanels/AddModelsPanel/SearchModelsOld.tsx similarity index 100% rename from invokeai/frontend/web/src/features/ui/components/tabs/ModelManager/subpanels/AddModelsPanel/SearchModels.tsx rename to invokeai/frontend/web/src/features/ui/components/tabs/ModelManager/subpanels/AddModelsPanel/SearchModelsOld.tsx diff --git a/invokeai/frontend/web/src/features/ui/components/tabs/ModelManager/subpanels/AddModelsPanel/SimpleAddModels.tsx b/invokeai/frontend/web/src/features/ui/components/tabs/ModelManager/subpanels/AddModelsPanel/SimpleAddModels.tsx new file mode 100644 index 0000000000..7811e462dc --- /dev/null +++ b/invokeai/frontend/web/src/features/ui/components/tabs/ModelManager/subpanels/AddModelsPanel/SimpleAddModels.tsx @@ -0,0 +1,108 @@ +import { Flex } from '@chakra-ui/react'; +// import { addNewModel } from 'app/socketio/actions'; +import { useAppDispatch, useAppSelector } from 'app/store/storeHooks'; +import { useTranslation } from 'react-i18next'; + +import { SelectItem } from '@mantine/core'; +import { useForm } from '@mantine/form'; +import { makeToast } from 'app/components/Toaster'; +import { RootState } from 'app/store/store'; +import IAIButton from 'common/components/IAIButton'; +import IAIMantineTextInput from 'common/components/IAIMantineInput'; +import IAIMantineSelect from 'common/components/IAIMantineSelect'; +import { addToast } from 'features/system/store/systemSlice'; +import { useImportMainModelsMutation } from 'services/api/endpoints/models'; + +const predictionSelectData: SelectItem[] = [ + { label: 'None', value: 'none' }, + { label: 'v_prediction', value: 'v_prediction' }, + { label: 'epsilon', value: 'epsilon' }, + { label: 'sample', value: 'sample' }, +]; + +type ExtendedImportModelConfig = { + location: string; + prediction_type?: 'v_prediction' | 'epsilon' | 'sample' | 'none' | undefined; +}; + +export default function SimpleAddModels() { + const dispatch = useAppDispatch(); + const { t } = useTranslation(); + + const isProcessing = useAppSelector( + (state: RootState) => state.system.isProcessing + ); + + const [importMainModel, { isLoading }] = useImportMainModelsMutation(); + + const addModelForm = useForm({ + initialValues: { + location: '', + prediction_type: undefined, + }, + }); + + const handleAddModelSubmit = (values: ExtendedImportModelConfig) => { + const importModelResponseBody = { + location: values.location, + prediction_type: + values.prediction_type === 'none' ? undefined : values.prediction_type, + }; + + importMainModel({ body: importModelResponseBody }) + .unwrap() + .then((_) => { + dispatch( + addToast( + makeToast({ + title: 'Model Added', + status: 'success', + }) + ) + ); + addModelForm.reset(); + }) + .catch((error) => { + if (error) { + console.log(error); + dispatch( + addToast( + makeToast({ + title: `${error.data.detail} `, + status: 'error', + }) + ) + ); + } + }); + }; + + return ( +
handleAddModelSubmit(v))} + style={{ width: '100%' }} + > + + + + + {t('modelManager.addModel')} + + +
+ ); +} diff --git a/invokeai/frontend/web/src/features/ui/components/tabs/ModelManager/subpanels/ImportModelsPanel.tsx b/invokeai/frontend/web/src/features/ui/components/tabs/ModelManager/subpanels/ImportModelsPanel.tsx new file mode 100644 index 0000000000..b0a8c124eb --- /dev/null +++ b/invokeai/frontend/web/src/features/ui/components/tabs/ModelManager/subpanels/ImportModelsPanel.tsx @@ -0,0 +1,39 @@ +import { ButtonGroup, Flex } from '@chakra-ui/react'; +import IAIButton from 'common/components/IAIButton'; +import { useState } from 'react'; +import { useTranslation } from 'react-i18next'; +import AddModels from './AddModelsPanel/AddModels'; +import ScanModels from './AddModelsPanel/ScanModels'; + +type AddModelTabs = 'add' | 'scan'; + +export default function ImportModelsPanel() { + const [addModelTab, setAddModelTab] = useState('add'); + const { t } = useTranslation(); + + return ( + + + setAddModelTab('add')} + isChecked={addModelTab == 'add'} + size="sm" + width="100%" + > + {t('modelManager.addModel')} + + setAddModelTab('scan')} + isChecked={addModelTab == 'scan'} + size="sm" + width="100%" + > + {t('modelManager.scanForModels')} + + + + {addModelTab == 'add' && } + {addModelTab == 'scan' && } + + ); +} diff --git a/invokeai/frontend/web/src/features/ui/components/tabs/ModelManager/subpanels/MergeModelsPanel.tsx b/invokeai/frontend/web/src/features/ui/components/tabs/ModelManager/subpanels/MergeModelsPanel.tsx index b71b5636b4..6edd0e8d81 100644 --- a/invokeai/frontend/web/src/features/ui/components/tabs/ModelManager/subpanels/MergeModelsPanel.tsx +++ b/invokeai/frontend/web/src/features/ui/components/tabs/ModelManager/subpanels/MergeModelsPanel.tsx @@ -1,42 +1,76 @@ import { Flex, Radio, RadioGroup, Text, Tooltip } from '@chakra-ui/react'; -import { RootState } from 'app/store/store'; -import { useAppDispatch, useAppSelector } from 'app/store/storeHooks'; +import { makeToast } from 'app/components/Toaster'; +import { useAppDispatch } from 'app/store/storeHooks'; import IAIButton from 'common/components/IAIButton'; import IAIInput from 'common/components/IAIInput'; -import IAISelect from 'common/components/IAISelect'; +import IAIMantineSearchableSelect from 'common/components/IAIMantineSearchableSelect'; +import IAIMantineSelect from 'common/components/IAIMantineSelect'; import IAISimpleCheckbox from 'common/components/IAISimpleCheckbox'; import IAISlider from 'common/components/IAISlider'; +import { addToast } from 'features/system/store/systemSlice'; import { pickBy } from 'lodash-es'; -import { useState } from 'react'; +import { useMemo, useState } from 'react'; import { useTranslation } from 'react-i18next'; -import { useGetMainModelsQuery } from 'services/api/endpoints/models'; +import { + useGetMainModelsQuery, + useMergeMainModelsMutation, +} from 'services/api/endpoints/models'; +import { BaseModelType, MergeModelConfig } from 'services/api/types'; + +const baseModelTypeSelectData = [ + { label: 'Stable Diffusion 1', value: 'sd-1' }, + { label: 'Stable Diffusion 2', value: 'sd-2' }, +]; + +type MergeInterpolationMethods = + | 'weighted_sum' + | 'sigmoid' + | 'inv_sigmoid' + | 'add_difference'; export default function MergeModelsPanel() { const { t } = useTranslation(); - const dispatch = useAppDispatch(); const { data } = useGetMainModelsQuery(); - const diffusersModels = pickBy( + const [mergeModels, { isLoading }] = useMergeMainModelsMutation(); + + const [baseModel, setBaseModel] = useState('sd-1'); + + const sd1DiffusersModels = pickBy( data?.entities, - (value, _) => value?.model_format === 'diffusers' + (value, _) => + value?.model_format === 'diffusers' && value?.base_model === 'sd-1' ); - const [modelOne, setModelOne] = useState( - Object.keys(diffusersModels)[0] + const sd2DiffusersModels = pickBy( + data?.entities, + (value, _) => + value?.model_format === 'diffusers' && value?.base_model === 'sd-2' ); - const [modelTwo, setModelTwo] = useState( - Object.keys(diffusersModels)[1] + + const modelsMap = useMemo(() => { + return { + 'sd-1': sd1DiffusersModels, + 'sd-2': sd2DiffusersModels, + }; + }, [sd1DiffusersModels, sd2DiffusersModels]); + + const [modelOne, setModelOne] = useState( + Object.keys(modelsMap[baseModel as keyof typeof modelsMap])[0] ); - const [modelThree, setModelThree] = useState('none'); + const [modelTwo, setModelTwo] = useState( + Object.keys(modelsMap[baseModel as keyof typeof modelsMap])[1] + ); + + const [modelThree, setModelThree] = useState(null); const [mergedModelName, setMergedModelName] = useState(''); const [modelMergeAlpha, setModelMergeAlpha] = useState(0.5); - const [modelMergeInterp, setModelMergeInterp] = useState< - 'weighted_sum' | 'sigmoid' | 'inv_sigmoid' | 'add_difference' - >('weighted_sum'); + const [modelMergeInterp, setModelMergeInterp] = + useState('weighted_sum'); const [modelMergeSaveLocType, setModelMergeSaveLocType] = useState< 'root' | 'custom' @@ -47,41 +81,73 @@ export default function MergeModelsPanel() { const [modelMergeForce, setModelMergeForce] = useState(false); - const modelOneList = Object.keys(diffusersModels).filter( - (model) => model !== modelTwo && model !== modelThree - ); + const modelOneList = Object.keys( + modelsMap[baseModel as keyof typeof modelsMap] + ).filter((model) => model !== modelTwo && model !== modelThree); - const modelTwoList = Object.keys(diffusersModels).filter( - (model) => model !== modelOne && model !== modelThree - ); + const modelTwoList = Object.keys( + modelsMap[baseModel as keyof typeof modelsMap] + ).filter((model) => model !== modelOne && model !== modelThree); - const modelThreeList = [ - { key: t('modelManager.none'), value: 'none' }, - ...Object.keys(diffusersModels) - .filter((model) => model !== modelOne && model !== modelTwo) - .map((model) => ({ key: model, value: model })), - ]; + const modelThreeList = Object.keys( + modelsMap[baseModel as keyof typeof modelsMap] + ).filter((model) => model !== modelOne && model !== modelTwo); - const isProcessing = useAppSelector( - (state: RootState) => state.system.isProcessing - ); + const handleBaseModelChange = (v: string) => { + setBaseModel(v as BaseModelType); + setModelOne(null); + setModelTwo(null); + }; const mergeModelsHandler = () => { - let modelsToMerge: string[] = [modelOne, modelTwo, modelThree]; - modelsToMerge = modelsToMerge.filter((model) => model !== 'none'); + const models_names: string[] = []; - const mergeModelsInfo: InvokeAI.InvokeModelMergingProps = { - models_to_merge: modelsToMerge, + let modelsToMerge: (string | null)[] = [modelOne, modelTwo, modelThree]; + modelsToMerge = modelsToMerge.filter((model) => model !== null); + modelsToMerge.forEach((model) => { + if (model) { + models_names.push(model?.split('/')[2]); + } + }); + + const mergeModelsInfo: MergeModelConfig = { + model_names: models_names, merged_model_name: - mergedModelName !== '' ? mergedModelName : modelsToMerge.join('-'), + mergedModelName !== '' ? mergedModelName : models_names.join('-'), alpha: modelMergeAlpha, interp: modelMergeInterp, - model_merge_save_path: - modelMergeSaveLocType === 'root' ? null : modelMergeCustomSaveLoc, force: modelMergeForce, + merge_dest_directory: + modelMergeSaveLocType === 'root' ? undefined : modelMergeCustomSaveLoc, }; - dispatch(mergeDiffusersModels(mergeModelsInfo)); + mergeModels({ + base_model: baseModel, + body: mergeModelsInfo, + }) + .unwrap() + .then((_) => { + dispatch( + addToast( + makeToast({ + title: t('modelManager.modelsMerged'), + status: 'success', + }) + ) + ); + }) + .catch((error) => { + if (error) { + dispatch( + addToast( + makeToast({ + title: t('modelManager.modelsMergeFailed'), + status: 'error', + }) + ) + ); + } + }); }; return ( @@ -90,7 +156,6 @@ export default function MergeModelsPanel() { sx={{ flexDirection: 'column', rowGap: 1, - bg: 'base.900', }} > {t('modelManager.modelMergeHeaderHelp1')} @@ -98,26 +163,43 @@ export default function MergeModelsPanel() { {t('modelManager.modelMergeHeaderHelp2')}
+ - + setModelOne(e.target.value)} + w="100%" + value={modelOne} + placeholder={t('modelManager.selectModel')} + data={modelOneList} + onChange={(v) => setModelOne(v)} /> - setModelTwo(e.target.value)} + w="100%" + placeholder={t('modelManager.selectModel')} + value={modelTwo} + data={modelTwoList} + onChange={(v) => setModelTwo(v)} /> - { - if (e.target.value !== 'none') { - setModelThree(e.target.value); + data={modelThreeList} + w="100%" + placeholder={t('modelManager.selectModel')} + clearable + onChange={(v) => { + if (!v) { + setModelThree(null); setModelMergeInterp('add_difference'); } else { - setModelThree('none'); + setModelThree(v); setModelMergeInterp('weighted_sum'); } }} @@ -136,7 +218,10 @@ export default function MergeModelsPanel() { padding: 4, borderRadius: 'base', gap: 4, - bg: 'base.900', + bg: 'base.200', + _dark: { + bg: 'base.800', + }, }} > @@ -169,12 +257,10 @@ export default function MergeModelsPanel() { setModelMergeInterp(v)} + onChange={(v: MergeInterpolationMethods) => setModelMergeInterp(v)} > - {modelThree === 'none' ? ( + {modelThree === null ? ( <> {t('modelManager.weightedSum')} @@ -205,7 +291,10 @@ export default function MergeModelsPanel() { padding: 4, borderRadius: 'base', gap: 4, - bg: 'base.900', + bg: 'base.200', + _dark: { + bg: 'base.900', + }, }} > @@ -246,10 +335,8 @@ export default function MergeModelsPanel() { {t('modelManager.merge')} diff --git a/invokeai/frontend/web/src/features/ui/components/tabs/ModelManager/subpanels/ModelManagerPanel.tsx b/invokeai/frontend/web/src/features/ui/components/tabs/ModelManager/subpanels/ModelManagerPanel.tsx index b22a303571..f49294cfb0 100644 --- a/invokeai/frontend/web/src/features/ui/components/tabs/ModelManager/subpanels/ModelManagerPanel.tsx +++ b/invokeai/frontend/web/src/features/ui/components/tabs/ModelManager/subpanels/ModelManagerPanel.tsx @@ -1,44 +1,60 @@ -import { Flex } from '@chakra-ui/react'; -import { RootState } from 'app/store/store'; -import { useAppSelector } from 'app/store/storeHooks'; +import { Flex, Text } from '@chakra-ui/react'; -import { useGetMainModelsQuery } from 'services/api/endpoints/models'; +import { useState } from 'react'; +import { + MainModelConfigEntity, + useGetMainModelsQuery, +} from 'services/api/endpoints/models'; import CheckpointModelEdit from './ModelManagerPanel/CheckpointModelEdit'; import DiffusersModelEdit from './ModelManagerPanel/DiffusersModelEdit'; import ModelList from './ModelManagerPanel/ModelList'; export default function ModelManagerPanel() { - const { data: mainModels } = useGetMainModelsQuery(); + const [selectedModelId, setSelectedModelId] = useState(); + const { model } = useGetMainModelsQuery(undefined, { + selectFromResult: ({ data }) => ({ + model: selectedModelId ? data?.entities[selectedModelId] : undefined, + }), + }); - const openModel = useAppSelector( - (state: RootState) => state.system.openModel - ); - - const renderModelEditTabs = () => { - if (!openModel || !mainModels) return; - - if (mainModels['entities'][openModel]['model_format'] === 'diffusers') { - return ( - - ); - } else { - return ( - - ); - } - }; return ( - - - {renderModelEditTabs()} + + + ); } + +type ModelEditProps = { + model: MainModelConfigEntity | undefined; +}; + +const ModelEdit = (props: ModelEditProps) => { + const { model } = props; + + if (model?.model_format === 'checkpoint') { + return ; + } + + if (model?.model_format === 'diffusers') { + return ; + } + + return ( + + No Model Selected + + ); +}; diff --git a/invokeai/frontend/web/src/features/ui/components/tabs/ModelManager/subpanels/ModelManagerPanel/CheckpointModelEdit.tsx b/invokeai/frontend/web/src/features/ui/components/tabs/ModelManager/subpanels/ModelManagerPanel/CheckpointModelEdit.tsx index 586be4566e..2f2706d640 100644 --- a/invokeai/frontend/web/src/features/ui/components/tabs/ModelManager/subpanels/ModelManagerPanel/CheckpointModelEdit.tsx +++ b/invokeai/frontend/web/src/features/ui/components/tabs/ModelManager/subpanels/ModelManagerPanel/CheckpointModelEdit.tsx @@ -1,79 +1,134 @@ -import { useAppDispatch, useAppSelector } from 'app/store/storeHooks'; - -import { Divider, Flex, Text } from '@chakra-ui/react'; - -// import { addNewModel } from 'app/socketio/actions'; +import { Badge, Divider, Flex, Text } from '@chakra-ui/react'; import { useForm } from '@mantine/form'; -import { useTranslation } from 'react-i18next'; - -import type { RootState } from 'app/store/store'; +import { makeToast } from 'app/components/Toaster'; +import { useAppDispatch, useAppSelector } from 'app/store/storeHooks'; import IAIButton from 'common/components/IAIButton'; -import IAIInput from 'common/components/IAIInput'; -import IAIMantineSelect from 'common/components/IAIMantineSelect'; -import { MODEL_TYPE_MAP } from 'features/system/components/ModelSelect'; -import { S } from 'services/api/types'; +import IAIMantineTextInput from 'common/components/IAIMantineInput'; +import IAISimpleCheckbox from 'common/components/IAISimpleCheckbox'; +import { MODEL_TYPE_MAP } from 'features/parameters/types/constants'; +import { selectIsBusy } from 'features/system/store/systemSelectors'; +import { addToast } from 'features/system/store/systemSlice'; +import { useCallback, useEffect, useState } from 'react'; +import { useTranslation } from 'react-i18next'; +import { + CheckpointModelConfigEntity, + useGetCheckpointConfigsQuery, + useUpdateMainModelsMutation, +} from 'services/api/endpoints/models'; +import { CheckpointModelConfig } from 'services/api/types'; +import BaseModelSelect from '../shared/BaseModelSelect'; +import CheckpointConfigsSelect from '../shared/CheckpointConfigsSelect'; +import ModelVariantSelect from '../shared/ModelVariantSelect'; import ModelConvert from './ModelConvert'; -const baseModelSelectData = [ - { value: 'sd-1', label: MODEL_TYPE_MAP['sd-1'] }, - { value: 'sd-2', label: MODEL_TYPE_MAP['sd-2'] }, -]; - -const variantSelectData = [ - { value: 'normal', label: 'Normal' }, - { value: 'inpaint', label: 'Inpaint' }, - { value: 'depth', label: 'Depth' }, -]; - -export type CheckpointModel = - | S<'StableDiffusion1ModelCheckpointConfig'> - | S<'StableDiffusion2ModelCheckpointConfig'>; - type CheckpointModelEditProps = { - modelToEdit: string; - retrievedModel: CheckpointModel; + model: CheckpointModelConfigEntity; }; export default function CheckpointModelEdit(props: CheckpointModelEditProps) { - const isProcessing = useAppSelector( - (state: RootState) => state.system.isProcessing - ); + const isBusy = useAppSelector(selectIsBusy); - const { modelToEdit, retrievedModel } = props; + const { model } = props; + + const [updateMainModel, { isLoading }] = useUpdateMainModelsMutation(); + const { data: availableCheckpointConfigs } = useGetCheckpointConfigsQuery(); + + const [useCustomConfig, setUseCustomConfig] = useState(false); + + useEffect(() => { + if (!availableCheckpointConfigs?.includes(model.config)) { + setUseCustomConfig(true); + } + }, [availableCheckpointConfigs, model.config]); const dispatch = useAppDispatch(); const { t } = useTranslation(); - const checkpointEditForm = useForm({ + const checkpointEditForm = useForm({ initialValues: { - name: retrievedModel.model_name, - base_model: retrievedModel.base_model, - type: 'main', - path: retrievedModel.path, - description: retrievedModel.description, + model_name: model.model_name ? model.model_name : '', + base_model: model.base_model, + model_type: 'main', + path: model.path ? model.path : '', + description: model.description ? model.description : '', model_format: 'checkpoint', - vae: retrievedModel.vae, - config: retrievedModel.config, - variant: retrievedModel.variant, + vae: model.vae ? model.vae : '', + config: model.config ? model.config : '', + variant: model.variant, + }, + validate: { + path: (value) => + value.trim().length === 0 ? 'Must provide a path' : null, }, }); - const editModelFormSubmitHandler = (values) => { - console.log(values); - }; + const editModelFormSubmitHandler = useCallback( + (values: CheckpointModelConfig) => { + const responseBody = { + base_model: model.base_model, + model_name: model.model_name, + body: values, + }; + updateMainModel(responseBody) + .unwrap() + .then((payload) => { + checkpointEditForm.setValues(payload as CheckpointModelConfig); + dispatch( + addToast( + makeToast({ + title: t('modelManager.modelUpdated'), + status: 'success', + }) + ) + ); + }) + .catch((_) => { + checkpointEditForm.reset(); + dispatch( + addToast( + makeToast({ + title: t('modelManager.modelUpdateFailed'), + status: 'error', + }) + ) + ); + }); + }, + [ + checkpointEditForm, + dispatch, + model.base_model, + model.model_name, + t, + updateMainModel, + ] + ); - return modelToEdit ? ( + return ( - {retrievedModel.model_name} + {model.model_name} - {MODEL_TYPE_MAP[retrievedModel.base_model]} Model + {MODEL_TYPE_MAP[model.base_model]} Model - + {!['sdxl', 'sdxl-refiner'].includes(model.base_model) ? ( + + ) : ( + + Conversion Not Supported + + )} @@ -88,54 +143,62 @@ export default function CheckpointModelEdit(props: CheckpointModelEditProps) { )} > - - - - - - - - + + + {!useCustomConfig ? ( + + ) : ( + + )} + setUseCustomConfig(!useCustomConfig)} + label="Use Custom Config" + /> + + + {t('modelManager.updateModel')} - ) : ( - - Pick A Model To Edit - ); } diff --git a/invokeai/frontend/web/src/features/ui/components/tabs/ModelManager/subpanels/ModelManagerPanel/DiffusersModelEdit.tsx b/invokeai/frontend/web/src/features/ui/components/tabs/ModelManager/subpanels/ModelManagerPanel/DiffusersModelEdit.tsx index f0ed12d361..37a08959be 100644 --- a/invokeai/frontend/web/src/features/ui/components/tabs/ModelManager/subpanels/ModelManagerPanel/DiffusersModelEdit.tsx +++ b/invokeai/frontend/web/src/features/ui/components/tabs/ModelManager/subpanels/ModelManagerPanel/DiffusersModelEdit.tsx @@ -1,72 +1,104 @@ -import { useAppDispatch, useAppSelector } from 'app/store/storeHooks'; - import { Divider, Flex, Text } from '@chakra-ui/react'; - -// import { addNewModel } from 'app/socketio/actions'; -import { useTranslation } from 'react-i18next'; - import { useForm } from '@mantine/form'; -import type { RootState } from 'app/store/store'; +import { makeToast } from 'app/components/Toaster'; +import { useAppDispatch, useAppSelector } from 'app/store/storeHooks'; import IAIButton from 'common/components/IAIButton'; -import IAIInput from 'common/components/IAIInput'; -import IAIMantineSelect from 'common/components/IAIMantineSelect'; -import { MODEL_TYPE_MAP } from 'features/system/components/ModelSelect'; -import { S } from 'services/api/types'; - -type DiffusersModel = - | S<'StableDiffusion1ModelDiffusersConfig'> - | S<'StableDiffusion2ModelDiffusersConfig'>; +import IAIMantineTextInput from 'common/components/IAIMantineInput'; +import { MODEL_TYPE_MAP } from 'features/parameters/types/constants'; +import { selectIsBusy } from 'features/system/store/systemSelectors'; +import { addToast } from 'features/system/store/systemSlice'; +import { useCallback } from 'react'; +import { useTranslation } from 'react-i18next'; +import { + DiffusersModelConfigEntity, + useUpdateMainModelsMutation, +} from 'services/api/endpoints/models'; +import { DiffusersModelConfig } from 'services/api/types'; +import BaseModelSelect from '../shared/BaseModelSelect'; +import ModelVariantSelect from '../shared/ModelVariantSelect'; type DiffusersModelEditProps = { - modelToEdit: string; - retrievedModel: DiffusersModel; + model: DiffusersModelConfigEntity; }; -const baseModelSelectData = [ - { value: 'sd-1', label: MODEL_TYPE_MAP['sd-1'] }, - { value: 'sd-2', label: MODEL_TYPE_MAP['sd-2'] }, -]; - -const variantSelectData = [ - { value: 'normal', label: 'Normal' }, - { value: 'inpaint', label: 'Inpaint' }, - { value: 'depth', label: 'Depth' }, -]; - export default function DiffusersModelEdit(props: DiffusersModelEditProps) { - const isProcessing = useAppSelector( - (state: RootState) => state.system.isProcessing - ); - const { retrievedModel, modelToEdit } = props; + const isBusy = useAppSelector(selectIsBusy); + + const { model } = props; + + const [updateMainModel, { isLoading }] = useUpdateMainModelsMutation(); const dispatch = useAppDispatch(); const { t } = useTranslation(); - const diffusersEditForm = useForm({ + const diffusersEditForm = useForm({ initialValues: { - name: retrievedModel.model_name, - base_model: retrievedModel.base_model, - type: 'main', - path: retrievedModel.path, - description: retrievedModel.description, + model_name: model.model_name ? model.model_name : '', + base_model: model.base_model, + model_type: 'main', + path: model.path ? model.path : '', + description: model.description ? model.description : '', model_format: 'diffusers', - vae: retrievedModel.vae, - variant: retrievedModel.variant, + vae: model.vae ? model.vae : '', + variant: model.variant, + }, + validate: { + path: (value) => + value.trim().length === 0 ? 'Must provide a path' : null, }, }); - const editModelFormSubmitHandler = (values) => { - console.log(values); - }; + const editModelFormSubmitHandler = useCallback( + (values: DiffusersModelConfig) => { + const responseBody = { + base_model: model.base_model, + model_name: model.model_name, + body: values, + }; - return modelToEdit ? ( + updateMainModel(responseBody) + .unwrap() + .then((payload) => { + diffusersEditForm.setValues(payload as DiffusersModelConfig); + dispatch( + addToast( + makeToast({ + title: t('modelManager.modelUpdated'), + status: 'success', + }) + ) + ); + }) + .catch((_) => { + diffusersEditForm.reset(); + dispatch( + addToast( + makeToast({ + title: t('modelManager.modelUpdateFailed'), + status: 'error', + }) + ) + ); + }); + }, + [ + diffusersEditForm, + dispatch, + model.base_model, + model.model_name, + t, + updateMainModel, + ] + ); + + return ( - {retrievedModel.model_name} + {model.model_name} - {MODEL_TYPE_MAP[retrievedModel.base_model]} Model + {MODEL_TYPE_MAP[model.base_model]} Model @@ -77,49 +109,40 @@ export default function DiffusersModelEdit(props: DiffusersModelEditProps) { )} > - - - - - - - + {t('modelManager.updateModel')} - ) : ( - - Pick A Model To Edit - ); } diff --git a/invokeai/frontend/web/src/features/ui/components/tabs/ModelManager/subpanels/ModelManagerPanel/ModelConvert.tsx b/invokeai/frontend/web/src/features/ui/components/tabs/ModelManager/subpanels/ModelManagerPanel/ModelConvert.tsx index 9f571c2fff..741afba025 100644 --- a/invokeai/frontend/web/src/features/ui/components/tabs/ModelManager/subpanels/ModelManagerPanel/ModelConvert.tsx +++ b/invokeai/frontend/web/src/features/ui/components/tabs/ModelManager/subpanels/ModelManagerPanel/ModelConvert.tsx @@ -7,51 +7,107 @@ import { Tooltip, UnorderedList, } from '@chakra-ui/react'; +import { makeToast } from 'app/components/Toaster'; // import { convertToDiffusers } from 'app/socketio/actions'; import { useAppDispatch } from 'app/store/storeHooks'; import IAIAlertDialog from 'common/components/IAIAlertDialog'; import IAIButton from 'common/components/IAIButton'; import IAIInput from 'common/components/IAIInput'; +import { addToast } from 'features/system/store/systemSlice'; import { useEffect, useState } from 'react'; import { useTranslation } from 'react-i18next'; -import { CheckpointModel } from './CheckpointModelEdit'; + +import { useConvertMainModelsMutation } from 'services/api/endpoints/models'; +import { CheckpointModelConfig } from 'services/api/types'; interface ModelConvertProps { - model: CheckpointModel; + model: CheckpointModelConfig; } +type SaveLocation = 'InvokeAIRoot' | 'Custom'; + export default function ModelConvert(props: ModelConvertProps) { const { model } = props; const dispatch = useAppDispatch(); const { t } = useTranslation(); - const [saveLocation, setSaveLocation] = useState('same'); + const [convertModel, { isLoading }] = useConvertMainModelsMutation(); + + const [saveLocation, setSaveLocation] = + useState('InvokeAIRoot'); const [customSaveLocation, setCustomSaveLocation] = useState(''); useEffect(() => { - setSaveLocation('same'); + setSaveLocation('InvokeAIRoot'); }, [model]); const modelConvertCancelHandler = () => { - setSaveLocation('same'); + setSaveLocation('InvokeAIRoot'); }; const modelConvertHandler = () => { - const modelToConvert = { - model_name: model, - save_location: saveLocation, - custom_location: - saveLocation === 'custom' && customSaveLocation !== '' - ? customSaveLocation - : null, + const responseBody = { + base_model: model.base_model, + model_name: model.model_name, + params: { + convert_dest_directory: + saveLocation === 'Custom' ? customSaveLocation : undefined, + }, }; - dispatch(convertToDiffusers(modelToConvert)); + + if (saveLocation === 'Custom' && customSaveLocation === '') { + dispatch( + addToast( + makeToast({ + title: t('modelManager.noCustomLocationProvided'), + status: 'error', + }) + ) + ); + return; + } + + dispatch( + addToast( + makeToast({ + title: `${t('modelManager.convertingModelBegin')}: ${ + model.model_name + }`, + status: 'success', + }) + ) + ); + + convertModel(responseBody) + .unwrap() + .then((_) => { + dispatch( + addToast( + makeToast({ + title: `${t('modelManager.modelConverted')}: ${model.model_name}`, + status: 'success', + }) + ) + ); + }) + .catch((_) => { + dispatch( + addToast( + makeToast({ + title: `${t('modelManager.modelConversionFailed')}: ${ + model.model_name + }`, + status: 'error', + }) + ) + ); + }); }; return ( 🧨 {t('modelManager.convertToDiffusers')} @@ -77,26 +134,22 @@ export default function ModelConvert(props: ModelConvertProps) { {t('modelManager.convertToDiffusersHelpText6')} - + {t('modelManager.convertToDiffusersSaveLocation')} - setSaveLocation(v)}> + setSaveLocation(v as SaveLocation)} + > - - - {t('modelManager.sameFolder')} - - - - + {t('modelManager.invokeRoot')} - - + {t('modelManager.custom')} @@ -104,8 +157,7 @@ export default function ModelConvert(props: ModelConvertProps) { - - {saveLocation === 'custom' && ( + {saveLocation === 'Custom' && ( {t('modelManager.customSaveLocation')} @@ -113,8 +165,7 @@ export default function ModelConvert(props: ModelConvertProps) { { - if (e.target.value !== '') - setCustomSaveLocation(e.target.value); + setCustomSaveLocation(e.target.value); }} width="full" /> diff --git a/invokeai/frontend/web/src/features/ui/components/tabs/ModelManager/subpanels/ModelManagerPanel/ModelList.tsx b/invokeai/frontend/web/src/features/ui/components/tabs/ModelManager/subpanels/ModelManagerPanel/ModelList.tsx index ab6f0ca2c7..7cc3be8d43 100644 --- a/invokeai/frontend/web/src/features/ui/components/tabs/ModelManager/subpanels/ModelManagerPanel/ModelList.tsx +++ b/invokeai/frontend/web/src/features/ui/components/tabs/ModelManager/subpanels/ModelManagerPanel/ModelList.tsx @@ -1,233 +1,164 @@ -import { Box, Flex, Spinner, Text } from '@chakra-ui/react'; +import { ButtonGroup, Flex, Text } from '@chakra-ui/react'; +import { EntityState } from '@reduxjs/toolkit'; import IAIButton from 'common/components/IAIButton'; import IAIInput from 'common/components/IAIInput'; - +import { forEach } from 'lodash-es'; +import type { ChangeEvent, PropsWithChildren } from 'react'; +import { useCallback, useState } from 'react'; +import { useTranslation } from 'react-i18next'; +import { + MainModelConfigEntity, + useGetMainModelsQuery, +} from 'services/api/endpoints/models'; import ModelListItem from './ModelListItem'; -import { useTranslation } from 'react-i18next'; +type ModelListProps = { + selectedModelId: string | undefined; + setSelectedModelId: (name: string | undefined) => void; +}; -import type { ChangeEvent, ReactNode } from 'react'; -import React, { useMemo, useState, useTransition } from 'react'; -import { useGetMainModelsQuery } from 'services/api/endpoints/models'; - -function ModelFilterButton({ - label, - isActive, - onClick, -}: { - label: string; - isActive: boolean; - onClick: () => void; -}) { - return ( - - {label} - - ); -} - -const ModelList = () => { - const { data: mainModels } = useGetMainModelsQuery(); - - const [renderModelList, setRenderModelList] = React.useState(false); - - React.useEffect(() => { - const timer = setTimeout(() => { - setRenderModelList(true); - }, 200); - - return () => clearTimeout(timer); - }, []); - - const [searchText, setSearchText] = useState(''); - const [isSelectedFilter, setIsSelectedFilter] = useState< - 'all' | 'ckpt' | 'diffusers' | 'olive' - >('all'); - const [_, startTransition] = useTransition(); +type ModelFormat = 'all' | 'checkpoint' | 'diffusers' | 'olive'; +const ModelList = (props: ModelListProps) => { + const { selectedModelId, setSelectedModelId } = props; const { t } = useTranslation(); + const [nameFilter, setNameFilter] = useState(''); + const [modelFormatFilter, setModelFormatFilter] = + useState('all'); - const handleSearchFilter = (e: ChangeEvent) => { - startTransition(() => { - setSearchText(e.target.value); - }); - }; + const { filteredDiffusersModels } = useGetMainModelsQuery(undefined, { + selectFromResult: ({ data }) => ({ + filteredDiffusersModels: modelsFilter(data, 'diffusers', nameFilter), + }), + }); - const renderModelListItems = useMemo(() => { - const ckptModelListItemsToRender: ReactNode[] = []; - const diffusersModelListItemsToRender: ReactNode[] = []; - const filteredModelListItemsToRender: ReactNode[] = []; - const localFilteredModelListItemsToRender: ReactNode[] = []; + const { filteredCheckpointModels } = useGetMainModelsQuery(undefined, { + selectFromResult: ({ data }) => ({ + filteredCheckpointModels: modelsFilter(data, 'checkpoint', nameFilter), + }), + }); - if (!mainModels) return; - - const modelList = mainModels.entities; - - Object.keys(modelList).forEach((model, i) => { - if ( - modelList[model]?.model_name - .toLowerCase() - .includes(searchText.toLowerCase()) - ) { - filteredModelListItemsToRender.push( - - ); - if (modelList[model]?.model_format === isSelectedFilter) { - localFilteredModelListItemsToRender.push( - - ); - } - } - if (modelList[model]?.model_format !== 'diffusers') { - ckptModelListItemsToRender.push( - - ); - } else { - diffusersModelListItemsToRender.push( - - ); - } - }); - - return searchText !== '' ? ( - isSelectedFilter === 'all' ? ( - {filteredModelListItemsToRender} - ) : ( - {localFilteredModelListItemsToRender} - ) - ) : ( - - {isSelectedFilter === 'all' && ( - <> - - - {t('modelManager.diffusersModels')} - - {diffusersModelListItemsToRender} - - - - {t('modelManager.checkpointModels')} - - {ckptModelListItemsToRender} - - - )} - - {isSelectedFilter === 'diffusers' && ( - - {diffusersModelListItemsToRender} - - )} - - {isSelectedFilter === 'ckpt' && ( - - {ckptModelListItemsToRender} - - )} - - ); - }, [mainModels, searchText, t, isSelectedFilter]); + const handleSearchFilter = useCallback((e: ChangeEvent) => { + setNameFilter(e.target.value); + }, []); return ( - - - - - setIsSelectedFilter('all')} - isActive={isSelectedFilter === 'all'} - /> - setIsSelectedFilter('diffusers')} - isActive={isSelectedFilter === 'diffusers'} - /> - setIsSelectedFilter('ckpt')} - isActive={isSelectedFilter === 'ckpt'} - /> - - - {renderModelList ? ( - renderModelListItems - ) : ( - + + setModelFormatFilter('all')} + isChecked={modelFormatFilter === 'all'} + size="sm" > - - - )} + {t('modelManager.allModels')} + + setModelFormatFilter('diffusers')} + isChecked={modelFormatFilter === 'diffusers'} + > + {t('modelManager.diffusersModels')} + + setModelFormatFilter('checkpoint')} + isChecked={modelFormatFilter === 'checkpoint'} + > + {t('modelManager.checkpointModels')} + + + + + + {['all', 'diffusers'].includes(modelFormatFilter) && + filteredDiffusersModels.length > 0 && ( + + + + Diffusers + + {filteredDiffusersModels.map((model) => ( + + ))} + + + )} + {['all', 'checkpoint'].includes(modelFormatFilter) && + filteredCheckpointModels.length > 0 && ( + + + + Checkpoint + + {filteredCheckpointModels.map((model) => ( + + ))} + + + )} ); }; export default ModelList; + +const modelsFilter = ( + data: EntityState | undefined, + model_format: ModelFormat, + nameFilter: string +) => { + const filteredModels: MainModelConfigEntity[] = []; + forEach(data?.entities, (model) => { + if (!model) { + return; + } + + const matchesFilter = model.model_name + .toLowerCase() + .includes(nameFilter.toLowerCase()); + + const matchesFormat = model.model_format === model_format; + + if (matchesFilter && matchesFormat) { + filteredModels.push(model); + } + }); + return filteredModels; +}; + +const StyledModelContainer = (props: PropsWithChildren) => { + return ( + + {props.children} + + ); +}; diff --git a/invokeai/frontend/web/src/features/ui/components/tabs/ModelManager/subpanels/ModelManagerPanel/ModelListItem.tsx b/invokeai/frontend/web/src/features/ui/components/tabs/ModelManager/subpanels/ModelManagerPanel/ModelListItem.tsx index ab5fddd5ea..224b0ac003 100644 --- a/invokeai/frontend/web/src/features/ui/components/tabs/ModelManager/subpanels/ModelManagerPanel/ModelListItem.tsx +++ b/invokeai/frontend/web/src/features/ui/components/tabs/ModelManager/subpanels/ModelManagerPanel/ModelListItem.tsx @@ -1,98 +1,142 @@ -import { DeleteIcon, EditIcon } from '@chakra-ui/icons'; -import { Box, Flex, Spacer, Text, Tooltip } from '@chakra-ui/react'; - -// import { deleteModel, requestModelChange } from 'app/socketio/actions'; -import { RootState } from 'app/store/store'; +import { DeleteIcon } from '@chakra-ui/icons'; +import { Badge, Flex, Text, Tooltip } from '@chakra-ui/react'; +import { makeToast } from 'app/components/Toaster'; import { useAppDispatch, useAppSelector } from 'app/store/storeHooks'; import IAIAlertDialog from 'common/components/IAIAlertDialog'; +import IAIButton from 'common/components/IAIButton'; import IAIIconButton from 'common/components/IAIIconButton'; -import { setOpenModel } from 'features/system/store/systemSlice'; +import { selectIsBusy } from 'features/system/store/systemSelectors'; +import { addToast } from 'features/system/store/systemSlice'; +import { useCallback } from 'react'; import { useTranslation } from 'react-i18next'; +import { + MainModelConfigEntity, + useDeleteMainModelsMutation, +} from 'services/api/endpoints/models'; type ModelListItemProps = { - modelKey: string; - name: string; - description: string | undefined; + model: MainModelConfigEntity; + isSelected: boolean; + setSelectedModelId: (v: string | undefined) => void; +}; + +const modelBaseTypeMap = { + 'sd-1': 'SD1', + 'sd-2': 'SD2', + sdxl: 'SDXL', + 'sdxl-refiner': 'SDXLR', }; export default function ModelListItem(props: ModelListItemProps) { - const { isProcessing, isConnected } = useAppSelector( - (state: RootState) => state.system - ); - - const openModel = useAppSelector( - (state: RootState) => state.system.openModel - ); - + const isBusy = useAppSelector(selectIsBusy); const { t } = useTranslation(); - const dispatch = useAppDispatch(); + const [deleteMainModel] = useDeleteMainModelsMutation(); - const { modelKey, name, description } = props; + const { model, isSelected, setSelectedModelId } = props; - const openModelHandler = () => { - dispatch(setOpenModel(modelKey)); - }; + const handleSelectModel = useCallback(() => { + setSelectedModelId(model.id); + }, [model.id, setSelectedModelId]); - const handleModelDelete = () => { - dispatch(deleteModel(modelKey)); - dispatch(setOpenModel(null)); - }; + const handleModelDelete = useCallback(() => { + deleteMainModel(model) + .unwrap() + .then((_) => { + dispatch( + addToast( + makeToast({ + title: `${t('modelManager.modelDeleted')}: ${model.model_name}`, + status: 'success', + }) + ) + ); + }) + .catch((error) => { + if (error) { + dispatch( + addToast( + makeToast({ + title: `${t('modelManager.modelDeleteFailed')}: ${ + model.model_name + }`, + status: 'success', + }) + ) + ); + } + }); + setSelectedModelId(undefined); + }, [deleteMainModel, model, setSelectedModelId, dispatch, t]); return ( - + + + + { + modelBaseTypeMap[ + model.base_model as keyof typeof modelBaseTypeMap + ] } - : { - _hover: { - bg: 'base.750', - }, - } - } - > - - - {name} - - - - - } - size="sm" - onClick={openModelHandler} - aria-label={t('accessibility.modifyConfig')} - isDisabled={status === 'active' || isProcessing || !isConnected} - /> - } - size="sm" - aria-label={t('modelManager.deleteConfig')} - isDisabled={status === 'active' || isProcessing || !isConnected} - colorScheme="error" - /> - } - > - -

{t('modelManager.deleteMsg1')}

-

{t('modelManager.deleteMsg2')}

-
-
+
+ + {model.model_name} + +
+ } + aria-label={t('modelManager.deleteConfig')} + isDisabled={isBusy} + colorScheme="error" + /> + } + > + +

{t('modelManager.deleteMsg1')}

+

{t('modelManager.deleteMsg2')}

+
+
); } diff --git a/invokeai/frontend/web/src/features/ui/components/tabs/ModelManager/subpanels/shared/BaseModelSelect.tsx b/invokeai/frontend/web/src/features/ui/components/tabs/ModelManager/subpanels/shared/BaseModelSelect.tsx new file mode 100644 index 0000000000..4e8b5f2bc7 --- /dev/null +++ b/invokeai/frontend/web/src/features/ui/components/tabs/ModelManager/subpanels/shared/BaseModelSelect.tsx @@ -0,0 +1,28 @@ +import IAIMantineSelect, { + IAISelectDataType, + IAISelectProps, +} from 'common/components/IAIMantineSelect'; +import { MODEL_TYPE_MAP } from 'features/parameters/types/constants'; +import { useTranslation } from 'react-i18next'; + +const baseModelSelectData: IAISelectDataType[] = [ + { value: 'sd-1', label: MODEL_TYPE_MAP['sd-1'] }, + { value: 'sd-2', label: MODEL_TYPE_MAP['sd-2'] }, + { value: 'sdxl', label: MODEL_TYPE_MAP['sdxl'] }, + { value: 'sdxl-refiner', label: MODEL_TYPE_MAP['sdxl-refiner'] }, +]; + +type BaseModelSelectProps = Omit; + +export default function BaseModelSelect(props: BaseModelSelectProps) { + const { ...rest } = props; + const { t } = useTranslation(); + + return ( + + ); +} diff --git a/invokeai/frontend/web/src/features/ui/components/tabs/ModelManager/subpanels/shared/CheckpointConfigsSelect.tsx b/invokeai/frontend/web/src/features/ui/components/tabs/ModelManager/subpanels/shared/CheckpointConfigsSelect.tsx new file mode 100644 index 0000000000..3d6da22113 --- /dev/null +++ b/invokeai/frontend/web/src/features/ui/components/tabs/ModelManager/subpanels/shared/CheckpointConfigsSelect.tsx @@ -0,0 +1,22 @@ +import IAIMantineSelect, { + IAISelectProps, +} from 'common/components/IAIMantineSelect'; +import { useGetCheckpointConfigsQuery } from 'services/api/endpoints/models'; + +type CheckpointConfigSelectProps = Omit; + +export default function CheckpointConfigsSelect( + props: CheckpointConfigSelectProps +) { + const { data: availableCheckpointConfigs } = useGetCheckpointConfigsQuery(); + const { ...rest } = props; + + return ( + + ); +} diff --git a/invokeai/frontend/web/src/features/ui/components/tabs/ModelManager/subpanels/shared/ModelVariantSelect.tsx b/invokeai/frontend/web/src/features/ui/components/tabs/ModelManager/subpanels/shared/ModelVariantSelect.tsx new file mode 100644 index 0000000000..24f295fb73 --- /dev/null +++ b/invokeai/frontend/web/src/features/ui/components/tabs/ModelManager/subpanels/shared/ModelVariantSelect.tsx @@ -0,0 +1,26 @@ +import IAIMantineSelect, { + IAISelectDataType, + IAISelectProps, +} from 'common/components/IAIMantineSelect'; +import { useTranslation } from 'react-i18next'; + +const variantSelectData: IAISelectDataType[] = [ + { value: 'normal', label: 'Normal' }, + { value: 'inpaint', label: 'Inpaint' }, + { value: 'depth', label: 'Depth' }, +]; + +type VariantSelectProps = Omit; + +export default function ModelVariantSelect(props: VariantSelectProps) { + const { ...rest } = props; + const { t } = useTranslation(); + + return ( + + ); +} diff --git a/invokeai/frontend/web/src/features/ui/components/tabs/TextToImage/TextToImageTabMain.tsx b/invokeai/frontend/web/src/features/ui/components/tabs/TextToImage/TextToImageTabMain.tsx index de21cb14eb..1864e3d043 100644 --- a/invokeai/frontend/web/src/features/ui/components/tabs/TextToImage/TextToImageTabMain.tsx +++ b/invokeai/frontend/web/src/features/ui/components/tabs/TextToImage/TextToImageTabMain.tsx @@ -1,5 +1,5 @@ import { Box, Flex } from '@chakra-ui/react'; -import CurrentImageDisplay from 'features/gallery/components/CurrentImageDisplay'; +import CurrentImageDisplay from 'features/gallery/components/CurrentImage/CurrentImageDisplay'; const TextToImageTabMain = () => { return ( diff --git a/invokeai/frontend/web/src/features/ui/components/tabs/TextToImage/TextToImageTabParameters.tsx b/invokeai/frontend/web/src/features/ui/components/tabs/TextToImage/TextToImageTabParameters.tsx index 987f4ff0bc..3d3fd87851 100644 --- a/invokeai/frontend/web/src/features/ui/components/tabs/TextToImage/TextToImageTabParameters.tsx +++ b/invokeai/frontend/web/src/features/ui/components/tabs/TextToImage/TextToImageTabParameters.tsx @@ -4,7 +4,6 @@ import ParamAdvancedCollapse from 'features/parameters/components/Parameters/Adv import ParamControlNetCollapse from 'features/parameters/components/Parameters/ControlNet/ParamControlNetCollapse'; import ParamNegativeConditioning from 'features/parameters/components/Parameters/Core/ParamNegativeConditioning'; import ParamPositiveConditioning from 'features/parameters/components/Parameters/Core/ParamPositiveConditioning'; -import ParamHiresCollapse from 'features/parameters/components/Parameters/Hires/ParamHiresCollapse'; import ParamNoiseCollapse from 'features/parameters/components/Parameters/Noise/ParamNoiseCollapse'; import ParamSeamlessCollapse from 'features/parameters/components/Parameters/Seamless/ParamSeamlessCollapse'; import ParamSymmetryCollapse from 'features/parameters/components/Parameters/Symmetry/ParamSymmetryCollapse'; @@ -20,13 +19,12 @@ const TextToImageTabParameters = () => { + - - diff --git a/invokeai/frontend/web/src/features/ui/components/tabs/UnifiedCanvas/UnifiedCanvasBeta/UnifiedCanvasToolbar/UnifiedCanvasCopyToClipboard.tsx b/invokeai/frontend/web/src/features/ui/components/tabs/UnifiedCanvas/UnifiedCanvasBeta/UnifiedCanvasToolbar/UnifiedCanvasCopyToClipboard.tsx index 5e23a4c0d6..a68794a930 100644 --- a/invokeai/frontend/web/src/features/ui/components/tabs/UnifiedCanvas/UnifiedCanvasBeta/UnifiedCanvasToolbar/UnifiedCanvasCopyToClipboard.tsx +++ b/invokeai/frontend/web/src/features/ui/components/tabs/UnifiedCanvas/UnifiedCanvasBeta/UnifiedCanvasToolbar/UnifiedCanvasCopyToClipboard.tsx @@ -4,6 +4,8 @@ import IAIIconButton from 'common/components/IAIIconButton'; import { canvasCopiedToClipboard } from 'features/canvas/store/actions'; import { isStagingSelector } from 'features/canvas/store/canvasSelectors'; import { getCanvasBaseLayer } from 'features/canvas/util/konvaInstanceProvider'; +import { useCopyImageToClipboard } from 'features/ui/hooks/useCopyImageToClipboard'; +import { useCallback } from 'react'; import { useHotkeys } from 'react-hotkeys-hook'; import { useTranslation } from 'react-i18next'; import { FaCopy } from 'react-icons/fa'; @@ -11,6 +13,7 @@ import { FaCopy } from 'react-icons/fa'; export default function UnifiedCanvasCopyToClipboard() { const isStaging = useAppSelector(isStagingSelector); const canvasBaseLayer = getCanvasBaseLayer(); + const { isClipboardAPIAvailable } = useCopyImageToClipboard(); const isProcessing = useAppSelector( (state: RootState) => state.system.isProcessing @@ -25,15 +28,22 @@ export default function UnifiedCanvasCopyToClipboard() { handleCopyImageToClipboard(); }, { - enabled: () => !isStaging, + enabled: () => !isStaging && isClipboardAPIAvailable, preventDefault: true, }, - [canvasBaseLayer, isProcessing] + [canvasBaseLayer, isProcessing, isClipboardAPIAvailable] ); - const handleCopyImageToClipboard = () => { + const handleCopyImageToClipboard = useCallback(() => { + if (!isClipboardAPIAvailable) { + return; + } dispatch(canvasCopiedToClipboard()); - }; + }, [dispatch, isClipboardAPIAvailable]); + + if (!isClipboardAPIAvailable) { + return null; + } return ( { + - diff --git a/invokeai/frontend/web/src/features/ui/hooks/useCopyImageToClipboard.ts b/invokeai/frontend/web/src/features/ui/hooks/useCopyImageToClipboard.ts new file mode 100644 index 0000000000..314abad081 --- /dev/null +++ b/invokeai/frontend/web/src/features/ui/hooks/useCopyImageToClipboard.ts @@ -0,0 +1,52 @@ +import { useAppToaster } from 'app/components/Toaster'; +import { useCallback, useMemo } from 'react'; +import { useTranslation } from 'react-i18next'; + +export const useCopyImageToClipboard = () => { + const toaster = useAppToaster(); + const { t } = useTranslation(); + + const isClipboardAPIAvailable = useMemo(() => { + return Boolean(navigator.clipboard) && Boolean(window.ClipboardItem); + }, []); + + const copyImageToClipboard = useCallback( + async (image_url: string) => { + if (!isClipboardAPIAvailable) { + toaster({ + title: t('toast.problemCopyingImage'), + description: "Your browser doesn't support the Clipboard API.", + status: 'error', + duration: 2500, + isClosable: true, + }); + } + try { + const response = await fetch(image_url); + const blob = await response.blob(); + await navigator.clipboard.write([ + new ClipboardItem({ + [blob.type]: blob, + }), + ]); + toaster({ + title: t('toast.imageCopied'), + status: 'success', + duration: 2500, + isClosable: true, + }); + } catch (err) { + toaster({ + title: t('toast.problemCopyingImage'), + description: String(err), + status: 'error', + duration: 2500, + isClosable: true, + }); + } + }, + [isClipboardAPIAvailable, t, toaster] + ); + + return { isClipboardAPIAvailable, copyImageToClipboard }; +}; diff --git a/invokeai/frontend/web/src/features/ui/store/uiSlice.ts b/invokeai/frontend/web/src/features/ui/store/uiSlice.ts index 4f38f84fe2..ccce10f5c4 100644 --- a/invokeai/frontend/web/src/features/ui/store/uiSlice.ts +++ b/invokeai/frontend/web/src/features/ui/store/uiSlice.ts @@ -1,7 +1,7 @@ import type { PayloadAction } from '@reduxjs/toolkit'; import { createSlice } from '@reduxjs/toolkit'; import { initialImageChanged } from 'features/parameters/store/generationSlice'; -import { SchedulerParam } from 'features/parameters/store/parameterZodSchemas'; +import { SchedulerParam } from 'features/parameters/types/parameterSchemas'; import { setActiveTabReducer } from './extraReducers'; import { InvokeTabName } from './tabMap'; import { AddNewModelType, UIState } from './uiTypes'; diff --git a/invokeai/frontend/web/src/features/ui/store/uiTypes.ts b/invokeai/frontend/web/src/features/ui/store/uiTypes.ts index e574f0ab79..325e8e898f 100644 --- a/invokeai/frontend/web/src/features/ui/store/uiTypes.ts +++ b/invokeai/frontend/web/src/features/ui/store/uiTypes.ts @@ -1,6 +1,4 @@ -import { SchedulerParam } from 'features/parameters/store/parameterZodSchemas'; - -export type AddNewModelType = 'ckpt' | 'diffusers' | null; +import { SchedulerParam } from 'features/parameters/types/parameterSchemas'; export type Coordinates = { x: number; @@ -22,7 +20,6 @@ export interface UIState { shouldUseCanvasBetaLayout: boolean; shouldShowExistingModelsInSearch: boolean; shouldUseSliders: boolean; - addNewModelUIOption: AddNewModelType; shouldHidePreview: boolean; shouldPinGallery: boolean; shouldShowGallery: boolean; diff --git a/invokeai/frontend/web/src/index.ts b/invokeai/frontend/web/src/index.ts index e70e756ed9..add4999b6d 100644 --- a/invokeai/frontend/web/src/index.ts +++ b/invokeai/frontend/web/src/index.ts @@ -2,8 +2,8 @@ export { default as InvokeAIUI } from './app/components/InvokeAIUI'; export type { PartialAppConfig } from './app/types/invokeai'; export { default as IAIIconButton } from './common/components/IAIIconButton'; export { default as IAIPopover } from './common/components/IAIPopover'; +export { default as ParamMainModelSelect } from './features/parameters/components/Parameters/MainModel/ParamMainModelSelect'; +export { default as ColorModeButton } from './features/system/components/ColorModeButton'; export { default as InvokeAiLogoComponent } from './features/system/components/InvokeAILogoComponent'; -export { default as ModelSelect } from './features/system/components/ModelSelect'; export { default as SettingsModal } from './features/system/components/SettingsModal/SettingsModal'; export { default as StatusIndicator } from './features/system/components/StatusIndicator'; -export { default as ColorModeButton } from './features/system/components/ColorModeButton'; diff --git a/invokeai/frontend/web/src/mantine-theme/hooks/useMantineMultiSelectStyles.ts b/invokeai/frontend/web/src/mantine-theme/hooks/useMantineMultiSelectStyles.ts new file mode 100644 index 0000000000..688b65b96b --- /dev/null +++ b/invokeai/frontend/web/src/mantine-theme/hooks/useMantineMultiSelectStyles.ts @@ -0,0 +1,140 @@ +import { useColorMode, useToken } from '@chakra-ui/react'; +import { useChakraThemeTokens } from 'common/hooks/useChakraThemeTokens'; +import { useCallback } from 'react'; +import { mode } from 'theme/util/mode'; + +export const useMantineMultiSelectStyles = () => { + const { + base50, + base100, + base200, + base300, + base400, + base500, + base600, + base700, + base800, + base900, + accent200, + accent300, + accent400, + accent500, + accent600, + } = useChakraThemeTokens(); + + const { colorMode } = useColorMode(); + const [boxShadow] = useToken('shadows', ['dark-lg']); + + const styles = useCallback( + () => ({ + label: { + color: mode(base700, base300)(colorMode), + }, + separatorLabel: { + color: mode(base500, base500)(colorMode), + '::after': { borderTopColor: mode(base300, base700)(colorMode) }, + }, + searchInput: { + ':placeholder': { + color: mode(base300, base700)(colorMode), + }, + }, + input: { + backgroundColor: mode(base50, base900)(colorMode), + borderWidth: '2px', + borderColor: mode(base200, base800)(colorMode), + color: mode(base900, base100)(colorMode), + paddingRight: 24, + fontWeight: 600, + '&:hover': { borderColor: mode(base300, base600)(colorMode) }, + '&:focus': { + borderColor: mode(accent300, accent600)(colorMode), + }, + '&:is(:focus, :hover)': { + borderColor: mode(base400, base500)(colorMode), + }, + '&:focus-within': { + borderColor: mode(accent200, accent600)(colorMode), + }, + '&[data-disabled]': { + backgroundColor: mode(base300, base700)(colorMode), + color: mode(base600, base400)(colorMode), + cursor: 'not-allowed', + }, + }, + value: { + backgroundColor: mode(base200, base800)(colorMode), + color: mode(base900, base100)(colorMode), + button: { + color: mode(base900, base100)(colorMode), + }, + '&:hover': { + backgroundColor: mode(base300, base700)(colorMode), + cursor: 'pointer', + }, + }, + dropdown: { + backgroundColor: mode(base200, base800)(colorMode), + borderColor: mode(base200, base800)(colorMode), + boxShadow, + }, + item: { + backgroundColor: mode(base200, base800)(colorMode), + color: mode(base800, base200)(colorMode), + padding: 6, + '&[data-hovered]': { + color: mode(base900, base100)(colorMode), + backgroundColor: mode(base300, base700)(colorMode), + }, + '&[data-active]': { + backgroundColor: mode(base300, base700)(colorMode), + '&:hover': { + color: mode(base900, base100)(colorMode), + backgroundColor: mode(base300, base700)(colorMode), + }, + }, + '&[data-selected]': { + backgroundColor: mode(accent400, accent600)(colorMode), + color: mode(base50, base100)(colorMode), + fontWeight: 600, + '&:hover': { + backgroundColor: mode(accent500, accent500)(colorMode), + color: mode('white', base50)(colorMode), + }, + }, + '&[data-disabled]': { + color: mode(base500, base600)(colorMode), + cursor: 'not-allowed', + }, + }, + rightSection: { + width: 24, + padding: 20, + button: { + color: mode(base900, base100)(colorMode), + }, + }, + }), + [ + accent200, + accent300, + accent400, + accent500, + accent600, + base100, + base200, + base300, + base400, + base50, + base500, + base600, + base700, + base800, + base900, + boxShadow, + colorMode, + ] + ); + + return styles; +}; diff --git a/invokeai/frontend/web/src/mantine-theme/hooks/useMantineSelectStyles.ts b/invokeai/frontend/web/src/mantine-theme/hooks/useMantineSelectStyles.ts new file mode 100644 index 0000000000..f8aa16558f --- /dev/null +++ b/invokeai/frontend/web/src/mantine-theme/hooks/useMantineSelectStyles.ts @@ -0,0 +1,134 @@ +import { useColorMode, useToken } from '@chakra-ui/react'; +import { useChakraThemeTokens } from 'common/hooks/useChakraThemeTokens'; +import { useCallback } from 'react'; +import { mode } from 'theme/util/mode'; + +export const useMantineSelectStyles = () => { + const { + base50, + base100, + base200, + base300, + base400, + base500, + base600, + base700, + base800, + base900, + accent200, + accent300, + accent400, + accent500, + accent600, + } = useChakraThemeTokens(); + + const { colorMode } = useColorMode(); + const [boxShadow] = useToken('shadows', ['dark-lg']); + + const styles = useCallback( + () => ({ + label: { + color: mode(base700, base300)(colorMode), + }, + separatorLabel: { + color: mode(base500, base500)(colorMode), + '::after': { borderTopColor: mode(base300, base700)(colorMode) }, + }, + input: { + backgroundColor: mode(base50, base900)(colorMode), + borderWidth: '2px', + borderColor: mode(base200, base800)(colorMode), + color: mode(base900, base100)(colorMode), + paddingRight: 24, + fontWeight: 600, + '&:hover': { borderColor: mode(base300, base600)(colorMode) }, + '&:focus': { + borderColor: mode(accent300, accent600)(colorMode), + }, + '&:is(:focus, :hover)': { + borderColor: mode(base400, base500)(colorMode), + }, + '&:focus-within': { + borderColor: mode(accent200, accent600)(colorMode), + }, + '&[data-disabled]': { + backgroundColor: mode(base300, base700)(colorMode), + color: mode(base600, base400)(colorMode), + cursor: 'not-allowed', + }, + }, + value: { + backgroundColor: mode(base100, base900)(colorMode), + color: mode(base900, base100)(colorMode), + button: { + color: mode(base900, base100)(colorMode), + }, + '&:hover': { + backgroundColor: mode(base300, base700)(colorMode), + cursor: 'pointer', + }, + }, + dropdown: { + backgroundColor: mode(base200, base800)(colorMode), + borderColor: mode(base200, base800)(colorMode), + boxShadow, + }, + item: { + backgroundColor: mode(base200, base800)(colorMode), + color: mode(base800, base200)(colorMode), + padding: 6, + '&[data-hovered]': { + color: mode(base900, base100)(colorMode), + backgroundColor: mode(base300, base700)(colorMode), + }, + '&[data-active]': { + backgroundColor: mode(base300, base700)(colorMode), + '&:hover': { + color: mode(base900, base100)(colorMode), + backgroundColor: mode(base300, base700)(colorMode), + }, + }, + '&[data-selected]': { + backgroundColor: mode(accent400, accent600)(colorMode), + color: mode(base50, base100)(colorMode), + fontWeight: 600, + '&:hover': { + backgroundColor: mode(accent500, accent500)(colorMode), + color: mode('white', base50)(colorMode), + }, + }, + '&[data-disabled]': { + color: mode(base500, base600)(colorMode), + cursor: 'not-allowed', + }, + }, + rightSection: { + width: 32, + button: { + color: mode(base900, base100)(colorMode), + }, + }, + }), + [ + accent200, + accent300, + accent400, + accent500, + accent600, + base100, + base200, + base300, + base400, + base50, + base500, + base600, + base700, + base800, + base900, + boxShadow, + colorMode, + ] + ); + + return styles; +}; diff --git a/invokeai/frontend/web/src/mantine-theme/theme.ts b/invokeai/frontend/web/src/mantine-theme/theme.ts index 21dbd285f1..3dcbf80b90 100644 --- a/invokeai/frontend/web/src/mantine-theme/theme.ts +++ b/invokeai/frontend/web/src/mantine-theme/theme.ts @@ -1,23 +1,31 @@ import { MantineThemeOverride } from '@mantine/core'; +import { useMemo } from 'react'; -export const mantineTheme: MantineThemeOverride = { - colorScheme: 'dark', - fontFamily: `'Inter Variable', sans-serif`, - components: { - ScrollArea: { - defaultProps: { - scrollbarSize: 10, - }, - styles: { - scrollbar: { - '&:hover': { - backgroundColor: 'var(--invokeai-colors-baseAlpha-300)', +export const useMantineTheme = () => { + const mantineTheme: MantineThemeOverride = useMemo( + () => ({ + colorScheme: 'dark', + fontFamily: `'Inter Variable', sans-serif`, + components: { + ScrollArea: { + defaultProps: { + scrollbarSize: 10, + }, + styles: { + scrollbar: { + '&:hover': { + backgroundColor: 'var(--invokeai-colors-baseAlpha-300)', + }, + }, + thumb: { + backgroundColor: 'var(--invokeai-colors-baseAlpha-300)', + }, }, }, - thumb: { - backgroundColor: 'var(--invokeai-colors-baseAlpha-300)', - }, }, - }, - }, + }), + [] + ); + + return mantineTheme; }; diff --git a/invokeai/frontend/web/src/services/api/endpoints/boardImages.ts b/invokeai/frontend/web/src/services/api/endpoints/boardImages.ts index a0db3f3dff..39deaf4172 100644 --- a/invokeai/frontend/web/src/services/api/endpoints/boardImages.ts +++ b/invokeai/frontend/web/src/services/api/endpoints/boardImages.ts @@ -1,7 +1,6 @@ import { OffsetPaginatedResults_ImageDTO_ } from 'services/api/types'; -import { api } from '..'; +import { ApiFullTagDescription, LIST_TAG, api } from '..'; import { paths } from '../schema'; -import { imagesApi } from './images'; type ListBoardImagesArg = paths['/api/v1/board_images/{board_id}']['get']['parameters']['path'] & @@ -25,9 +24,26 @@ export const boardImagesApi = api.injectEndpoints({ >({ query: ({ board_id, offset, limit }) => ({ url: `board_images/${board_id}`, - method: 'DELETE', - body: { offset, limit }, + method: 'GET', }), + providesTags: (result, error, arg) => { + // any list of boardimages + const tags: ApiFullTagDescription[] = [ + { type: 'BoardImage', id: `${arg.board_id}_${LIST_TAG}` }, + ]; + + if (result) { + // and individual tags for each boardimage + tags.push( + ...result.items.map(({ board_id, image_name }) => ({ + type: 'BoardImage' as const, + id: `${board_id}_${image_name}`, + })) + ); + } + + return tags; + }, }), /** @@ -41,23 +57,9 @@ export const boardImagesApi = api.injectEndpoints({ body: { board_id, image_name }, }), invalidatesTags: (result, error, arg) => [ + { type: 'BoardImage' }, { type: 'Board', id: arg.board_id }, ], - async onQueryStarted( - { image_name, ...patch }, - { dispatch, queryFulfilled } - ) { - const patchResult = dispatch( - imagesApi.util.updateQueryData('getImageDTO', image_name, (draft) => { - Object.assign(draft, patch); - }) - ); - try { - await queryFulfilled; - } catch { - patchResult.undo(); - } - }, }), removeImageFromBoard: build.mutation({ @@ -67,23 +69,9 @@ export const boardImagesApi = api.injectEndpoints({ body: { board_id, image_name }, }), invalidatesTags: (result, error, arg) => [ + { type: 'BoardImage' }, { type: 'Board', id: arg.board_id }, ], - async onQueryStarted( - { image_name, ...patch }, - { dispatch, queryFulfilled } - ) { - const patchResult = dispatch( - imagesApi.util.updateQueryData('getImageDTO', image_name, (draft) => { - Object.assign(draft, { board_id: null }); - }) - ); - try { - await queryFulfilled; - } catch { - patchResult.undo(); - } - }, }), }), }); diff --git a/invokeai/frontend/web/src/services/api/endpoints/boards.ts b/invokeai/frontend/web/src/services/api/endpoints/boards.ts index 64ab21075d..fc3cb530a4 100644 --- a/invokeai/frontend/web/src/services/api/endpoints/boards.ts +++ b/invokeai/frontend/web/src/services/api/endpoints/boards.ts @@ -20,7 +20,7 @@ export const boardsApi = api.injectEndpoints({ query: (arg) => ({ url: 'boards/', params: arg }), providesTags: (result, error, arg) => { // any list of boards - const tags: ApiFullTagDescription[] = [{ id: 'Board', type: LIST_TAG }]; + const tags: ApiFullTagDescription[] = [{ type: 'Board', id: LIST_TAG }]; if (result) { // and individual tags for each board @@ -43,7 +43,7 @@ export const boardsApi = api.injectEndpoints({ }), providesTags: (result, error, arg) => { // any list of boards - const tags: ApiFullTagDescription[] = [{ id: 'Board', type: LIST_TAG }]; + const tags: ApiFullTagDescription[] = [{ type: 'Board', id: LIST_TAG }]; if (result) { // and individual tags for each board @@ -69,7 +69,7 @@ export const boardsApi = api.injectEndpoints({ method: 'POST', params: { board_name }, }), - invalidatesTags: [{ id: 'Board', type: LIST_TAG }], + invalidatesTags: [{ type: 'Board', id: LIST_TAG }], }), updateBoard: build.mutation({ @@ -87,8 +87,15 @@ export const boardsApi = api.injectEndpoints({ invalidatesTags: (result, error, arg) => [{ type: 'Board', id: arg }], }), deleteBoardAndImages: build.mutation({ - query: (board_id) => ({ url: `boards/${board_id}`, method: 'DELETE', params: { include_images: true } }), - invalidatesTags: (result, error, arg) => [{ type: 'Board', id: arg }, { type: 'Image', id: LIST_TAG }], + query: (board_id) => ({ + url: `boards/${board_id}`, + method: 'DELETE', + params: { include_images: true }, + }), + invalidatesTags: (result, error, arg) => [ + { type: 'Board', id: arg }, + { type: 'Image', id: LIST_TAG }, + ], }), }), }); @@ -99,5 +106,5 @@ export const { useCreateBoardMutation, useUpdateBoardMutation, useDeleteBoardMutation, - useDeleteBoardAndImagesMutation + useDeleteBoardAndImagesMutation, } = boardsApi; diff --git a/invokeai/frontend/web/src/services/api/endpoints/models.ts b/invokeai/frontend/web/src/services/api/endpoints/models.ts index 3588886957..9a070ee6b4 100644 --- a/invokeai/frontend/web/src/services/api/endpoints/models.ts +++ b/invokeai/frontend/web/src/services/api/endpoints/models.ts @@ -2,17 +2,31 @@ import { EntityState, createEntityAdapter } from '@reduxjs/toolkit'; import { cloneDeep } from 'lodash-es'; import { AnyModelConfig, + BaseModelType, + CheckpointModelConfig, ControlNetModelConfig, + ConvertModelConfig, + DiffusersModelConfig, + ImportModelConfig, LoRAModelConfig, MainModelConfig, OnnxModelConfig, + MergeModelConfig, TextualInversionModelConfig, VaeModelConfig, } from 'services/api/types'; +import queryString from 'query-string'; import { ApiFullTagDescription, LIST_TAG, api } from '..'; +import { operations, paths } from '../schema'; -export type MainModelConfigEntity = MainModelConfig & { id: string }; +export type DiffusersModelConfigEntity = DiffusersModelConfig & { id: string }; +export type CheckpointModelConfigEntity = CheckpointModelConfig & { + id: string; +}; +export type MainModelConfigEntity = + | DiffusersModelConfigEntity + | CheckpointModelConfigEntity; export type OnnxModelConfigEntity = OnnxModelConfig & { id: string }; @@ -36,6 +50,61 @@ type AnyModelConfigEntity = | TextualInversionModelConfigEntity | VaeModelConfigEntity; +type UpdateMainModelArg = { + base_model: BaseModelType; + model_name: string; + body: MainModelConfig; +}; + +type UpdateMainModelResponse = + paths['/api/v1/models/{base_model}/{model_type}/{model_name}']['patch']['responses']['200']['content']['application/json']; + +type DeleteMainModelArg = { + base_model: BaseModelType; + model_name: string; +}; + +type DeleteMainModelResponse = void; + +type ConvertMainModelArg = { + base_model: BaseModelType; + model_name: string; + params: ConvertModelConfig; +}; + +type ConvertMainModelResponse = + paths['/api/v1/models/convert/{base_model}/{model_type}/{model_name}']['put']['responses']['200']['content']['application/json']; + +type MergeMainModelArg = { + base_model: BaseModelType; + body: MergeModelConfig; +}; + +type MergeMainModelResponse = + paths['/api/v1/models/merge/{base_model}']['put']['responses']['200']['content']['application/json']; + +type ImportMainModelArg = { + body: ImportModelConfig; +}; + +type ImportMainModelResponse = + paths['/api/v1/models/import']['post']['responses']['201']['content']['application/json']; + +type AddMainModelArg = { + body: MainModelConfig; +}; + +type AddMainModelResponse = + paths['/api/v1/models/add']['post']['responses']['201']['content']['application/json']; + +export type SearchFolderResponse = + paths['/api/v1/models/search']['get']['responses']['200']['content']['application/json']; + +type CheckpointConfigsResponse = + paths['/api/v1/models/ckpt_confs']['get']['responses']['200']['content']['application/json']; + +type SearchFolderArg = operations['search_for_models']['parameters']['query']; + const mainModelsAdapter = createEntityAdapter({ sortComparer: (a, b) => a.model_name.localeCompare(b.model_name), }); @@ -116,7 +185,7 @@ export const modelsApi = api.injectEndpoints({ query: () => ({ url: 'models/', params: { model_type: 'main' } }), providesTags: (result, error, arg) => { const tags: ApiFullTagDescription[] = [ - { id: 'MainModel', type: LIST_TAG }, + { type: 'MainModel', id: LIST_TAG }, ]; if (result) { @@ -144,11 +213,82 @@ export const modelsApi = api.injectEndpoints({ ); }, }), + updateMainModels: build.mutation< + UpdateMainModelResponse, + UpdateMainModelArg + >({ + query: ({ base_model, model_name, body }) => { + return { + url: `models/${base_model}/main/${model_name}`, + method: 'PATCH', + body: body, + }; + }, + invalidatesTags: [{ type: 'MainModel', id: LIST_TAG }], + }), + importMainModels: build.mutation< + ImportMainModelResponse, + ImportMainModelArg + >({ + query: ({ body }) => { + return { + url: `models/import`, + method: 'POST', + body: body, + }; + }, + invalidatesTags: [{ type: 'MainModel', id: LIST_TAG }], + }), + addMainModels: build.mutation({ + query: ({ body }) => { + return { + url: `models/add`, + method: 'POST', + body: body, + }; + }, + invalidatesTags: [{ type: 'MainModel', id: LIST_TAG }], + }), + deleteMainModels: build.mutation< + DeleteMainModelResponse, + DeleteMainModelArg + >({ + query: ({ base_model, model_name }) => { + return { + url: `models/${base_model}/main/${model_name}`, + method: 'DELETE', + }; + }, + invalidatesTags: [{ type: 'MainModel', id: LIST_TAG }], + }), + convertMainModels: build.mutation< + ConvertMainModelResponse, + ConvertMainModelArg + >({ + query: ({ base_model, model_name, params }) => { + return { + url: `models/convert/${base_model}/main/${model_name}`, + method: 'PUT', + params: params, + }; + }, + invalidatesTags: [{ type: 'MainModel', id: LIST_TAG }], + }), + mergeMainModels: build.mutation({ + query: ({ base_model, body }) => { + return { + url: `models/merge/${base_model}`, + method: 'PUT', + body: body, + }; + }, + invalidatesTags: [{ type: 'MainModel', id: LIST_TAG }], + }), getLoRAModels: build.query, void>({ query: () => ({ url: 'models/', params: { model_type: 'lora' } }), providesTags: (result, error, arg) => { const tags: ApiFullTagDescription[] = [ - { id: 'LoRAModel', type: LIST_TAG }, + { type: 'LoRAModel', id: LIST_TAG }, ]; if (result) { @@ -183,7 +323,7 @@ export const modelsApi = api.injectEndpoints({ query: () => ({ url: 'models/', params: { model_type: 'controlnet' } }), providesTags: (result, error, arg) => { const tags: ApiFullTagDescription[] = [ - { id: 'ControlNetModel', type: LIST_TAG }, + { type: 'ControlNetModel', id: LIST_TAG }, ]; if (result) { @@ -215,7 +355,7 @@ export const modelsApi = api.injectEndpoints({ query: () => ({ url: 'models/', params: { model_type: 'vae' } }), providesTags: (result, error, arg) => { const tags: ApiFullTagDescription[] = [ - { id: 'VaeModel', type: LIST_TAG }, + { type: 'VaeModel', id: LIST_TAG }, ]; if (result) { @@ -250,7 +390,7 @@ export const modelsApi = api.injectEndpoints({ query: () => ({ url: 'models/', params: { model_type: 'embedding' } }), providesTags: (result, error, arg) => { const tags: ApiFullTagDescription[] = [ - { id: 'TextualInversionModel', type: LIST_TAG }, + { type: 'TextualInversionModel', id: LIST_TAG }, ]; if (result) { @@ -278,6 +418,36 @@ export const modelsApi = api.injectEndpoints({ ); }, }), + getModelsInFolder: build.query({ + query: (arg) => { + const folderQueryStr = queryString.stringify(arg, {}); + return { + url: `/models/search?${folderQueryStr}`, + }; + }, + providesTags: (result, error, arg) => { + const tags: ApiFullTagDescription[] = [ + { type: 'ScannedModels', id: LIST_TAG }, + ]; + + if (result) { + tags.push( + ...result.map((id) => ({ + type: 'ScannedModels' as const, + id, + })) + ); + } + return tags; + }, + }), + getCheckpointConfigs: build.query({ + query: () => { + return { + url: `/models/ckpt_confs`, + }; + }, + }), }), }); @@ -288,4 +458,12 @@ export const { useGetLoRAModelsQuery, useGetTextualInversionModelsQuery, useGetVaeModelsQuery, + useUpdateMainModelsMutation, + useDeleteMainModelsMutation, + useImportMainModelsMutation, + useAddMainModelsMutation, + useConvertMainModelsMutation, + useMergeMainModelsMutation, + useGetModelsInFolderQuery, + useGetCheckpointConfigsQuery, } = modelsApi; diff --git a/invokeai/frontend/web/src/services/api/schema.d.ts b/invokeai/frontend/web/src/services/api/schema.d.ts index a1fb4844de..e794a286d3 100644 --- a/invokeai/frontend/web/src/services/api/schema.d.ts +++ b/invokeai/frontend/web/src/services/api/schema.d.ts @@ -75,11 +75,6 @@ export type paths = { * @description Gets a list of models */ get: operations["list_models"]; - /** - * Import Model - * @description Add a model using its local path, repo_id, or remote URL - */ - post: operations["import_model"]; }; "/api/v1/models/{base_model}/{model_type}/{model_name}": { /** @@ -89,17 +84,50 @@ export type paths = { delete: operations["del_model"]; /** * Update Model - * @description Add Model + * @description Update model contents with a new config. If the model name or base fields are changed, then the model is renamed. */ patch: operations["update_model"]; }; + "/api/v1/models/import": { + /** + * Import Model + * @description Add a model using its local path, repo_id, or remote URL. Model characteristics will be probed and configured automatically + */ + post: operations["import_model"]; + }; + "/api/v1/models/add": { + /** + * Add Model + * @description Add a model using the configuration information appropriate for its type. Only local models can be added by path + */ + post: operations["add_model"]; + }; "/api/v1/models/convert/{base_model}/{model_type}/{model_name}": { /** * Convert Model - * @description Convert a checkpoint model into a diffusers model + * @description Convert a checkpoint model into a diffusers model, optionally saving to the indicated destination directory, or `models` if none. */ put: operations["convert_model"]; }; + "/api/v1/models/search": { + /** Search For Models */ + get: operations["search_for_models"]; + }; + "/api/v1/models/ckpt_confs": { + /** + * List Ckpt Configs + * @description Return a list of the legacy checkpoint configuration files stored in `ROOT/configs/stable-diffusion`, relative to ROOT. + */ + get: operations["list_ckpt_configs"]; + }; + "/api/v1/models/sync": { + /** + * Sync To Config + * @description Call after making changes to models.yaml, autoimport directories or models directory to synchronize + * in-memory data structures with disk data structures. + */ + get: operations["sync_to_config"]; + }; "/api/v1/models/merge/{base_model}": { /** * Merge Models @@ -288,7 +316,7 @@ export type components = { * @description An enumeration. * @enum {string} */ - BaseModelType: "sd-1" | "sd-2"; + BaseModelType: "sd-1" | "sd-2" | "sdxl" | "sdxl-refiner"; /** BoardChanges */ BoardChanges: { /** @@ -397,6 +425,11 @@ export type components = { * @default false */ force?: boolean; + /** + * Merge Dest Directory + * @description Save the merged model to the designated directory (with 'merged_model_name' appended) + */ + merge_dest_directory?: string; }; /** Body_remove_board_image */ Body_remove_board_image: { @@ -734,7 +767,7 @@ export type components = { * Control Model * @description The ControlNet model to use */ - control_model: string; + control_model: components["schemas"]["ControlNetModelField"]; /** * Control Weight * @description The weight given to the ControlNet @@ -791,10 +824,9 @@ export type components = { /** * Control Model * @description control model used - * @default lllyasviel/sd-controlnet-canny - * @enum {string} + * @default lllyasviel/sd-controlnet-canny */ - control_model?: "lllyasviel/sd-controlnet-canny" | "lllyasviel/sd-controlnet-depth" | "lllyasviel/sd-controlnet-hed" | "lllyasviel/sd-controlnet-seg" | "lllyasviel/sd-controlnet-openpose" | "lllyasviel/sd-controlnet-scribble" | "lllyasviel/sd-controlnet-normal" | "lllyasviel/sd-controlnet-mlsd" | "lllyasviel/control_v11p_sd15_canny" | "lllyasviel/control_v11p_sd15_openpose" | "lllyasviel/control_v11p_sd15_seg" | "lllyasviel/control_v11f1p_sd15_depth" | "lllyasviel/control_v11p_sd15_normalbae" | "lllyasviel/control_v11p_sd15_scribble" | "lllyasviel/control_v11p_sd15_mlsd" | "lllyasviel/control_v11p_sd15_softedge" | "lllyasviel/control_v11p_sd15s2_lineart_anime" | "lllyasviel/control_v11p_sd15_lineart" | "lllyasviel/control_v11p_sd15_inpaint" | "lllyasviel/control_v11e_sd15_shuffle" | "lllyasviel/control_v11e_sd15_ip2p" | "lllyasviel/control_v11f1e_sd15_tile" | "thibaud/controlnet-sd21-openpose-diffusers" | "thibaud/controlnet-sd21-canny-diffusers" | "thibaud/controlnet-sd21-depth-diffusers" | "thibaud/controlnet-sd21-scribble-diffusers" | "thibaud/controlnet-sd21-hed-diffusers" | "thibaud/controlnet-sd21-zoedepth-diffusers" | "thibaud/controlnet-sd21-color-diffusers" | "thibaud/controlnet-sd21-openposev2-diffusers" | "thibaud/controlnet-sd21-lineart-diffusers" | "thibaud/controlnet-sd21-normalbae-diffusers" | "thibaud/controlnet-sd21-ade20k-diffusers" | "CrucibleAI/ControlNetMediaPipeFace,diffusion_sd15" | "CrucibleAI/ControlNetMediaPipeFace"; + control_model?: components["schemas"]["ControlNetModelField"]; /** * Control Weight * @description The weight given to the ControlNet @@ -838,6 +870,19 @@ export type components = { model_format: components["schemas"]["ControlNetModelFormat"]; error?: components["schemas"]["ModelError"]; }; + /** + * ControlNetModelField + * @description ControlNet model field + */ + ControlNetModelField: { + /** + * Model Name + * @description Name of the ControlNet model + */ + model_name: string; + /** @description Base model */ + base_model: components["schemas"]["BaseModelType"]; + }; /** * ControlNetModelFormat * @description An enumeration. @@ -1060,6 +1105,41 @@ export type components = { */ combinatorial?: boolean; }; + /** + * ESRGANInvocation + * @description Upscales an image using RealESRGAN. + */ + ESRGANInvocation: { + /** + * Id + * @description The id of this node. Must be unique among all nodes. + */ + id: string; + /** + * Is Intermediate + * @description Whether or not this node is an intermediate node. + * @default false + */ + is_intermediate?: boolean; + /** + * Type + * @default esrgan + * @enum {string} + */ + type?: "esrgan"; + /** + * Image + * @description The input image + */ + image?: components["schemas"]["ImageField"]; + /** + * Model Name + * @description The Real-ESRGAN model to use + * @default RealESRGAN_x4plus.pth + * @enum {string} + */ + model_name?: "RealESRGAN_x4plus.pth" | "RealESRGAN_x4plus_anime_6B.pth" | "ESRGAN_SRx4_DF2KOST_official-ff704c30.pth" | "RealESRGAN_x2plus.pth"; + }; /** Edge */ Edge: { /** @@ -1174,7 +1254,11 @@ export type components = { * @description The nodes in this graph */ nodes?: { +<<<<<<< HEAD [key: string]: (components["schemas"]["LoadImageInvocation"] | components["schemas"]["ShowImageInvocation"] | components["schemas"]["ImageCropInvocation"] | components["schemas"]["ImagePasteInvocation"] | components["schemas"]["MaskFromAlphaInvocation"] | components["schemas"]["ImageMultiplyInvocation"] | components["schemas"]["ImageChannelInvocation"] | components["schemas"]["ImageConvertInvocation"] | components["schemas"]["ImageBlurInvocation"] | components["schemas"]["ImageResizeInvocation"] | components["schemas"]["ImageScaleInvocation"] | components["schemas"]["ImageLerpInvocation"] | components["schemas"]["ImageInverseLerpInvocation"] | components["schemas"]["ControlNetInvocation"] | components["schemas"]["ImageProcessorInvocation"] | components["schemas"]["MainModelLoaderInvocation"] | components["schemas"]["OnnxModelLoaderInvocation"] | components["schemas"]["LoraLoaderInvocation"] | components["schemas"]["VaeLoaderInvocation"] | components["schemas"]["MetadataAccumulatorInvocation"] | components["schemas"]["DynamicPromptInvocation"] | components["schemas"]["CompelInvocation"] | components["schemas"]["ClipSkipInvocation"] | components["schemas"]["AddInvocation"] | components["schemas"]["SubtractInvocation"] | components["schemas"]["MultiplyInvocation"] | components["schemas"]["DivideInvocation"] | components["schemas"]["RandomIntInvocation"] | components["schemas"]["ParamIntInvocation"] | components["schemas"]["ParamFloatInvocation"] | components["schemas"]["TextToLatentsInvocation"] | components["schemas"]["LatentsToImageInvocation"] | components["schemas"]["ONNXLatentsToImageInvocation"] | components["schemas"]["ResizeLatentsInvocation"] | components["schemas"]["ScaleLatentsInvocation"] | components["schemas"]["ImageToLatentsInvocation"] | components["schemas"]["CvInpaintInvocation"] | components["schemas"]["RangeInvocation"] | components["schemas"]["RangeOfSizeInvocation"] | components["schemas"]["RandomRangeInvocation"] | components["schemas"]["ImageCollectionInvocation"] | components["schemas"]["FloatLinearRangeInvocation"] | components["schemas"]["StepParamEasingInvocation"] | components["schemas"]["NoiseInvocation"] | components["schemas"]["UpscaleInvocation"] | components["schemas"]["RestoreFaceInvocation"] | components["schemas"]["InpaintInvocation"] | components["schemas"]["InfillColorInvocation"] | components["schemas"]["InfillTileInvocation"] | components["schemas"]["InfillPatchMatchInvocation"] | components["schemas"]["GraphInvocation"] | components["schemas"]["IterateInvocation"] | components["schemas"]["CollectInvocation"] | components["schemas"]["CannyImageProcessorInvocation"] | components["schemas"]["HedImageProcessorInvocation"] | components["schemas"]["LineartImageProcessorInvocation"] | components["schemas"]["LineartAnimeImageProcessorInvocation"] | components["schemas"]["OpenposeImageProcessorInvocation"] | components["schemas"]["MidasDepthImageProcessorInvocation"] | components["schemas"]["NormalbaeImageProcessorInvocation"] | components["schemas"]["MlsdImageProcessorInvocation"] | components["schemas"]["PidiImageProcessorInvocation"] | components["schemas"]["ContentShuffleImageProcessorInvocation"] | components["schemas"]["ZoeDepthImageProcessorInvocation"] | components["schemas"]["MediapipeFaceProcessorInvocation"] | components["schemas"]["LeresImageProcessorInvocation"] | components["schemas"]["TileResamplerProcessorInvocation"] | components["schemas"]["SegmentAnythingProcessorInvocation"] | components["schemas"]["LatentsToLatentsInvocation"]) | undefined; +======= + [key: string]: (components["schemas"]["LoadImageInvocation"] | components["schemas"]["ShowImageInvocation"] | components["schemas"]["ImageCropInvocation"] | components["schemas"]["ImagePasteInvocation"] | components["schemas"]["MaskFromAlphaInvocation"] | components["schemas"]["ImageMultiplyInvocation"] | components["schemas"]["ImageChannelInvocation"] | components["schemas"]["ImageConvertInvocation"] | components["schemas"]["ImageBlurInvocation"] | components["schemas"]["ImageResizeInvocation"] | components["schemas"]["ImageScaleInvocation"] | components["schemas"]["ImageLerpInvocation"] | components["schemas"]["ImageInverseLerpInvocation"] | components["schemas"]["ControlNetInvocation"] | components["schemas"]["ImageProcessorInvocation"] | components["schemas"]["MainModelLoaderInvocation"] | components["schemas"]["LoraLoaderInvocation"] | components["schemas"]["VaeLoaderInvocation"] | components["schemas"]["MetadataAccumulatorInvocation"] | components["schemas"]["CvInpaintInvocation"] | components["schemas"]["CompelInvocation"] | components["schemas"]["SDXLCompelPromptInvocation"] | components["schemas"]["SDXLRefinerCompelPromptInvocation"] | components["schemas"]["SDXLRawPromptInvocation"] | components["schemas"]["SDXLRefinerRawPromptInvocation"] | components["schemas"]["ClipSkipInvocation"] | components["schemas"]["TextToLatentsInvocation"] | components["schemas"]["LatentsToImageInvocation"] | components["schemas"]["ResizeLatentsInvocation"] | components["schemas"]["ScaleLatentsInvocation"] | components["schemas"]["ImageToLatentsInvocation"] | components["schemas"]["InpaintInvocation"] | components["schemas"]["AddInvocation"] | components["schemas"]["SubtractInvocation"] | components["schemas"]["MultiplyInvocation"] | components["schemas"]["DivideInvocation"] | components["schemas"]["RandomIntInvocation"] | components["schemas"]["ParamIntInvocation"] | components["schemas"]["ParamFloatInvocation"] | components["schemas"]["ParamStringInvocation"] | components["schemas"]["ESRGANInvocation"] | components["schemas"]["RangeInvocation"] | components["schemas"]["RangeOfSizeInvocation"] | components["schemas"]["RandomRangeInvocation"] | components["schemas"]["ImageCollectionInvocation"] | components["schemas"]["DynamicPromptInvocation"] | components["schemas"]["PromptsFromFileInvocation"] | components["schemas"]["InfillColorInvocation"] | components["schemas"]["InfillTileInvocation"] | components["schemas"]["InfillPatchMatchInvocation"] | components["schemas"]["NoiseInvocation"] | components["schemas"]["SDXLModelLoaderInvocation"] | components["schemas"]["SDXLRefinerModelLoaderInvocation"] | components["schemas"]["SDXLTextToLatentsInvocation"] | components["schemas"]["SDXLLatentsToLatentsInvocation"] | components["schemas"]["FloatLinearRangeInvocation"] | components["schemas"]["StepParamEasingInvocation"] | components["schemas"]["GraphInvocation"] | components["schemas"]["IterateInvocation"] | components["schemas"]["CollectInvocation"] | components["schemas"]["CannyImageProcessorInvocation"] | components["schemas"]["HedImageProcessorInvocation"] | components["schemas"]["LineartImageProcessorInvocation"] | components["schemas"]["LineartAnimeImageProcessorInvocation"] | components["schemas"]["OpenposeImageProcessorInvocation"] | components["schemas"]["MidasDepthImageProcessorInvocation"] | components["schemas"]["NormalbaeImageProcessorInvocation"] | components["schemas"]["MlsdImageProcessorInvocation"] | components["schemas"]["PidiImageProcessorInvocation"] | components["schemas"]["ContentShuffleImageProcessorInvocation"] | components["schemas"]["ZoeDepthImageProcessorInvocation"] | components["schemas"]["MediapipeFaceProcessorInvocation"] | components["schemas"]["LeresImageProcessorInvocation"] | components["schemas"]["TileResamplerProcessorInvocation"] | components["schemas"]["SegmentAnythingProcessorInvocation"] | components["schemas"]["LatentsToLatentsInvocation"]) | undefined; +>>>>>>> main }; /** * Edges @@ -1217,7 +1301,7 @@ export type components = { * @description The results of node executions */ results: { - [key: string]: (components["schemas"]["ImageOutput"] | components["schemas"]["MaskOutput"] | components["schemas"]["ControlOutput"] | components["schemas"]["ModelLoaderOutput"] | components["schemas"]["LoraLoaderOutput"] | components["schemas"]["VaeLoaderOutput"] | components["schemas"]["MetadataAccumulatorOutput"] | components["schemas"]["PromptOutput"] | components["schemas"]["PromptCollectionOutput"] | components["schemas"]["CompelOutput"] | components["schemas"]["ClipSkipInvocationOutput"] | components["schemas"]["IntOutput"] | components["schemas"]["FloatOutput"] | components["schemas"]["LatentsOutput"] | components["schemas"]["IntCollectionOutput"] | components["schemas"]["FloatCollectionOutput"] | components["schemas"]["ImageCollectionOutput"] | components["schemas"]["NoiseOutput"] | components["schemas"]["GraphInvocationOutput"] | components["schemas"]["IterateInvocationOutput"] | components["schemas"]["CollectInvocationOutput"]) | undefined; + [key: string]: (components["schemas"]["ImageOutput"] | components["schemas"]["MaskOutput"] | components["schemas"]["ControlOutput"] | components["schemas"]["ModelLoaderOutput"] | components["schemas"]["LoraLoaderOutput"] | components["schemas"]["VaeLoaderOutput"] | components["schemas"]["MetadataAccumulatorOutput"] | components["schemas"]["CompelOutput"] | components["schemas"]["ClipSkipInvocationOutput"] | components["schemas"]["LatentsOutput"] | components["schemas"]["IntOutput"] | components["schemas"]["FloatOutput"] | components["schemas"]["StringOutput"] | components["schemas"]["IntCollectionOutput"] | components["schemas"]["FloatCollectionOutput"] | components["schemas"]["ImageCollectionOutput"] | components["schemas"]["PromptOutput"] | components["schemas"]["PromptCollectionOutput"] | components["schemas"]["NoiseOutput"] | components["schemas"]["SDXLModelLoaderOutput"] | components["schemas"]["SDXLRefinerModelLoaderOutput"] | components["schemas"]["GraphInvocationOutput"] | components["schemas"]["IterateInvocationOutput"] | components["schemas"]["CollectInvocationOutput"]) | undefined; }; /** * Errors @@ -1923,12 +2007,12 @@ export type components = { * Width * @description The width to resize to (px) */ - width: number; + width?: number; /** * Height * @description The height to resize to (px) */ - height: number; + height?: number; /** * Resample Mode * @description The resampling mode @@ -1966,9 +2050,10 @@ export type components = { image?: components["schemas"]["ImageField"]; /** * Scale Factor - * @description The factor by which to scale the image + * @description The factor by which to scale the image + * @default 2 */ - scale_factor: number; + scale_factor?: number; /** * Resample Mode * @description The resampling mode @@ -2015,6 +2100,12 @@ export type components = { * @default false */ tiled?: boolean; + /** + * Fp32 + * @description Decode in full precision + * @default false + */ + fp32?: boolean; }; /** * ImageUrlsDTO @@ -2470,6 +2561,12 @@ export type components = { * @default false */ tiled?: boolean; + /** + * Fp32 + * @description Decode in full precision + * @default false + */ + fp32?: boolean; /** * Metadata * @description Optional core metadata to be written to the image @@ -3335,7 +3432,7 @@ export type components = { /** ModelsList */ ModelsList: { /** Models */ - models: (components["schemas"]["StableDiffusion1ModelDiffusersConfig"] | components["schemas"]["StableDiffusion1ModelCheckpointConfig"] | components["schemas"]["VaeModelConfig"] | components["schemas"]["LoRAModelConfig"] | components["schemas"]["ControlNetModelConfig"] | components["schemas"]["TextualInversionModelConfig"] | components["schemas"]["StableDiffusion2ModelCheckpointConfig"] | components["schemas"]["StableDiffusion2ModelDiffusersConfig"])[]; + models: (components["schemas"]["StableDiffusion1ModelCheckpointConfig"] | components["schemas"]["StableDiffusion1ModelDiffusersConfig"] | components["schemas"]["VaeModelConfig"] | components["schemas"]["LoRAModelConfig"] | components["schemas"]["ControlNetModelConfig"] | components["schemas"]["TextualInversionModelConfig"] | components["schemas"]["StableDiffusion2ModelCheckpointConfig"] | components["schemas"]["StableDiffusion2ModelDiffusersConfig"] | components["schemas"]["StableDiffusionXLModelCheckpointConfig"] | components["schemas"]["StableDiffusionXLModelDiffusersConfig"])[]; }; /** * MultiplyInvocation @@ -3672,6 +3769,35 @@ export type components = { */ a?: number; }; + /** + * ParamStringInvocation + * @description A string parameter + */ + ParamStringInvocation: { + /** + * Id + * @description The id of this node. Must be unique among all nodes. + */ + id: string; + /** + * Is Intermediate + * @description Whether or not this node is an intermediate node. + * @default false + */ + is_intermediate?: boolean; + /** + * Type + * @default param_string + * @enum {string} + */ + type?: "param_string"; + /** + * Text + * @description The string value + * @default + */ + text?: string; + }; /** * PidiImageProcessorInvocation * @description Applies PIDI processing to image @@ -3763,6 +3889,56 @@ export type components = { */ prompt: string; }; + /** + * PromptsFromFileInvocation + * @description Loads prompts from a text file + */ + PromptsFromFileInvocation: { + /** + * Id + * @description The id of this node. Must be unique among all nodes. + */ + id: string; + /** + * Is Intermediate + * @description Whether or not this node is an intermediate node. + * @default false + */ + is_intermediate?: boolean; + /** + * Type + * @default prompt_from_file + * @enum {string} + */ + type?: "prompt_from_file"; + /** + * File Path + * @description Path to prompt text file + */ + file_path: string; + /** + * Pre Prompt + * @description String to prepend to each prompt + */ + pre_prompt?: string; + /** + * Post Prompt + * @description String to append to each prompt + */ + post_prompt?: string; + /** + * Start Line + * @description Line in the file to start start from + * @default 1 + */ + start_line?: number; + /** + * Max Prompts + * @description Max lines to read from file (0=all) + * @default 1 + */ + max_prompts?: number; + }; /** * RandomIntInvocation * @description Outputs a single random integer. @@ -3955,14 +4131,16 @@ export type components = { latents?: components["schemas"]["LatentsField"]; /** * Width - * @description The width to resize to (px) + * @description The width to resize to (px) + * @default 512 */ - width: number; + width?: number; /** * Height - * @description The height to resize to (px) + * @description The height to resize to (px) + * @default 512 */ - height: number; + height?: number; /** * Mode * @description The interpolation mode @@ -3988,10 +4166,10 @@ export type components = { */ ResourceOrigin: "internal" | "external"; /** - * RestoreFaceInvocation - * @description Restores faces in an image. + * SDXLCompelPromptInvocation + * @description Parse prompt using compel package to conditioning. */ - RestoreFaceInvocation: { + SDXLCompelPromptInvocation: { /** * Id * @description The id of this node. Must be unique among all nodes. @@ -4005,21 +4183,514 @@ export type components = { is_intermediate?: boolean; /** * Type - * @default restore_face + * @default sdxl_compel_prompt * @enum {string} */ - type?: "restore_face"; + type?: "sdxl_compel_prompt"; /** - * Image - * @description The input image + * Prompt + * @description Prompt + * @default */ - image?: components["schemas"]["ImageField"]; + prompt?: string; /** - * Strength - * @description The strength of the restoration - * @default 0.75 + * Style + * @description Style prompt + * @default */ - strength?: number; + style?: string; + /** + * Original Width + * @default 1024 + */ + original_width?: number; + /** + * Original Height + * @default 1024 + */ + original_height?: number; + /** + * Crop Top + * @default 0 + */ + crop_top?: number; + /** + * Crop Left + * @default 0 + */ + crop_left?: number; + /** + * Target Width + * @default 1024 + */ + target_width?: number; + /** + * Target Height + * @default 1024 + */ + target_height?: number; + /** + * Clip + * @description Clip to use + */ + clip?: components["schemas"]["ClipField"]; + /** + * Clip2 + * @description Clip2 to use + */ + clip2?: components["schemas"]["ClipField"]; + }; + /** + * SDXLLatentsToLatentsInvocation + * @description Generates latents from conditionings. + */ + SDXLLatentsToLatentsInvocation: { + /** + * Id + * @description The id of this node. Must be unique among all nodes. + */ + id: string; + /** + * Is Intermediate + * @description Whether or not this node is an intermediate node. + * @default false + */ + is_intermediate?: boolean; + /** + * Type + * @default l2l_sdxl + * @enum {string} + */ + type?: "l2l_sdxl"; + /** + * Positive Conditioning + * @description Positive conditioning for generation + */ + positive_conditioning?: components["schemas"]["ConditioningField"]; + /** + * Negative Conditioning + * @description Negative conditioning for generation + */ + negative_conditioning?: components["schemas"]["ConditioningField"]; + /** + * Noise + * @description The noise to use + */ + noise?: components["schemas"]["LatentsField"]; + /** + * Steps + * @description The number of steps to use to generate the image + * @default 10 + */ + steps?: number; + /** + * Cfg Scale + * @description The Classifier-Free Guidance, higher values may result in a result closer to the prompt + * @default 7.5 + */ + cfg_scale?: number | (number)[]; + /** + * Scheduler + * @description The scheduler to use + * @default euler + * @enum {string} + */ + scheduler?: "ddim" | "ddpm" | "deis" | "lms" | "lms_k" | "pndm" | "heun" | "heun_k" | "euler" | "euler_k" | "euler_a" | "kdpm_2" | "kdpm_2_a" | "dpmpp_2s" | "dpmpp_2s_k" | "dpmpp_2m" | "dpmpp_2m_k" | "dpmpp_2m_sde" | "dpmpp_2m_sde_k" | "dpmpp_sde" | "dpmpp_sde_k" | "unipc"; + /** + * Unet + * @description UNet submodel + */ + unet?: components["schemas"]["UNetField"]; + /** + * Latents + * @description Initial latents + */ + latents?: components["schemas"]["LatentsField"]; + /** + * Denoising Start + * @default 0 + */ + denoising_start?: number; + /** + * Denoising End + * @default 1 + */ + denoising_end?: number; + }; + /** + * SDXLModelLoaderInvocation + * @description Loads an sdxl base model, outputting its submodels. + */ + SDXLModelLoaderInvocation: { + /** + * Id + * @description The id of this node. Must be unique among all nodes. + */ + id: string; + /** + * Is Intermediate + * @description Whether or not this node is an intermediate node. + * @default false + */ + is_intermediate?: boolean; + /** + * Type + * @default sdxl_model_loader + * @enum {string} + */ + type?: "sdxl_model_loader"; + /** + * Model + * @description The model to load + */ + model: components["schemas"]["MainModelField"]; + }; + /** + * SDXLModelLoaderOutput + * @description SDXL base model loader output + */ + SDXLModelLoaderOutput: { + /** + * Type + * @default sdxl_model_loader_output + * @enum {string} + */ + type?: "sdxl_model_loader_output"; + /** + * Unet + * @description UNet submodel + */ + unet?: components["schemas"]["UNetField"]; + /** + * Clip + * @description Tokenizer and text_encoder submodels + */ + clip?: components["schemas"]["ClipField"]; + /** + * Clip2 + * @description Tokenizer and text_encoder submodels + */ + clip2?: components["schemas"]["ClipField"]; + /** + * Vae + * @description Vae submodel + */ + vae?: components["schemas"]["VaeField"]; + }; + /** + * SDXLRawPromptInvocation + * @description Pass unmodified prompt to conditioning without compel processing. + */ + SDXLRawPromptInvocation: { + /** + * Id + * @description The id of this node. Must be unique among all nodes. + */ + id: string; + /** + * Is Intermediate + * @description Whether or not this node is an intermediate node. + * @default false + */ + is_intermediate?: boolean; + /** + * Type + * @default sdxl_raw_prompt + * @enum {string} + */ + type?: "sdxl_raw_prompt"; + /** + * Prompt + * @description Prompt + * @default + */ + prompt?: string; + /** + * Style + * @description Style prompt + * @default + */ + style?: string; + /** + * Original Width + * @default 1024 + */ + original_width?: number; + /** + * Original Height + * @default 1024 + */ + original_height?: number; + /** + * Crop Top + * @default 0 + */ + crop_top?: number; + /** + * Crop Left + * @default 0 + */ + crop_left?: number; + /** + * Target Width + * @default 1024 + */ + target_width?: number; + /** + * Target Height + * @default 1024 + */ + target_height?: number; + /** + * Clip + * @description Clip to use + */ + clip?: components["schemas"]["ClipField"]; + /** + * Clip2 + * @description Clip2 to use + */ + clip2?: components["schemas"]["ClipField"]; + }; + /** + * SDXLRefinerCompelPromptInvocation + * @description Parse prompt using compel package to conditioning. + */ + SDXLRefinerCompelPromptInvocation: { + /** + * Id + * @description The id of this node. Must be unique among all nodes. + */ + id: string; + /** + * Is Intermediate + * @description Whether or not this node is an intermediate node. + * @default false + */ + is_intermediate?: boolean; + /** + * Type + * @default sdxl_refiner_compel_prompt + * @enum {string} + */ + type?: "sdxl_refiner_compel_prompt"; + /** + * Style + * @description Style prompt + * @default + */ + style?: string; + /** + * Original Width + * @default 1024 + */ + original_width?: number; + /** + * Original Height + * @default 1024 + */ + original_height?: number; + /** + * Crop Top + * @default 0 + */ + crop_top?: number; + /** + * Crop Left + * @default 0 + */ + crop_left?: number; + /** + * Aesthetic Score + * @default 6 + */ + aesthetic_score?: number; + /** + * Clip2 + * @description Clip to use + */ + clip2?: components["schemas"]["ClipField"]; + }; + /** + * SDXLRefinerModelLoaderInvocation + * @description Loads an sdxl refiner model, outputting its submodels. + */ + SDXLRefinerModelLoaderInvocation: { + /** + * Id + * @description The id of this node. Must be unique among all nodes. + */ + id: string; + /** + * Is Intermediate + * @description Whether or not this node is an intermediate node. + * @default false + */ + is_intermediate?: boolean; + /** + * Type + * @default sdxl_refiner_model_loader + * @enum {string} + */ + type?: "sdxl_refiner_model_loader"; + /** + * Model + * @description The model to load + */ + model: components["schemas"]["MainModelField"]; + }; + /** + * SDXLRefinerModelLoaderOutput + * @description SDXL refiner model loader output + */ + SDXLRefinerModelLoaderOutput: { + /** + * Type + * @default sdxl_refiner_model_loader_output + * @enum {string} + */ + type?: "sdxl_refiner_model_loader_output"; + /** + * Unet + * @description UNet submodel + */ + unet?: components["schemas"]["UNetField"]; + /** + * Clip2 + * @description Tokenizer and text_encoder submodels + */ + clip2?: components["schemas"]["ClipField"]; + /** + * Vae + * @description Vae submodel + */ + vae?: components["schemas"]["VaeField"]; + }; + /** + * SDXLRefinerRawPromptInvocation + * @description Parse prompt using compel package to conditioning. + */ + SDXLRefinerRawPromptInvocation: { + /** + * Id + * @description The id of this node. Must be unique among all nodes. + */ + id: string; + /** + * Is Intermediate + * @description Whether or not this node is an intermediate node. + * @default false + */ + is_intermediate?: boolean; + /** + * Type + * @default sdxl_refiner_raw_prompt + * @enum {string} + */ + type?: "sdxl_refiner_raw_prompt"; + /** + * Style + * @description Style prompt + * @default + */ + style?: string; + /** + * Original Width + * @default 1024 + */ + original_width?: number; + /** + * Original Height + * @default 1024 + */ + original_height?: number; + /** + * Crop Top + * @default 0 + */ + crop_top?: number; + /** + * Crop Left + * @default 0 + */ + crop_left?: number; + /** + * Aesthetic Score + * @default 6 + */ + aesthetic_score?: number; + /** + * Clip2 + * @description Clip to use + */ + clip2?: components["schemas"]["ClipField"]; + }; + /** + * SDXLTextToLatentsInvocation + * @description Generates latents from conditionings. + */ + SDXLTextToLatentsInvocation: { + /** + * Id + * @description The id of this node. Must be unique among all nodes. + */ + id: string; + /** + * Is Intermediate + * @description Whether or not this node is an intermediate node. + * @default false + */ + is_intermediate?: boolean; + /** + * Type + * @default t2l_sdxl + * @enum {string} + */ + type?: "t2l_sdxl"; + /** + * Positive Conditioning + * @description Positive conditioning for generation + */ + positive_conditioning?: components["schemas"]["ConditioningField"]; + /** + * Negative Conditioning + * @description Negative conditioning for generation + */ + negative_conditioning?: components["schemas"]["ConditioningField"]; + /** + * Noise + * @description The noise to use + */ + noise?: components["schemas"]["LatentsField"]; + /** + * Steps + * @description The number of steps to use to generate the image + * @default 10 + */ + steps?: number; + /** + * Cfg Scale + * @description The Classifier-Free Guidance, higher values may result in a result closer to the prompt + * @default 7.5 + */ + cfg_scale?: number | (number)[]; + /** + * Scheduler + * @description The scheduler to use + * @default euler + * @enum {string} + */ + scheduler?: "ddim" | "ddpm" | "deis" | "lms" | "lms_k" | "pndm" | "heun" | "heun_k" | "euler" | "euler_k" | "euler_a" | "kdpm_2" | "kdpm_2_a" | "dpmpp_2s" | "dpmpp_2s_k" | "dpmpp_2m" | "dpmpp_2m_k" | "dpmpp_2m_sde" | "dpmpp_2m_sde_k" | "dpmpp_sde" | "dpmpp_sde_k" | "unipc"; + /** + * Unet + * @description UNet submodel + */ + unet?: components["schemas"]["UNetField"]; + /** + * Denoising End + * @default 1 + */ + denoising_end?: number; }; /** * ScaleLatentsInvocation @@ -4223,6 +4894,56 @@ export type components = { vae?: string; variant: components["schemas"]["ModelVariantType"]; }; + /** StableDiffusionXLModelCheckpointConfig */ + StableDiffusionXLModelCheckpointConfig: { + /** Model Name */ + model_name: string; + base_model: components["schemas"]["BaseModelType"]; + /** + * Model Type + * @enum {string} + */ + model_type: "main"; + /** Path */ + path: string; + /** Description */ + description?: string; + /** + * Model Format + * @enum {string} + */ + model_format: "checkpoint"; + error?: components["schemas"]["ModelError"]; + /** Vae */ + vae?: string; + /** Config */ + config: string; + variant: components["schemas"]["ModelVariantType"]; + }; + /** StableDiffusionXLModelDiffusersConfig */ + StableDiffusionXLModelDiffusersConfig: { + /** Model Name */ + model_name: string; + base_model: components["schemas"]["BaseModelType"]; + /** + * Model Type + * @enum {string} + */ + model_type: "main"; + /** Path */ + path: string; + /** Description */ + description?: string; + /** + * Model Format + * @enum {string} + */ + model_format: "diffusers"; + error?: components["schemas"]["ModelError"]; + /** Vae */ + vae?: string; + variant: components["schemas"]["ModelVariantType"]; + }; /** * StepParamEasingInvocation * @description Experimental per-step parameter easing for denoising steps @@ -4305,12 +5026,29 @@ export type components = { */ show_easing_plot?: boolean; }; + /** + * StringOutput + * @description A string output + */ + StringOutput: { + /** + * Type + * @default string_output + * @enum {string} + */ + type?: "string_output"; + /** + * Text + * @description The output string + */ + text?: string; + }; /** * SubModelType * @description An enumeration. * @enum {string} */ - SubModelType: "unet" | "text_encoder" | "tokenizer" | "vae" | "scheduler" | "safety_checker"; + SubModelType: "unet" | "text_encoder" | "text_encoder_2" | "tokenizer" | "tokenizer_2" | "vae" | "scheduler" | "safety_checker"; /** * SubtractInvocation * @description Subtracts two numbers @@ -4483,47 +5221,6 @@ export type components = { */ loras: (components["schemas"]["LoraInfo"])[]; }; - /** - * UpscaleInvocation - * @description Upscales an image. - */ - UpscaleInvocation: { - /** - * Id - * @description The id of this node. Must be unique among all nodes. - */ - id: string; - /** - * Is Intermediate - * @description Whether or not this node is an intermediate node. - * @default false - */ - is_intermediate?: boolean; - /** - * Type - * @default upscale - * @enum {string} - */ - type?: "upscale"; - /** - * Image - * @description The input image - */ - image?: components["schemas"]["ImageField"]; - /** - * Strength - * @description The strength - * @default 0.75 - */ - strength?: number; - /** - * Level - * @description The upscale level - * @default 2 - * @enum {integer} - */ - level?: 2 | 4; - }; /** * VAEModelField * @description Vae model field @@ -4650,18 +5347,24 @@ export type components = { */ image?: components["schemas"]["ImageField"]; }; - /** - * StableDiffusion1ModelFormat - * @description An enumeration. - * @enum {string} - */ - StableDiffusion1ModelFormat: "checkpoint" | "diffusers"; /** * StableDiffusion2ModelFormat * @description An enumeration. * @enum {string} */ StableDiffusion2ModelFormat: "checkpoint" | "diffusers"; + /** + * StableDiffusionXLModelFormat + * @description An enumeration. + * @enum {string} + */ + StableDiffusionXLModelFormat: "checkpoint" | "diffusers"; + /** + * StableDiffusion1ModelFormat + * @description An enumeration. + * @enum {string} + */ + StableDiffusion1ModelFormat: "checkpoint" | "diffusers"; }; responses: never; parameters: never; @@ -4772,7 +5475,7 @@ export type operations = { }; requestBody: { content: { - "application/json": components["schemas"]["LoadImageInvocation"] | components["schemas"]["ShowImageInvocation"] | components["schemas"]["ImageCropInvocation"] | components["schemas"]["ImagePasteInvocation"] | components["schemas"]["MaskFromAlphaInvocation"] | components["schemas"]["ImageMultiplyInvocation"] | components["schemas"]["ImageChannelInvocation"] | components["schemas"]["ImageConvertInvocation"] | components["schemas"]["ImageBlurInvocation"] | components["schemas"]["ImageResizeInvocation"] | components["schemas"]["ImageScaleInvocation"] | components["schemas"]["ImageLerpInvocation"] | components["schemas"]["ImageInverseLerpInvocation"] | components["schemas"]["ControlNetInvocation"] | components["schemas"]["ImageProcessorInvocation"] | components["schemas"]["MainModelLoaderInvocation"] | components["schemas"]["OnnxModelLoaderInvocation"] | components["schemas"]["LoraLoaderInvocation"] | components["schemas"]["VaeLoaderInvocation"] | components["schemas"]["MetadataAccumulatorInvocation"] | components["schemas"]["DynamicPromptInvocation"] | components["schemas"]["CompelInvocation"] | components["schemas"]["ClipSkipInvocation"] | components["schemas"]["AddInvocation"] | components["schemas"]["SubtractInvocation"] | components["schemas"]["MultiplyInvocation"] | components["schemas"]["DivideInvocation"] | components["schemas"]["RandomIntInvocation"] | components["schemas"]["ParamIntInvocation"] | components["schemas"]["ParamFloatInvocation"] | components["schemas"]["TextToLatentsInvocation"] | components["schemas"]["LatentsToImageInvocation"] | components["schemas"]["ONNXLatentsToImageInvocation"] | components["schemas"]["ResizeLatentsInvocation"] | components["schemas"]["ScaleLatentsInvocation"] | components["schemas"]["ImageToLatentsInvocation"] | components["schemas"]["CvInpaintInvocation"] | components["schemas"]["RangeInvocation"] | components["schemas"]["RangeOfSizeInvocation"] | components["schemas"]["RandomRangeInvocation"] | components["schemas"]["ImageCollectionInvocation"] | components["schemas"]["FloatLinearRangeInvocation"] | components["schemas"]["StepParamEasingInvocation"] | components["schemas"]["NoiseInvocation"] | components["schemas"]["UpscaleInvocation"] | components["schemas"]["RestoreFaceInvocation"] | components["schemas"]["InpaintInvocation"] | components["schemas"]["InfillColorInvocation"] | components["schemas"]["InfillTileInvocation"] | components["schemas"]["InfillPatchMatchInvocation"] | components["schemas"]["GraphInvocation"] | components["schemas"]["IterateInvocation"] | components["schemas"]["CollectInvocation"] | components["schemas"]["CannyImageProcessorInvocation"] | components["schemas"]["HedImageProcessorInvocation"] | components["schemas"]["LineartImageProcessorInvocation"] | components["schemas"]["LineartAnimeImageProcessorInvocation"] | components["schemas"]["OpenposeImageProcessorInvocation"] | components["schemas"]["MidasDepthImageProcessorInvocation"] | components["schemas"]["NormalbaeImageProcessorInvocation"] | components["schemas"]["MlsdImageProcessorInvocation"] | components["schemas"]["PidiImageProcessorInvocation"] | components["schemas"]["ContentShuffleImageProcessorInvocation"] | components["schemas"]["ZoeDepthImageProcessorInvocation"] | components["schemas"]["MediapipeFaceProcessorInvocation"] | components["schemas"]["LeresImageProcessorInvocation"] | components["schemas"]["TileResamplerProcessorInvocation"] | components["schemas"]["SegmentAnythingProcessorInvocation"] | components["schemas"]["LatentsToLatentsInvocation"]; + "application/json": components["schemas"]["LoadImageInvocation"] | components["schemas"]["ShowImageInvocation"] | components["schemas"]["ImageCropInvocation"] | components["schemas"]["ImagePasteInvocation"] | components["schemas"]["MaskFromAlphaInvocation"] | components["schemas"]["ImageMultiplyInvocation"] | components["schemas"]["ImageChannelInvocation"] | components["schemas"]["ImageConvertInvocation"] | components["schemas"]["ImageBlurInvocation"] | components["schemas"]["ImageResizeInvocation"] | components["schemas"]["ImageScaleInvocation"] | components["schemas"]["ImageLerpInvocation"] | components["schemas"]["ImageInverseLerpInvocation"] | components["schemas"]["ControlNetInvocation"] | components["schemas"]["ImageProcessorInvocation"] | components["schemas"]["MainModelLoaderInvocation"] | components["schemas"]["OnnxModelLoaderInvocation"] | components["schemas"]["LoraLoaderInvocation"] | components["schemas"]["VaeLoaderInvocation"] | components["schemas"]["MetadataAccumulatorInvocation"] | components["schemas"]["CvInpaintInvocation"] | components["schemas"]["CompelInvocation"] | components["schemas"]["SDXLCompelPromptInvocation"] | components["schemas"]["SDXLRefinerCompelPromptInvocation"] | components["schemas"]["SDXLRawPromptInvocation"] | components["schemas"]["SDXLRefinerRawPromptInvocation"] | components["schemas"]["ClipSkipInvocation"] | components["schemas"]["TextToLatentsInvocation"] | components["schemas"]["LatentsToImageInvocation"] | components["schemas"]["ResizeLatentsInvocation"] | components["schemas"]["ScaleLatentsInvocation"] | components["schemas"]["ImageToLatentsInvocation"] | components["schemas"]["InpaintInvocation"] | components["schemas"]["AddInvocation"] | components["schemas"]["SubtractInvocation"] | components["schemas"]["MultiplyInvocation"] | components["schemas"]["DivideInvocation"] | components["schemas"]["RandomIntInvocation"] | components["schemas"]["ParamIntInvocation"] | components["schemas"]["ParamFloatInvocation"] | components["schemas"]["ParamStringInvocation"] | components["schemas"]["ESRGANInvocation"] | components["schemas"]["RangeInvocation"] | components["schemas"]["RangeOfSizeInvocation"] | components["schemas"]["RandomRangeInvocation"] | components["schemas"]["ImageCollectionInvocation"] | components["schemas"]["DynamicPromptInvocation"] | components["schemas"]["PromptsFromFileInvocation"] | components["schemas"]["InfillColorInvocation"] | components["schemas"]["InfillTileInvocation"] | components["schemas"]["InfillPatchMatchInvocation"] | components["schemas"]["NoiseInvocation"] | components["schemas"]["SDXLModelLoaderInvocation"] | components["schemas"]["SDXLRefinerModelLoaderInvocation"] | components["schemas"]["SDXLTextToLatentsInvocation"] | components["schemas"]["SDXLLatentsToLatentsInvocation"] | components["schemas"]["FloatLinearRangeInvocation"] | components["schemas"]["StepParamEasingInvocation"] | components["schemas"]["GraphInvocation"] | components["schemas"]["IterateInvocation"] | components["schemas"]["CollectInvocation"] | components["schemas"]["CannyImageProcessorInvocation"] | components["schemas"]["HedImageProcessorInvocation"] | components["schemas"]["LineartImageProcessorInvocation"] | components["schemas"]["LineartAnimeImageProcessorInvocation"] | components["schemas"]["OpenposeImageProcessorInvocation"] | components["schemas"]["MidasDepthImageProcessorInvocation"] | components["schemas"]["NormalbaeImageProcessorInvocation"] | components["schemas"]["MlsdImageProcessorInvocation"] | components["schemas"]["PidiImageProcessorInvocation"] | components["schemas"]["ContentShuffleImageProcessorInvocation"] | components["schemas"]["ZoeDepthImageProcessorInvocation"] | components["schemas"]["MediapipeFaceProcessorInvocation"] | components["schemas"]["LeresImageProcessorInvocation"] | components["schemas"]["TileResamplerProcessorInvocation"] | components["schemas"]["SegmentAnythingProcessorInvocation"] | components["schemas"]["LatentsToLatentsInvocation"]; }; }; responses: { @@ -4809,7 +5512,7 @@ export type operations = { }; requestBody: { content: { - "application/json": components["schemas"]["LoadImageInvocation"] | components["schemas"]["ShowImageInvocation"] | components["schemas"]["ImageCropInvocation"] | components["schemas"]["ImagePasteInvocation"] | components["schemas"]["MaskFromAlphaInvocation"] | components["schemas"]["ImageMultiplyInvocation"] | components["schemas"]["ImageChannelInvocation"] | components["schemas"]["ImageConvertInvocation"] | components["schemas"]["ImageBlurInvocation"] | components["schemas"]["ImageResizeInvocation"] | components["schemas"]["ImageScaleInvocation"] | components["schemas"]["ImageLerpInvocation"] | components["schemas"]["ImageInverseLerpInvocation"] | components["schemas"]["ControlNetInvocation"] | components["schemas"]["ImageProcessorInvocation"] | components["schemas"]["MainModelLoaderInvocation"] | components["schemas"]["OnnxModelLoaderInvocation"] | components["schemas"]["LoraLoaderInvocation"] | components["schemas"]["VaeLoaderInvocation"] | components["schemas"]["MetadataAccumulatorInvocation"] | components["schemas"]["DynamicPromptInvocation"] | components["schemas"]["CompelInvocation"] | components["schemas"]["ClipSkipInvocation"] | components["schemas"]["AddInvocation"] | components["schemas"]["SubtractInvocation"] | components["schemas"]["MultiplyInvocation"] | components["schemas"]["DivideInvocation"] | components["schemas"]["RandomIntInvocation"] | components["schemas"]["ParamIntInvocation"] | components["schemas"]["ParamFloatInvocation"] | components["schemas"]["TextToLatentsInvocation"] | components["schemas"]["LatentsToImageInvocation"] | components["schemas"]["ONNXLatentsToImageInvocation"] | components["schemas"]["ResizeLatentsInvocation"] | components["schemas"]["ScaleLatentsInvocation"] | components["schemas"]["ImageToLatentsInvocation"] | components["schemas"]["CvInpaintInvocation"] | components["schemas"]["RangeInvocation"] | components["schemas"]["RangeOfSizeInvocation"] | components["schemas"]["RandomRangeInvocation"] | components["schemas"]["ImageCollectionInvocation"] | components["schemas"]["FloatLinearRangeInvocation"] | components["schemas"]["StepParamEasingInvocation"] | components["schemas"]["NoiseInvocation"] | components["schemas"]["UpscaleInvocation"] | components["schemas"]["RestoreFaceInvocation"] | components["schemas"]["InpaintInvocation"] | components["schemas"]["InfillColorInvocation"] | components["schemas"]["InfillTileInvocation"] | components["schemas"]["InfillPatchMatchInvocation"] | components["schemas"]["GraphInvocation"] | components["schemas"]["IterateInvocation"] | components["schemas"]["CollectInvocation"] | components["schemas"]["CannyImageProcessorInvocation"] | components["schemas"]["HedImageProcessorInvocation"] | components["schemas"]["LineartImageProcessorInvocation"] | components["schemas"]["LineartAnimeImageProcessorInvocation"] | components["schemas"]["OpenposeImageProcessorInvocation"] | components["schemas"]["MidasDepthImageProcessorInvocation"] | components["schemas"]["NormalbaeImageProcessorInvocation"] | components["schemas"]["MlsdImageProcessorInvocation"] | components["schemas"]["PidiImageProcessorInvocation"] | components["schemas"]["ContentShuffleImageProcessorInvocation"] | components["schemas"]["ZoeDepthImageProcessorInvocation"] | components["schemas"]["MediapipeFaceProcessorInvocation"] | components["schemas"]["LeresImageProcessorInvocation"] | components["schemas"]["TileResamplerProcessorInvocation"] | components["schemas"]["SegmentAnythingProcessorInvocation"] | components["schemas"]["LatentsToLatentsInvocation"]; + "application/json": components["schemas"]["LoadImageInvocation"] | components["schemas"]["ShowImageInvocation"] | components["schemas"]["ImageCropInvocation"] | components["schemas"]["ImagePasteInvocation"] | components["schemas"]["MaskFromAlphaInvocation"] | components["schemas"]["ImageMultiplyInvocation"] | components["schemas"]["ImageChannelInvocation"] | components["schemas"]["ImageConvertInvocation"] | components["schemas"]["ImageBlurInvocation"] | components["schemas"]["ImageResizeInvocation"] | components["schemas"]["ImageScaleInvocation"] | components["schemas"]["ImageLerpInvocation"] | components["schemas"]["ImageInverseLerpInvocation"] | components["schemas"]["ControlNetInvocation"] | components["schemas"]["ImageProcessorInvocation"] | components["schemas"]["MainModelLoaderInvocation"] | components["schemas"]["OnnxModelLoaderInvocation"] | components["schemas"]["LoraLoaderInvocation"] | components["schemas"]["VaeLoaderInvocation"] | components["schemas"]["MetadataAccumulatorInvocation"] | components["schemas"]["CvInpaintInvocation"] | components["schemas"]["CompelInvocation"] | components["schemas"]["SDXLCompelPromptInvocation"] | components["schemas"]["SDXLRefinerCompelPromptInvocation"] | components["schemas"]["SDXLRawPromptInvocation"] | components["schemas"]["SDXLRefinerRawPromptInvocation"] | components["schemas"]["ClipSkipInvocation"] | components["schemas"]["TextToLatentsInvocation"] | components["schemas"]["LatentsToImageInvocation"] | components["schemas"]["ResizeLatentsInvocation"] | components["schemas"]["ScaleLatentsInvocation"] | components["schemas"]["ImageToLatentsInvocation"] | components["schemas"]["InpaintInvocation"] | components["schemas"]["AddInvocation"] | components["schemas"]["SubtractInvocation"] | components["schemas"]["MultiplyInvocation"] | components["schemas"]["DivideInvocation"] | components["schemas"]["RandomIntInvocation"] | components["schemas"]["ParamIntInvocation"] | components["schemas"]["ParamFloatInvocation"] | components["schemas"]["ParamStringInvocation"] | components["schemas"]["ESRGANInvocation"] | components["schemas"]["RangeInvocation"] | components["schemas"]["RangeOfSizeInvocation"] | components["schemas"]["RandomRangeInvocation"] | components["schemas"]["ImageCollectionInvocation"] | components["schemas"]["DynamicPromptInvocation"] | components["schemas"]["PromptsFromFileInvocation"] | components["schemas"]["InfillColorInvocation"] | components["schemas"]["InfillTileInvocation"] | components["schemas"]["InfillPatchMatchInvocation"] | components["schemas"]["NoiseInvocation"] | components["schemas"]["SDXLModelLoaderInvocation"] | components["schemas"]["SDXLRefinerModelLoaderInvocation"] | components["schemas"]["SDXLTextToLatentsInvocation"] | components["schemas"]["SDXLLatentsToLatentsInvocation"] | components["schemas"]["FloatLinearRangeInvocation"] | components["schemas"]["StepParamEasingInvocation"] | components["schemas"]["GraphInvocation"] | components["schemas"]["IterateInvocation"] | components["schemas"]["CollectInvocation"] | components["schemas"]["CannyImageProcessorInvocation"] | components["schemas"]["HedImageProcessorInvocation"] | components["schemas"]["LineartImageProcessorInvocation"] | components["schemas"]["LineartAnimeImageProcessorInvocation"] | components["schemas"]["OpenposeImageProcessorInvocation"] | components["schemas"]["MidasDepthImageProcessorInvocation"] | components["schemas"]["NormalbaeImageProcessorInvocation"] | components["schemas"]["MlsdImageProcessorInvocation"] | components["schemas"]["PidiImageProcessorInvocation"] | components["schemas"]["ContentShuffleImageProcessorInvocation"] | components["schemas"]["ZoeDepthImageProcessorInvocation"] | components["schemas"]["MediapipeFaceProcessorInvocation"] | components["schemas"]["LeresImageProcessorInvocation"] | components["schemas"]["TileResamplerProcessorInvocation"] | components["schemas"]["SegmentAnythingProcessorInvocation"] | components["schemas"]["LatentsToLatentsInvocation"]; }; }; responses: { @@ -5007,8 +5710,8 @@ export type operations = { list_models: { parameters: { query?: { - /** @description Base model */ - base_model?: components["schemas"]["BaseModelType"]; + /** @description Base models to include */ + base_models?: (components["schemas"]["BaseModelType"])[]; /** @description The type of model to get */ model_type?: components["schemas"]["ModelType"]; }; @@ -5028,37 +5731,6 @@ export type operations = { }; }; }; - /** - * Import Model - * @description Add a model using its local path, repo_id, or remote URL - */ - import_model: { - requestBody: { - content: { - "application/json": components["schemas"]["Body_import_model"]; - }; - }; - responses: { - /** @description The model imported successfully */ - 201: { - content: { - "application/json": components["schemas"]["StableDiffusion1ModelDiffusersConfig"] | components["schemas"]["StableDiffusion1ModelCheckpointConfig"] | components["schemas"]["VaeModelConfig"] | components["schemas"]["LoRAModelConfig"] | components["schemas"]["ControlNetModelConfig"] | components["schemas"]["TextualInversionModelConfig"] | components["schemas"]["StableDiffusion2ModelCheckpointConfig"] | components["schemas"]["StableDiffusion2ModelDiffusersConfig"]; - }; - }; - /** @description The model could not be found */ - 404: never; - /** @description There is already a model corresponding to this path or repo_id */ - 409: never; - /** @description Validation Error */ - 422: { - content: { - "application/json": components["schemas"]["HTTPValidationError"]; - }; - }; - /** @description The model appeared to import successfully, but could not be found in the model manager */ - 424: never; - }; - }; /** * Delete Model * @description Delete Model @@ -5075,12 +5747,6 @@ export type operations = { }; }; responses: { - /** @description Successful Response */ - 200: { - content: { - "application/json": unknown; - }; - }; /** @description Model deleted successfully */ 204: never; /** @description Model not found */ @@ -5095,7 +5761,7 @@ export type operations = { }; /** * Update Model - * @description Add Model + * @description Update model contents with a new config. If the model name or base fields are changed, then the model is renamed. */ update_model: { parameters: { @@ -5110,20 +5776,22 @@ export type operations = { }; requestBody: { content: { - "application/json": components["schemas"]["StableDiffusion1ModelDiffusersConfig"] | components["schemas"]["StableDiffusion1ModelCheckpointConfig"] | components["schemas"]["VaeModelConfig"] | components["schemas"]["LoRAModelConfig"] | components["schemas"]["ControlNetModelConfig"] | components["schemas"]["TextualInversionModelConfig"] | components["schemas"]["StableDiffusion2ModelCheckpointConfig"] | components["schemas"]["StableDiffusion2ModelDiffusersConfig"]; + "application/json": components["schemas"]["StableDiffusion1ModelCheckpointConfig"] | components["schemas"]["StableDiffusion1ModelDiffusersConfig"] | components["schemas"]["VaeModelConfig"] | components["schemas"]["LoRAModelConfig"] | components["schemas"]["ControlNetModelConfig"] | components["schemas"]["TextualInversionModelConfig"] | components["schemas"]["StableDiffusion2ModelCheckpointConfig"] | components["schemas"]["StableDiffusion2ModelDiffusersConfig"] | components["schemas"]["StableDiffusionXLModelCheckpointConfig"] | components["schemas"]["StableDiffusionXLModelDiffusersConfig"]; }; }; responses: { /** @description The model was updated successfully */ 200: { content: { - "application/json": components["schemas"]["StableDiffusion1ModelDiffusersConfig"] | components["schemas"]["StableDiffusion1ModelCheckpointConfig"] | components["schemas"]["VaeModelConfig"] | components["schemas"]["LoRAModelConfig"] | components["schemas"]["ControlNetModelConfig"] | components["schemas"]["TextualInversionModelConfig"] | components["schemas"]["StableDiffusion2ModelCheckpointConfig"] | components["schemas"]["StableDiffusion2ModelDiffusersConfig"]; + "application/json": components["schemas"]["StableDiffusion1ModelCheckpointConfig"] | components["schemas"]["StableDiffusion1ModelDiffusersConfig"] | components["schemas"]["VaeModelConfig"] | components["schemas"]["LoRAModelConfig"] | components["schemas"]["ControlNetModelConfig"] | components["schemas"]["TextualInversionModelConfig"] | components["schemas"]["StableDiffusion2ModelCheckpointConfig"] | components["schemas"]["StableDiffusion2ModelDiffusersConfig"] | components["schemas"]["StableDiffusionXLModelCheckpointConfig"] | components["schemas"]["StableDiffusionXLModelDiffusersConfig"]; }; }; /** @description Bad request */ 400: never; /** @description The model could not be found */ 404: never; + /** @description There is already a model corresponding to the new name */ + 409: never; /** @description Validation Error */ 422: { content: { @@ -5132,12 +5800,80 @@ export type operations = { }; }; }; + /** + * Import Model + * @description Add a model using its local path, repo_id, or remote URL. Model characteristics will be probed and configured automatically + */ + import_model: { + requestBody: { + content: { + "application/json": components["schemas"]["Body_import_model"]; + }; + }; + responses: { + /** @description The model imported successfully */ + 201: { + content: { + "application/json": components["schemas"]["StableDiffusion1ModelCheckpointConfig"] | components["schemas"]["StableDiffusion1ModelDiffusersConfig"] | components["schemas"]["VaeModelConfig"] | components["schemas"]["LoRAModelConfig"] | components["schemas"]["ControlNetModelConfig"] | components["schemas"]["TextualInversionModelConfig"] | components["schemas"]["StableDiffusion2ModelCheckpointConfig"] | components["schemas"]["StableDiffusion2ModelDiffusersConfig"] | components["schemas"]["StableDiffusionXLModelCheckpointConfig"] | components["schemas"]["StableDiffusionXLModelDiffusersConfig"]; + }; + }; + /** @description The model could not be found */ + 404: never; + /** @description There is already a model corresponding to this path or repo_id */ + 409: never; + /** @description Unrecognized file/folder format */ + 415: never; + /** @description Validation Error */ + 422: { + content: { + "application/json": components["schemas"]["HTTPValidationError"]; + }; + }; + /** @description The model appeared to import successfully, but could not be found in the model manager */ + 424: never; + }; + }; + /** + * Add Model + * @description Add a model using the configuration information appropriate for its type. Only local models can be added by path + */ + add_model: { + requestBody: { + content: { + "application/json": components["schemas"]["StableDiffusion1ModelCheckpointConfig"] | components["schemas"]["StableDiffusion1ModelDiffusersConfig"] | components["schemas"]["VaeModelConfig"] | components["schemas"]["LoRAModelConfig"] | components["schemas"]["ControlNetModelConfig"] | components["schemas"]["TextualInversionModelConfig"] | components["schemas"]["StableDiffusion2ModelCheckpointConfig"] | components["schemas"]["StableDiffusion2ModelDiffusersConfig"] | components["schemas"]["StableDiffusionXLModelCheckpointConfig"] | components["schemas"]["StableDiffusionXLModelDiffusersConfig"]; + }; + }; + responses: { + /** @description The model added successfully */ + 201: { + content: { + "application/json": components["schemas"]["StableDiffusion1ModelCheckpointConfig"] | components["schemas"]["StableDiffusion1ModelDiffusersConfig"] | components["schemas"]["VaeModelConfig"] | components["schemas"]["LoRAModelConfig"] | components["schemas"]["ControlNetModelConfig"] | components["schemas"]["TextualInversionModelConfig"] | components["schemas"]["StableDiffusion2ModelCheckpointConfig"] | components["schemas"]["StableDiffusion2ModelDiffusersConfig"] | components["schemas"]["StableDiffusionXLModelCheckpointConfig"] | components["schemas"]["StableDiffusionXLModelDiffusersConfig"]; + }; + }; + /** @description The model could not be found */ + 404: never; + /** @description There is already a model corresponding to this path or repo_id */ + 409: never; + /** @description Validation Error */ + 422: { + content: { + "application/json": components["schemas"]["HTTPValidationError"]; + }; + }; + /** @description The model appeared to add successfully, but could not be found in the model manager */ + 424: never; + }; + }; /** * Convert Model - * @description Convert a checkpoint model into a diffusers model + * @description Convert a checkpoint model into a diffusers model, optionally saving to the indicated destination directory, or `models` if none. */ convert_model: { parameters: { + query?: { + /** @description Save the converted model to the designated directory */ + convert_dest_directory?: string; + }; path: { /** @description Base model */ base_model: components["schemas"]["BaseModelType"]; @@ -5151,7 +5887,7 @@ export type operations = { /** @description Model converted successfully */ 200: { content: { - "application/json": components["schemas"]["StableDiffusion1ModelDiffusersConfig"] | components["schemas"]["StableDiffusion1ModelCheckpointConfig"] | components["schemas"]["VaeModelConfig"] | components["schemas"]["LoRAModelConfig"] | components["schemas"]["ControlNetModelConfig"] | components["schemas"]["TextualInversionModelConfig"] | components["schemas"]["StableDiffusion2ModelCheckpointConfig"] | components["schemas"]["StableDiffusion2ModelDiffusersConfig"]; + "application/json": components["schemas"]["StableDiffusion1ModelCheckpointConfig"] | components["schemas"]["StableDiffusion1ModelDiffusersConfig"] | components["schemas"]["VaeModelConfig"] | components["schemas"]["LoRAModelConfig"] | components["schemas"]["ControlNetModelConfig"] | components["schemas"]["TextualInversionModelConfig"] | components["schemas"]["StableDiffusion2ModelCheckpointConfig"] | components["schemas"]["StableDiffusion2ModelDiffusersConfig"] | components["schemas"]["StableDiffusionXLModelCheckpointConfig"] | components["schemas"]["StableDiffusionXLModelDiffusersConfig"]; }; }; /** @description Bad request */ @@ -5166,6 +5902,60 @@ export type operations = { }; }; }; + /** Search For Models */ + search_for_models: { + parameters: { + query: { + /** @description Directory path to search for models */ + search_path: string; + }; + }; + responses: { + /** @description Directory searched successfully */ + 200: { + content: { + "application/json": (string)[]; + }; + }; + /** @description Invalid directory path */ + 404: never; + /** @description Validation Error */ + 422: { + content: { + "application/json": components["schemas"]["HTTPValidationError"]; + }; + }; + }; + }; + /** + * List Ckpt Configs + * @description Return a list of the legacy checkpoint configuration files stored in `ROOT/configs/stable-diffusion`, relative to ROOT. + */ + list_ckpt_configs: { + responses: { + /** @description paths retrieved successfully */ + 200: { + content: { + "application/json": (string)[]; + }; + }; + }; + }; + /** + * Sync To Config + * @description Call after making changes to models.yaml, autoimport directories or models directory to synchronize + * in-memory data structures with disk data structures. + */ + sync_to_config: { + responses: { + /** @description synchronization successful */ + 201: { + content: { + "application/json": unknown; + }; + }; + }; + }; /** * Merge Models * @description Convert a checkpoint model into a diffusers model @@ -5186,7 +5976,7 @@ export type operations = { /** @description Model converted successfully */ 200: { content: { - "application/json": components["schemas"]["StableDiffusion1ModelDiffusersConfig"] | components["schemas"]["StableDiffusion1ModelCheckpointConfig"] | components["schemas"]["VaeModelConfig"] | components["schemas"]["LoRAModelConfig"] | components["schemas"]["ControlNetModelConfig"] | components["schemas"]["TextualInversionModelConfig"] | components["schemas"]["StableDiffusion2ModelCheckpointConfig"] | components["schemas"]["StableDiffusion2ModelDiffusersConfig"]; + "application/json": components["schemas"]["StableDiffusion1ModelCheckpointConfig"] | components["schemas"]["StableDiffusion1ModelDiffusersConfig"] | components["schemas"]["VaeModelConfig"] | components["schemas"]["LoRAModelConfig"] | components["schemas"]["ControlNetModelConfig"] | components["schemas"]["TextualInversionModelConfig"] | components["schemas"]["StableDiffusion2ModelCheckpointConfig"] | components["schemas"]["StableDiffusion2ModelDiffusersConfig"] | components["schemas"]["StableDiffusionXLModelCheckpointConfig"] | components["schemas"]["StableDiffusionXLModelDiffusersConfig"]; }; }; /** @description Incompatible models */ diff --git a/invokeai/frontend/web/src/services/api/thunks/image.ts b/invokeai/frontend/web/src/services/api/thunks/image.ts index f20eee9420..09271c3625 100644 --- a/invokeai/frontend/web/src/services/api/thunks/image.ts +++ b/invokeai/frontend/web/src/services/api/thunks/image.ts @@ -1,5 +1,9 @@ import { createAppAsyncThunk } from 'app/store/storeUtils'; -import { selectImagesAll } from 'features/gallery/store/gallerySlice'; +import { selectFilteredImages } from 'features/gallery/store/gallerySelectors'; +import { + ASSETS_CATEGORIES, + IMAGE_CATEGORIES, +} from 'features/gallery/store/gallerySlice'; import { size } from 'lodash-es'; import queryString from 'query-string'; import { $client } from 'services/api/client'; @@ -287,15 +291,12 @@ export const receivedPageOfImages = createAppAsyncThunk< const { get } = $client.get(); const state = getState(); - const { categories, selectedBoardId } = state.gallery; - const images = selectImagesAll(state).filter((i) => { - const isInCategory = categories.includes(i.image_category); - const isInSelectedBoard = selectedBoardId - ? i.board_id === selectedBoardId - : true; - return isInCategory && isInSelectedBoard; - }); + const images = selectFilteredImages(state); + const categories = + state.gallery.galleryView === 'images' + ? IMAGE_CATEGORIES + : ASSETS_CATEGORIES; let query: ListImagesArg = {}; diff --git a/invokeai/frontend/web/src/services/api/types.d.ts b/invokeai/frontend/web/src/services/api/types.d.ts index 67a7d2939a..7898dd533c 100644 --- a/invokeai/frontend/web/src/services/api/types.d.ts +++ b/invokeai/frontend/web/src/services/api/types.d.ts @@ -28,11 +28,14 @@ export type OffsetPaginatedResults_ImageDTO_ = // Models export type ModelType = components['schemas']['ModelType']; +export type SubModelType = components['schemas']['SubModelType']; export type BaseModelType = components['schemas']['BaseModelType']; export type MainModelField = components['schemas']['MainModelField']; export type OnnxModelField = components['schemas']['OnnxModelField']; export type VAEModelField = components['schemas']['VAEModelField']; export type LoRAModelField = components['schemas']['LoRAModelField']; +export type ControlNetModelField = + components['schemas']['ControlNetModelField']; export type ModelsList = components['schemas']['ModelsList']; export type ControlField = components['schemas']['ControlField']; @@ -43,18 +46,28 @@ export type ControlNetModelConfig = components['schemas']['ControlNetModelConfig']; export type TextualInversionModelConfig = components['schemas']['TextualInversionModelConfig']; -export type MainModelConfig = - | components['schemas']['StableDiffusion1ModelCheckpointConfig'] +export type DiffusersModelConfig = | components['schemas']['StableDiffusion1ModelDiffusersConfig'] + | components['schemas']['StableDiffusion2ModelDiffusersConfig'] + | components['schemas']['StableDiffusionXLModelDiffusersConfig']; +export type CheckpointModelConfig = + | components['schemas']['StableDiffusion1ModelCheckpointConfig'] | components['schemas']['StableDiffusion2ModelCheckpointConfig'] | components['schemas']['StableDiffusion2ModelDiffusersConfig']; export type OnnxModelConfig = components['schemas']['ONNXStableDiffusion1ModelConfig'] + | components['schemas']['StableDiffusionXLModelCheckpointConfig']; +export type MainModelConfig = DiffusersModelConfig | CheckpointModelConfig; export type AnyModelConfig = | LoRAModelConfig | VaeModelConfig | ControlNetModelConfig | TextualInversionModelConfig - | MainModelConfig; + | MainModelConfig + | OnnxModelConfig; + +export type MergeModelConfig = components['schemas']['Body_merge_models']; +export type ConvertModelConfig = components['schemas']['Body_convert_model']; +export type ImportModelConfig = components['schemas']['Body_import_model']; // Graphs export type Graph = components['schemas']['Graph']; @@ -81,6 +94,9 @@ export type InpaintInvocation = TypeReq< export type ImageResizeInvocation = TypeReq< components['schemas']['ImageResizeInvocation'] >; +export type ImageScaleInvocation = TypeReq< + components['schemas']['ImageScaleInvocation'] +>; export type RandomIntInvocation = TypeReq< components['schemas']['RandomIntInvocation'] >; @@ -118,6 +134,12 @@ export type LoraLoaderInvocation = TypeReq< export type MetadataAccumulatorInvocation = TypeReq< components['schemas']['MetadataAccumulatorInvocation'] >; +export type ESRGANInvocation = TypeReq< + components['schemas']['ESRGANInvocation'] +>; +export type DivideInvocation = TypeReq< + components['schemas']['DivideInvocation'] +>; // ControlNet Nodes export type ControlNetInvocation = TypeReq< diff --git a/invokeai/frontend/web/src/services/events/actions.ts b/invokeai/frontend/web/src/services/events/actions.ts index ed154b9cd8..cb2d665748 100644 --- a/invokeai/frontend/web/src/services/events/actions.ts +++ b/invokeai/frontend/web/src/services/events/actions.ts @@ -5,6 +5,8 @@ import { InvocationCompleteEvent, InvocationErrorEvent, InvocationStartedEvent, + ModelLoadCompletedEvent, + ModelLoadStartedEvent, } from 'services/events/types'; // Common socket action payload data @@ -162,3 +164,35 @@ export const socketGeneratorProgress = createAction< export const appSocketGeneratorProgress = createAction< BaseSocketPayload & { data: GeneratorProgressEvent } >('socket/appSocketGeneratorProgress'); + +/** + * Socket.IO Model Load Started + * + * Do not use. Only for use in middleware. + */ +export const socketModelLoadStarted = createAction< + BaseSocketPayload & { data: ModelLoadStartedEvent } +>('socket/socketModelLoadStarted'); + +/** + * App-level Model Load Started + */ +export const appSocketModelLoadStarted = createAction< + BaseSocketPayload & { data: ModelLoadStartedEvent } +>('socket/appSocketModelLoadStarted'); + +/** + * Socket.IO Model Load Started + * + * Do not use. Only for use in middleware. + */ +export const socketModelLoadCompleted = createAction< + BaseSocketPayload & { data: ModelLoadCompletedEvent } +>('socket/socketModelLoadCompleted'); + +/** + * App-level Model Load Completed + */ +export const appSocketModelLoadCompleted = createAction< + BaseSocketPayload & { data: ModelLoadCompletedEvent } +>('socket/appSocketModelLoadCompleted'); diff --git a/invokeai/frontend/web/src/services/events/types.ts b/invokeai/frontend/web/src/services/events/types.ts index f589fdd6cc..ec1b55e3fe 100644 --- a/invokeai/frontend/web/src/services/events/types.ts +++ b/invokeai/frontend/web/src/services/events/types.ts @@ -1,5 +1,11 @@ import { O } from 'ts-toolbelt'; -import { Graph, GraphExecutionState } from '../api/types'; +import { + BaseModelType, + Graph, + GraphExecutionState, + ModelType, + SubModelType, +} from '../api/types'; /** * A progress image, we get one for each step in the generation @@ -25,6 +31,25 @@ export type BaseNode = { [key: string]: AnyInvocation[keyof AnyInvocation]; }; +export type ModelLoadStartedEvent = { + graph_execution_state_id: string; + model_name: string; + base_model: BaseModelType; + model_type: ModelType; + submodel: SubModelType; +}; + +export type ModelLoadCompletedEvent = { + graph_execution_state_id: string; + model_name: string; + base_model: BaseModelType; + model_type: ModelType; + submodel: SubModelType; + hash?: string; + location: string; + precision: string; +}; + /** * A `generator_progress` socket.io event. * @@ -101,6 +126,8 @@ export type ServerToClientEvents = { graph_execution_state_complete: ( payload: GraphExecutionStateCompleteEvent ) => void; + model_load_started: (payload: ModelLoadStartedEvent) => void; + model_load_completed: (payload: ModelLoadCompletedEvent) => void; }; export type ClientToServerEvents = { diff --git a/invokeai/frontend/web/src/services/events/util/setEventListeners.ts b/invokeai/frontend/web/src/services/events/util/setEventListeners.ts index 62b5864185..44d3301556 100644 --- a/invokeai/frontend/web/src/services/events/util/setEventListeners.ts +++ b/invokeai/frontend/web/src/services/events/util/setEventListeners.ts @@ -11,6 +11,8 @@ import { socketConnected, socketDisconnected, socketSubscribed, + socketModelLoadStarted, + socketModelLoadCompleted, } from '../actions'; import { ClientToServerEvents, ServerToClientEvents } from '../types'; import { Logger } from 'roarr'; @@ -44,7 +46,7 @@ export const setEventListeners = (arg: SetEventListenersArg) => { socketSubscribed({ sessionId, timestamp: getTimestamp(), - boardId: getState().boards.selectedBoardId, + boardId: getState().gallery.selectedBoardId, }) ); } @@ -118,4 +120,28 @@ export const setEventListeners = (arg: SetEventListenersArg) => { }) ); }); + + /** + * Model load started + */ + socket.on('model_load_started', (data) => { + dispatch( + socketModelLoadStarted({ + data, + timestamp: getTimestamp(), + }) + ); + }); + + /** + * Model load completed + */ + socket.on('model_load_completed', (data) => { + dispatch( + socketModelLoadCompleted({ + data, + timestamp: getTimestamp(), + }) + ); + }); }; diff --git a/invokeai/frontend/web/src/theme/components/button.ts b/invokeai/frontend/web/src/theme/components/button.ts index 7bb8a39a71..3a1a56a1e9 100644 --- a/invokeai/frontend/web/src/theme/components/button.ts +++ b/invokeai/frontend/web/src/theme/components/button.ts @@ -16,19 +16,11 @@ const invokeAI = defineStyle((props) => { }; return { - bg: mode('base.200', 'base.600')(props), + bg: mode('base.250', 'base.600')(props), color: mode('base.850', 'base.100')(props), borderRadius: 'base', - textShadow: mode( - '0 0 0.3rem var(--invokeai-colors-base-50)', - '0 0 0.3rem var(--invokeai-colors-base-900)' - )(props), svg: { fill: mode('base.850', 'base.100')(props), - filter: mode( - 'drop-shadow(0px 0px 0.3rem var(--invokeai-colors-base-100))', - 'drop-shadow(0px 0px 0.3rem var(--invokeai-colors-base-800))' - )(props), }, _hover: { bg: mode('base.300', 'base.500')(props), @@ -57,16 +49,8 @@ const invokeAI = defineStyle((props) => { bg: mode(`${c}.400`, `${c}.600`)(props), color: mode(`base.50`, `base.100`)(props), borderRadius: 'base', - textShadow: mode( - `0 0 0.3rem var(--invokeai-colors-${c}-600)`, - `0 0 0.3rem var(--invokeai-colors-${c}-800)` - )(props), svg: { fill: mode(`base.50`, `base.100`)(props), - filter: mode( - `drop-shadow(0px 0px 0.3rem var(--invokeai-colors-${c}-600))`, - `drop-shadow(0px 0px 0.3rem var(--invokeai-colors-${c}-800))` - )(props), }, _disabled, _hover: { diff --git a/invokeai/frontend/web/src/theme/components/menu.ts b/invokeai/frontend/web/src/theme/components/menu.ts index 324720a040..563c5ce6a9 100644 --- a/invokeai/frontend/web/src/theme/components/menu.ts +++ b/invokeai/frontend/web/src/theme/components/menu.ts @@ -1,6 +1,7 @@ import { menuAnatomy } from '@chakra-ui/anatomy'; import { createMultiStyleConfigHelpers } from '@chakra-ui/react'; import { mode } from '@chakra-ui/theme-tools'; +import { MotionProps } from 'framer-motion'; const { definePartsStyle, defineMultiStyleConfig } = createMultiStyleConfigHelpers(menuAnatomy.keys); @@ -21,6 +22,7 @@ const invokeAI = definePartsStyle((props) => ({ }, list: { zIndex: 9999, + color: mode('base.900', 'base.150')(props), bg: mode('base.200', 'base.800')(props), shadow: 'dark-lg', border: 'none', @@ -35,6 +37,9 @@ const invokeAI = definePartsStyle((props) => ({ _focus: { bg: mode('base.400', 'base.600')(props), }, + svg: { + opacity: 0.5, + }, }, })); @@ -46,3 +51,28 @@ export const menuTheme = defineMultiStyleConfig({ variant: 'invokeAI', }, }); + +export const menuListMotionProps: MotionProps = { + variants: { + enter: { + visibility: 'visible', + opacity: 1, + scale: 1, + transition: { + duration: 0.07, + ease: [0.4, 0, 0.2, 1], + }, + }, + exit: { + transitionEnd: { + visibility: 'hidden', + }, + opacity: 0, + scale: 0.8, + transition: { + duration: 0.07, + easings: 'easeOut', + }, + }, + }, +}; diff --git a/invokeai/frontend/web/src/theme/components/slider.ts b/invokeai/frontend/web/src/theme/components/slider.ts index 397dea786a..98a2556b9e 100644 --- a/invokeai/frontend/web/src/theme/components/slider.ts +++ b/invokeai/frontend/web/src/theme/components/slider.ts @@ -30,7 +30,7 @@ const invokeAIThumb = defineStyle((props) => { const invokeAIMark = defineStyle((props) => { return { - fontSize: 'xs', + fontSize: '2xs', fontWeight: '500', color: mode('base.700', 'base.400')(props), mt: 2, diff --git a/invokeai/frontend/web/src/theme/components/text.ts b/invokeai/frontend/web/src/theme/components/text.ts index 2404bf0594..cccbcf2391 100644 --- a/invokeai/frontend/web/src/theme/components/text.ts +++ b/invokeai/frontend/web/src/theme/components/text.ts @@ -2,7 +2,7 @@ import { defineStyle, defineStyleConfig } from '@chakra-ui/react'; import { mode } from '@chakra-ui/theme-tools'; const subtext = defineStyle((props) => ({ - color: mode('colors.base.500', 'colors.base.400')(props), + color: mode('base.500', 'base.400')(props), })); export const textTheme = defineStyleConfig({ diff --git a/invokeai/frontend/web/src/theme/theme.ts b/invokeai/frontend/web/src/theme/theme.ts index 03d1f640ac..42a5a12c3f 100644 --- a/invokeai/frontend/web/src/theme/theme.ts +++ b/invokeai/frontend/web/src/theme/theme.ts @@ -13,13 +13,13 @@ import { popoverTheme } from './components/popover'; import { progressTheme } from './components/progress'; import { no_scrollbar } from './components/scrollbar'; import { selectTheme } from './components/select'; +import { skeletonTheme } from './components/skeleton'; import { sliderTheme } from './components/slider'; import { switchTheme } from './components/switch'; import { tabsTheme } from './components/tabs'; import { textTheme } from './components/text'; import { textareaTheme } from './components/textarea'; import { tooltipTheme } from './components/tooltip'; -import { skeletonTheme } from './components/skeleton'; export const theme: ThemeOverride = { config: { @@ -74,7 +74,7 @@ export const theme: ThemeOverride = { '0px 0px 0px 1px var(--invokeai-colors-base-150), 0px 0px 0px 4px var(--invokeai-colors-accent-400)', dark: '0px 0px 0px 1px var(--invokeai-colors-base-900), 0px 0px 0px 4px var(--invokeai-colors-accent-400)', }, - nodeSelectedOutline: `0 0 0 2px var(--invokeai-colors-base-500)`, + nodeSelectedOutline: `0 0 0 2px var(--invokeai-colors-accent-450)`, }, colors: InvokeAIColors, components: { diff --git a/invokeai/frontend/web/yarn.lock b/invokeai/frontend/web/yarn.lock index 2db168a8ce..6f110a1117 100644 --- a/invokeai/frontend/web/yarn.lock +++ b/invokeai/frontend/web/yarn.lock @@ -51,14 +51,14 @@ js-tokens "^4.0.0" "@babel/parser@^7.0.0", "@babel/parser@^7.21.4": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.22.5.tgz#721fd042f3ce1896238cf1b341c77eb7dee7dbea" - integrity sha512-DFZMC9LJUG9PLOclRC32G63UXwzqS2koQC8dkx+PLdmt1xSePYpbT/NbsrJy8Q/muXz7o/h/d4A7Fuyixm559Q== + version "7.22.7" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.22.7.tgz#df8cf085ce92ddbdbf668a7f186ce848c9036cae" + integrity sha512-7NF8pOkHP5o2vpmGgNGcfAeCvOYhGLyA3Z4eBQkT1RJlWu47n63bCs93QfJ2hIAFCil7L5P2IWhs1oToVgrL0Q== "@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.10.2", "@babel/runtime@^7.12.1", "@babel/runtime@^7.12.13", "@babel/runtime@^7.12.5", "@babel/runtime@^7.13.10", "@babel/runtime@^7.14.8", "@babel/runtime@^7.18.3", "@babel/runtime@^7.19.4", "@babel/runtime@^7.21.0", "@babel/runtime@^7.22.5", "@babel/runtime@^7.9.2": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.22.5.tgz#8564dd588182ce0047d55d7a75e93921107b57ec" - integrity sha512-ecjvYlnAaZ/KVneE/OdKYBYfgXV3Ptu6zQWmgEF7vwKhQnvVS6bjMD2XYgj+SNvQ1GfK/pjgokfPkC/2CO8CuA== + version "7.22.6" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.22.6.tgz#57d64b9ae3cff1d67eb067ae117dac087f5bd438" + integrity sha512-wDb5pWm4WDdF6LFUde3Jl8WzPA+3ZbxYqkC6xAXuD3irdEHN1k0NfTRrJD8ZD378SJ61miMLCqIOXYhd8x+AJQ== dependencies: regenerator-runtime "^0.13.11" @@ -1070,111 +1070,221 @@ resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.17.19.tgz#bafb75234a5d3d1b690e7c2956a599345e84a2fd" integrity sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA== +"@esbuild/android-arm64@0.18.14": + version "0.18.14" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.18.14.tgz#d86197e6ff965a187b2ea2704915f596a040ed4b" + integrity sha512-rZ2v+Luba5/3D6l8kofWgTnqE+qsC/L5MleKIKFyllHTKHrNBMqeRCnZI1BtRx8B24xMYxeU32iIddRQqMsOsg== + "@esbuild/android-arm@0.17.19": version "0.17.19" resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.17.19.tgz#5898f7832c2298bc7d0ab53701c57beb74d78b4d" integrity sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A== +"@esbuild/android-arm@0.18.14": + version "0.18.14" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.18.14.tgz#ed59310c0e6ec6df8b17e363d33a954ecf870f4f" + integrity sha512-blODaaL+lngG5bdK/t4qZcQvq2BBqrABmYwqPPcS5VRxrCSGHb9R/rA3fqxh7R18I7WU4KKv+NYkt22FDfalcg== + "@esbuild/android-x64@0.17.19": version "0.17.19" resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.17.19.tgz#658368ef92067866d95fb268719f98f363d13ae1" integrity sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww== +"@esbuild/android-x64@0.18.14": + version "0.18.14" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.18.14.tgz#e01b387f1db3dd2596a44e8c577aa2609750bc82" + integrity sha512-qSwh8y38QKl+1Iqg+YhvCVYlSk3dVLk9N88VO71U4FUjtiSFylMWK3Ugr8GC6eTkkP4Tc83dVppt2n8vIdlSGg== + "@esbuild/darwin-arm64@0.17.19": version "0.17.19" resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.17.19.tgz#584c34c5991b95d4d48d333300b1a4e2ff7be276" integrity sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg== +"@esbuild/darwin-arm64@0.18.14": + version "0.18.14" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.18.14.tgz#e92fbdeb9ff209a762cf107df3026c1b3e04ab85" + integrity sha512-9Hl2D2PBeDYZiNbnRKRWuxwHa9v5ssWBBjisXFkVcSP5cZqzZRFBUWEQuqBHO4+PKx4q4wgHoWtfQ1S7rUqJ2Q== + "@esbuild/darwin-x64@0.17.19": version "0.17.19" resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.17.19.tgz#7751d236dfe6ce136cce343dce69f52d76b7f6cb" integrity sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw== +"@esbuild/darwin-x64@0.18.14": + version "0.18.14" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.18.14.tgz#bc1884d9f812647e2078fa4c46e4bffec53c7c09" + integrity sha512-ZnI3Dg4ElQ6tlv82qLc/UNHtFsgZSKZ7KjsUNAo1BF1SoYDjkGKHJyCrYyWjFecmXpvvG/KJ9A/oe0H12odPLQ== + "@esbuild/freebsd-arm64@0.17.19": version "0.17.19" resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.19.tgz#cacd171665dd1d500f45c167d50c6b7e539d5fd2" integrity sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ== +"@esbuild/freebsd-arm64@0.18.14": + version "0.18.14" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.14.tgz#1fa876f627536b5037f4aed90545ccc330fd509b" + integrity sha512-h3OqR80Da4oQCIa37zl8tU5MwHQ7qgPV0oVScPfKJK21fSRZEhLE4IIVpmcOxfAVmqjU6NDxcxhYaM8aDIGRLw== + "@esbuild/freebsd-x64@0.17.19": version "0.17.19" resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.17.19.tgz#0769456eee2a08b8d925d7c00b79e861cb3162e4" integrity sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ== +"@esbuild/freebsd-x64@0.18.14": + version "0.18.14" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.18.14.tgz#effaa4c5d7bab695b5e6fae459eaf49121fbc7c3" + integrity sha512-ha4BX+S6CZG4BoH9tOZTrFIYC1DH13UTCRHzFc3GWX74nz3h/N6MPF3tuR3XlsNjMFUazGgm35MPW5tHkn2lzQ== + "@esbuild/linux-arm64@0.17.19": version "0.17.19" resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.17.19.tgz#38e162ecb723862c6be1c27d6389f48960b68edb" integrity sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg== +"@esbuild/linux-arm64@0.18.14": + version "0.18.14" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.18.14.tgz#24bb4b1836fe7900e1ffda78aa6875a4eb500e3a" + integrity sha512-IXORRe22In7U65NZCzjwAUc03nn8SDIzWCnfzJ6t/8AvGx5zBkcLfknI+0P+hhuftufJBmIXxdSTbzWc8X/V4w== + "@esbuild/linux-arm@0.17.19": version "0.17.19" resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.17.19.tgz#1a2cd399c50040184a805174a6d89097d9d1559a" integrity sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA== +"@esbuild/linux-arm@0.18.14": + version "0.18.14" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.18.14.tgz#7f3490320a4627f4c850a8613385bdf3ffb82285" + integrity sha512-5+7vehI1iqru5WRtJyU2XvTOvTGURw3OZxe3YTdE9muNNIdmKAVmSHpB3Vw2LazJk2ifEdIMt/wTWnVe5V98Kg== + "@esbuild/linux-ia32@0.17.19": version "0.17.19" resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.17.19.tgz#e28c25266b036ce1cabca3c30155222841dc035a" integrity sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ== +"@esbuild/linux-ia32@0.18.14": + version "0.18.14" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.18.14.tgz#91f1e82f92ffaff8d72f9d90a0f209022529031a" + integrity sha512-BfHlMa0nibwpjG+VXbOoqJDmFde4UK2gnW351SQ2Zd4t1N3zNdmUEqRkw/srC1Sa1DRBE88Dbwg4JgWCbNz/FQ== + "@esbuild/linux-loong64@0.17.19": version "0.17.19" resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.17.19.tgz#0f887b8bb3f90658d1a0117283e55dbd4c9dcf72" integrity sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ== +"@esbuild/linux-loong64@0.18.14": + version "0.18.14" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.18.14.tgz#cd5cb806af6361578800af79919c5cfd53401a17" + integrity sha512-j2/Ex++DRUWIAaUDprXd3JevzGtZ4/d7VKz+AYDoHZ3HjJzCyYBub9CU1wwIXN+viOP0b4VR3RhGClsvyt/xSw== + "@esbuild/linux-mips64el@0.17.19": version "0.17.19" resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.17.19.tgz#f5d2a0b8047ea9a5d9f592a178ea054053a70289" integrity sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A== +"@esbuild/linux-mips64el@0.18.14": + version "0.18.14" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.18.14.tgz#c635b6c0b8b4f9b4bff3aaafad59fa8cc07b354a" + integrity sha512-qn2+nc+ZCrJmiicoAnJXJJkZWt8Nwswgu1crY7N+PBR8ChBHh89XRxj38UU6Dkthl2yCVO9jWuafZ24muzDC/A== + "@esbuild/linux-ppc64@0.17.19": version "0.17.19" resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.17.19.tgz#876590e3acbd9fa7f57a2c7d86f83717dbbac8c7" integrity sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg== +"@esbuild/linux-ppc64@0.18.14": + version "0.18.14" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.18.14.tgz#9b2bb80b7e30667a81ffbcddb74ad8e79330cc94" + integrity sha512-aGzXzd+djqeEC5IRkDKt3kWzvXoXC6K6GyYKxd+wsFJ2VQYnOWE954qV2tvy5/aaNrmgPTb52cSCHFE+Z7Z0yg== + "@esbuild/linux-riscv64@0.17.19": version "0.17.19" resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.17.19.tgz#7f49373df463cd9f41dc34f9b2262d771688bf09" integrity sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA== +"@esbuild/linux-riscv64@0.18.14": + version "0.18.14" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.18.14.tgz#9520d34a4ecbf404e56f4cebdcc686c83b66babc" + integrity sha512-8C6vWbfr0ygbAiMFLS6OPz0BHvApkT2gCboOGV76YrYw+sD/MQJzyITNsjZWDXJwPu9tjrFQOVG7zijRzBCnLw== + "@esbuild/linux-s390x@0.17.19": version "0.17.19" resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.17.19.tgz#e2afd1afcaf63afe2c7d9ceacd28ec57c77f8829" integrity sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q== +"@esbuild/linux-s390x@0.18.14": + version "0.18.14" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.18.14.tgz#3987e30f807b8faf20815b2b2f0a4919084d4e7c" + integrity sha512-G/Lf9iu8sRMM60OVGOh94ZW2nIStksEcITkXdkD09/T6QFD/o+g0+9WVyR/jajIb3A0LvBJ670tBnGe1GgXMgw== + "@esbuild/linux-x64@0.17.19": version "0.17.19" resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.17.19.tgz#8a0e9738b1635f0c53389e515ae83826dec22aa4" integrity sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw== +"@esbuild/linux-x64@0.18.14": + version "0.18.14" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.18.14.tgz#51c727dc7045c47ab8c08fe6c09cda3e170d99f3" + integrity sha512-TBgStYBQaa3EGhgqIDM+ECnkreb0wkcKqL7H6m+XPcGUoU4dO7dqewfbm0mWEQYH3kzFHrzjOFNpSAVzDZRSJw== + "@esbuild/netbsd-x64@0.17.19": version "0.17.19" resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.17.19.tgz#c29fb2453c6b7ddef9a35e2c18b37bda1ae5c462" integrity sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q== +"@esbuild/netbsd-x64@0.18.14": + version "0.18.14" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.18.14.tgz#4677bf88b489d5ffe1b5f0abbb85812996455479" + integrity sha512-stvCcjyCQR2lMTroqNhAbvROqRjxPEq0oQ380YdXxA81TaRJEucH/PzJ/qsEtsHgXlWFW6Ryr/X15vxQiyRXVg== + "@esbuild/openbsd-x64@0.17.19": version "0.17.19" resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.17.19.tgz#95e75a391403cb10297280d524d66ce04c920691" integrity sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g== +"@esbuild/openbsd-x64@0.18.14": + version "0.18.14" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.18.14.tgz#939902897e533162450f69266f32ef1325ba98fd" + integrity sha512-apAOJF14CIsN5ht1PA57PboEMsNV70j3FUdxLmA2liZ20gEQnfTG5QU0FhENo5nwbTqCB2O3WDsXAihfODjHYw== + "@esbuild/sunos-x64@0.17.19": version "0.17.19" resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.17.19.tgz#722eaf057b83c2575937d3ffe5aeb16540da7273" integrity sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg== +"@esbuild/sunos-x64@0.18.14": + version "0.18.14" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.18.14.tgz#a50721d47b93586249bd63250bd4b7496fc9957b" + integrity sha512-fYRaaS8mDgZcGybPn2MQbn1ZNZx+UXFSUoS5Hd2oEnlsyUcr/l3c6RnXf1bLDRKKdLRSabTmyCy7VLQ7VhGdOQ== + "@esbuild/win32-arm64@0.17.19": version "0.17.19" resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.17.19.tgz#9aa9dc074399288bdcdd283443e9aeb6b9552b6f" integrity sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag== +"@esbuild/win32-arm64@0.18.14": + version "0.18.14" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.18.14.tgz#d8531d370e6fd0e0e40f40e016f996bbe4fd5ebf" + integrity sha512-1c44RcxKEJPrVj62XdmYhxXaU/V7auELCmnD+Ri+UCt+AGxTvzxl9uauQhrFso8gj6ZV1DaORV0sT9XSHOAk8Q== + "@esbuild/win32-ia32@0.17.19": version "0.17.19" resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.17.19.tgz#95ad43c62ad62485e210f6299c7b2571e48d2b03" integrity sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw== +"@esbuild/win32-ia32@0.18.14": + version "0.18.14" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.18.14.tgz#dcbf75e4e65d2921cd4be14ed67cec7360440e46" + integrity sha512-EXAFttrdAxZkFQmpvcAQ2bywlWUsONp/9c2lcfvPUhu8vXBBenCXpoq9YkUvVP639ld3YGiYx0YUQ6/VQz3Maw== + "@esbuild/win32-x64@0.17.19": version "0.17.19" resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.17.19.tgz#8cfaf2ff603e9aabb910e9c0558c26cf32744061" integrity sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA== +"@esbuild/win32-x64@0.18.14": + version "0.18.14" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.18.14.tgz#43f66032e0f189b6f394d4dbc903a188bb0c969f" + integrity sha512-K0QjGbcskx+gY+qp3v4/940qg8JitpXbdxFhRDA1aYoNaPff88+aEwoq45aqJ+ogpxQxmU0ZTjgnrQD/w8iiUg== + "@eslint-community/eslint-utils@^4.2.0": version "4.4.0" resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" @@ -1213,9 +1323,9 @@ integrity sha512-Bu+AMaXNjrpjh41znzHqaz3r2Nr8hHuHZT6V2LBKMhyMl0FgKA62PNYbqnfgmzOhoWZj70Zecisbo4H1rotP5g== "@floating-ui/dom@^1.2.1", "@floating-ui/dom@^1.3.0": - version "1.4.2" - resolved "https://registry.yarnpkg.com/@floating-ui/dom/-/dom-1.4.2.tgz#eb3a37f7506c4f95ef735967dc3496b5012e11cb" - integrity sha512-VKmvHVatWnewmGGy+7Mdy4cTJX71Pli6v/Wjb5RQBuq5wjUYx+Ef+kRThi8qggZqDgD8CogCpqhRoVp3+yQk+g== + version "1.4.5" + resolved "https://registry.yarnpkg.com/@floating-ui/dom/-/dom-1.4.5.tgz#336dfb9870c98b471ff5802002982e489b8bd1c5" + integrity sha512-96KnRWkRnuBSSFbj0sFGwwOUd8EkiecINVl0O9wiZlZ64EkpyAOG3Xc2vKKNJmru0Z7RqWNymA+6b8OZqjgyyw== dependencies: "@floating-ui/core" "^1.3.1" @@ -1243,14 +1353,14 @@ tabbable "^6.0.1" "@fontsource-variable/inter@^5.0.3": - version "5.0.3" - resolved "https://registry.yarnpkg.com/@fontsource-variable/inter/-/inter-5.0.3.tgz#60df2496572ca2d5e783b6f8904472f093041eb5" - integrity sha512-AIE1Lm2/cNkCD4oAJ3JVY54tGhlUS7NnAiqGmE045v+7XHqmUhSYjhQNUgnBGcenth4bN75l+KIeTDbcGc7Emw== + version "5.0.5" + resolved "https://registry.yarnpkg.com/@fontsource-variable/inter/-/inter-5.0.5.tgz#a03cf816dc1f0df24f61b30f5936bcc99e0aad03" + integrity sha512-hmj/jffr+1tabEPmvm+/b89MtbO6hd5PVbQ6HoMGTO7RMF5eD2C9UcprCgZTOF3OWh5uC21C9HZGN0O9wxe+UQ== "@fontsource/inter@^5.0.3": - version "5.0.3" - resolved "https://registry.yarnpkg.com/@fontsource/inter/-/inter-5.0.3.tgz#30a1c0b974e29d72eddaec0c45655597ffa0bf80" - integrity sha512-JJvh5xht71F6e0E5r2+Ffu8g+CYAxMvnGJm9ZMg5IIjy8UwxLp+8C99TgPJupdEyBpEJv0wuMG2Rd183z/bV8g== + version "5.0.5" + resolved "https://registry.yarnpkg.com/@fontsource/inter/-/inter-5.0.5.tgz#bd3e923660cc4632d09b1882d104b0cb9430dec6" + integrity sha512-RE1JmWRB6Kxo+1nXUnORSSH5uKgUZ2QEQE+h/nsNt758C+17G9y26E9QiAsIqsG13NpKhwn22EeECfyC+da5ew== "@humanwhocodes/config-array@^0.11.10": version "0.11.10" @@ -1291,9 +1401,9 @@ integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== "@jridgewell/source-map@^0.3.3": - version "0.3.3" - resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.3.tgz#8108265659d4c33e72ffe14e33d6cc5eb59f2fda" - integrity sha512-b+fsZXeLYi9fEULmfBrhxn4IrPlINf8fiNarzTof004v3lFdntdwa9PF7vFJqm3mg7s+ScJMxXaE3Acp1irZcg== + version "0.3.5" + resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.5.tgz#a3bb4d5c6825aab0d281268f47f6ad5853431e91" + integrity sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ== dependencies: "@jridgewell/gen-mapping" "^0.3.0" "@jridgewell/trace-mapping" "^0.3.9" @@ -1322,61 +1432,61 @@ integrity sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg== "@mantine/core@^6.0.14": - version "6.0.14" - resolved "https://registry.yarnpkg.com/@mantine/core/-/core-6.0.14.tgz#eac887f49ab6427784baac2902e2cb0b4939b1c4" - integrity sha512-O916itwsB5XtEStVZRqp3SlB4aLM0sSgOFYYCVnLJ3E9O9E8h1xhaNEml1FJbMtrlNaXYUd6sy/OSRqNl9DyKA== + version "6.0.17" + resolved "https://registry.yarnpkg.com/@mantine/core/-/core-6.0.17.tgz#734b31c79199a9cf2bfb0bbd7482f5c2c411ff9a" + integrity sha512-g3EDxcTJKisvEGTsGJPCGXiDumwr4O0nGNXwoGLnrg19nh3FAMfEIq18sJJLtRrBuarSbrvgMVYvKx1R6rTOWg== dependencies: "@floating-ui/react" "^0.19.1" - "@mantine/styles" "6.0.14" - "@mantine/utils" "6.0.14" + "@mantine/styles" "6.0.17" + "@mantine/utils" "6.0.17" "@radix-ui/react-scroll-area" "1.0.2" react-remove-scroll "^2.5.5" react-textarea-autosize "8.3.4" "@mantine/form@^6.0.15": - version "6.0.15" - resolved "https://registry.yarnpkg.com/@mantine/form/-/form-6.0.15.tgz#e78d953669888e01d3778ee8f62d469a12668c42" - integrity sha512-Tz4AuZZ/ddGvEh5zJbDyi9PlGqTilJBdCjRGIgs3zn3hQsfg+ku7/NUR5zNB64dcWPJvGKc074y4iopNIl3FWQ== + version "6.0.17" + resolved "https://registry.yarnpkg.com/@mantine/form/-/form-6.0.17.tgz#ab4fe22ea83976a3e621f0fcc2d36eae19f37141" + integrity sha512-hrWlBukErklaFSvKfz4PCl3Cd7UgHf5Q/FyZPD+WvBDT0zZ5uMjatQpVs/HAfhFOA5O2DFKAcs654mLzmJJ6Wg== dependencies: fast-deep-equal "^3.1.3" klona "^2.0.5" "@mantine/hooks@^6.0.14": - version "6.0.14" - resolved "https://registry.yarnpkg.com/@mantine/hooks/-/hooks-6.0.14.tgz#5f52a75cdd36b14c13a5ffeeedc510d73db76dc0" - integrity sha512-cBGdTSdBDLcPScoeI12DCWFVzmT4tX+DmI9s+MOBm4IdhF4ogkLbbRgKosFbaBWNKx9WzYAUiQR/tUI5dTkJPQ== + version "6.0.17" + resolved "https://registry.yarnpkg.com/@mantine/hooks/-/hooks-6.0.17.tgz#dc942c87e6dcfa14a70e4e4a162c22eeb4ff3724" + integrity sha512-7vf2w1NlzKlUynSuyI2DAIKoEOYKYC8k+tlSsk3BRdbzhbJAiWxcYzJy5seg5dFW1WIpKAZ0wiVdHXf/WRlRgg== -"@mantine/styles@6.0.14": - version "6.0.14" - resolved "https://registry.yarnpkg.com/@mantine/styles/-/styles-6.0.14.tgz#5fd930abfceef8ffd7a98c30c87b7ebcf3845147" - integrity sha512-qkqUodvVPzthmVzWQHYe/yWrc8UZcz8A5KfegK2Ps67bZzfoZs/NBVcEx6REq8HTsISjYw3jJyMRxAE3G7Ms4Q== +"@mantine/styles@6.0.17": + version "6.0.17" + resolved "https://registry.yarnpkg.com/@mantine/styles/-/styles-6.0.17.tgz#fef8a64f0e32b970c397e1c22dceb6ab09fb090f" + integrity sha512-utNwQJgKHguNS0iPyyeFRJy4nbt280XMbmfUf4GCxXlyl/mQxq+JoaKP/OmU7+8kfbtLS9kHeuBSghrC65Nt1g== dependencies: clsx "1.1.1" csstype "3.0.9" -"@mantine/utils@6.0.14": - version "6.0.14" - resolved "https://registry.yarnpkg.com/@mantine/utils/-/utils-6.0.14.tgz#cafa8b22cc077398bb2c4b8c1eae31490438f2a8" - integrity sha512-se+3IXJsNj4wnLMlqc7LiBe74m+JLQJ5o3wEcDtFzaJEtEt1rtw/1q3xKuROkH3xEiauhxQgzsc4gj/AslHy2A== +"@mantine/utils@6.0.17": + version "6.0.17" + resolved "https://registry.yarnpkg.com/@mantine/utils/-/utils-6.0.17.tgz#7d4a6c7686a3ee19a0ac248ef14780f00730837b" + integrity sha512-U6SWV/asYE6NhiHx4ltmVZdQR3HwGVqJxVulhOylMcV1tX/P1LMQUCbGV2Oe4O9jbX4/YW5B/CBb4BbEhENQFQ== -"@microsoft/api-extractor-model@7.27.3": - version "7.27.3" - resolved "https://registry.yarnpkg.com/@microsoft/api-extractor-model/-/api-extractor-model-7.27.3.tgz#a484e0b7e25c4fa85846281aed6b87da0411d96c" - integrity sha512-fSFvw7otYHduOkyshjTbapKKgwF8bgquVHvgF8VgeKtMYvqXkoaj7W6VcM7PNY7E2bbblhUgC4XNdqZLD4SJGw== +"@microsoft/api-extractor-model@7.27.4": + version "7.27.4" + resolved "https://registry.yarnpkg.com/@microsoft/api-extractor-model/-/api-extractor-model-7.27.4.tgz#ddc566ead99737c1032d692829edd954870f7d35" + integrity sha512-HjqQFmuGPOS20rtnu+9Jj0QrqZyR59E+piUWXPMZTTn4jaZI+4UmsHSf3Id8vyueAhOBH2cgwBuRTE5R+MfSMw== dependencies: "@microsoft/tsdoc" "0.14.2" "@microsoft/tsdoc-config" "~0.16.1" - "@rushstack/node-core-library" "3.59.4" + "@rushstack/node-core-library" "3.59.5" "@microsoft/api-extractor@^7.34.4": - version "7.36.0" - resolved "https://registry.yarnpkg.com/@microsoft/api-extractor/-/api-extractor-7.36.0.tgz#e0a9f449bb1393697691b79045f384dd78fd760e" - integrity sha512-P+kYgJFDXIr+UNzhRMhlpM/dderi6ab4lxn35vdhfAIMPtGCSXIJxrrtpTOQmQW8CZtmoZX06LYoUsKCc1zjow== + version "7.36.2" + resolved "https://registry.yarnpkg.com/@microsoft/api-extractor/-/api-extractor-7.36.2.tgz#8f7696fcc3c9c0c43469e6f59c56349bc1631193" + integrity sha512-ONe/jOmTZtR3OjTkWKHmeSV1P5ozbHDxHr6FV3KoWyIl1AcPk2B3dmvVBM5eOlZB5bgM66nxcWQTZ6msQo2hHg== dependencies: - "@microsoft/api-extractor-model" "7.27.3" + "@microsoft/api-extractor-model" "7.27.4" "@microsoft/tsdoc" "0.14.2" "@microsoft/tsdoc-config" "~0.16.1" - "@rushstack/node-core-library" "3.59.4" + "@rushstack/node-core-library" "3.59.5" "@rushstack/rig-package" "0.4.0" "@rushstack/ts-command-line" "4.15.1" colors "~1.2.1" @@ -1619,10 +1729,10 @@ estree-walker "^2.0.2" picomatch "^2.3.1" -"@rushstack/node-core-library@3.59.4", "@rushstack/node-core-library@^3.55.2": - version "3.59.4" - resolved "https://registry.yarnpkg.com/@rushstack/node-core-library/-/node-core-library-3.59.4.tgz#95f9eb3274627a5e84ee9443e65bb6edec1a5dc8" - integrity sha512-YAKJDC6Mz/KA1D7bvB88WaRX3knt/ZuLzkRu5G9QADGSjLtvTWzCNCytRF2PCSaaHOZaZsWul4F1KQdgFgUDqA== +"@rushstack/node-core-library@3.59.5", "@rushstack/node-core-library@^3.55.2": + version "3.59.5" + resolved "https://registry.yarnpkg.com/@rushstack/node-core-library/-/node-core-library-3.59.5.tgz#38034d4c38b5ddd7d1c7f04233ce1b2209b7ae1f" + integrity sha512-1IpV7LufrI1EoVO8hYsb3t6L8L+yp40Sa0OaOV2CIu1zx4e6ZeVNaVIEXFgMXBKdGXkAh21MnCaIzlDNpG6ZQw== dependencies: colors "~1.2.1" fs-extra "~7.0.1" @@ -1655,71 +1765,71 @@ resolved "https://registry.yarnpkg.com/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz#96116f2a912e0c02817345b3c10751069920d553" integrity sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg== -"@swc/core-darwin-arm64@1.3.66": - version "1.3.66" - resolved "https://registry.yarnpkg.com/@swc/core-darwin-arm64/-/core-darwin-arm64-1.3.66.tgz#b34a396479ca8fc82876d6dfb28c78a51010e6ce" - integrity sha512-UijJsvuLy73vxeVYEy7urIHksXS+3BdvJ9s9AY+bRMSQW483NO7RLp8g4FdTyJbRaN0BH15SQnY0dcjQBkVuHw== +"@swc/core-darwin-arm64@1.3.70": + version "1.3.70" + resolved "https://registry.yarnpkg.com/@swc/core-darwin-arm64/-/core-darwin-arm64-1.3.70.tgz#056ac6899e22cb7f7be21388d4d938ca5123a72b" + integrity sha512-31+mcl0dgdRHvZRjhLOK9V6B+qJ7nxDZYINr9pBlqGWxknz37Vld5KK19Kpr79r0dXUZvaaelLjCnJk9dA2PcQ== -"@swc/core-darwin-x64@1.3.66": - version "1.3.66" - resolved "https://registry.yarnpkg.com/@swc/core-darwin-x64/-/core-darwin-x64-1.3.66.tgz#b778e434d29652eae6da6ee7ed335605f7cfd866" - integrity sha512-xGsHKvViQnwTNLF30Y/5OqWdnN6RsiyUI8awZXfz1sHcXCEaLe+v+WLQ+/E8sgw0YUkYVHzzfV/sAN2CezJK5Q== +"@swc/core-darwin-x64@1.3.70": + version "1.3.70" + resolved "https://registry.yarnpkg.com/@swc/core-darwin-x64/-/core-darwin-x64-1.3.70.tgz#3945814de6fadbee5b46cb2a3422353acb420c5c" + integrity sha512-GMFJ65E18zQC80t0os+TZvI+8lbRuitncWVge/RXmXbVLPRcdykP4EJ87cqzcG5Ah0z18/E0T+ixD6jHRisrYQ== -"@swc/core-linux-arm-gnueabihf@1.3.66": - version "1.3.66" - resolved "https://registry.yarnpkg.com/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.3.66.tgz#a7ab556dc9fc770069fea292ff5551161df83a70" - integrity sha512-gNbLcSIV2pq90BkMSpzvK4xPXOl8GEF3YR4NaqF0CYSzQsVXXTTqMuX/r26xNYudBKzH0345S1MpoRk2qricnA== +"@swc/core-linux-arm-gnueabihf@1.3.70": + version "1.3.70" + resolved "https://registry.yarnpkg.com/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.3.70.tgz#7960e54ede1af75a7ef99ee53febf37fea6269a8" + integrity sha512-wjhCwS8LCiAq2VedF1b4Bryyw68xZnfMED4pLRazAl8BaUlDFANfRBORNunxlfHQj4V3x39IaiLgCZRHMdzXBg== -"@swc/core-linux-arm64-gnu@1.3.66": - version "1.3.66" - resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.3.66.tgz#00591f5fd0d9f1d1ed565329936451eb6d0d5433" - integrity sha512-cJSQ0oplyWbJqy4rzVcnBYLAi6z1QT3QCcR7iAey0aAmCvfRBZJfXlyjggMjn4iosuadkauwCZR1xYNhBDRn7w== +"@swc/core-linux-arm64-gnu@1.3.70": + version "1.3.70" + resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.3.70.tgz#df9654e5040bbeb1619739756a7f50100e38ace8" + integrity sha512-9D/Rx67cAOnMiexvCqARxvhj7coRajTp5HlJHuf+rfwMqI2hLhpO9/pBMQxBUAWxODO/ksQ/OF+GJRjmtWw/2A== -"@swc/core-linux-arm64-musl@1.3.66": - version "1.3.66" - resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.3.66.tgz#dd8e5e7b1154b5a42a32d57914e0de2cef6686ff" - integrity sha512-GDQZpcB9aGxG9PTA2shdIkoMZlGK5omJ8NR49uoBTtLBVYiGeXAwV0U1Uaw8kXEZj9i7wZDkvjzjSaNH3evRsg== +"@swc/core-linux-arm64-musl@1.3.70": + version "1.3.70" + resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.3.70.tgz#2c2aab5a136c7eb409ddc9cdc4f947a68fd74493" + integrity sha512-gkjxBio7XD+1GlQVVyPP/qeFkLu83VhRHXaUrkNYpr5UZG9zZurBERT9nkS6Y+ouYh+Q9xmw57aIyd2KvD2zqQ== -"@swc/core-linux-x64-gnu@1.3.66": - version "1.3.66" - resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.3.66.tgz#35de4b88e3f256e7923503a8031569c733859b68" - integrity sha512-lg8E4O/Pd9KfK0lajdinVMuGME8dSv7V9arhEpmlfGE2eXSDCWqDn5Htk5QVBstt9lt1lsRhWHJ/YYc2eQY30Q== +"@swc/core-linux-x64-gnu@1.3.70": + version "1.3.70" + resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.3.70.tgz#774351532b154ed36a5c6d14b647e7a8ab510028" + integrity sha512-/nCly+V4xfMVwfEUoLLAukxUSot/RcSzsf6GdsGTjFcrp5sZIntAjokYRytm3VT1c2TK321AfBorsi9R5w8Y7Q== -"@swc/core-linux-x64-musl@1.3.66": - version "1.3.66" - resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.3.66.tgz#623de62c638a31cda5d44014b981290e3f79f6de" - integrity sha512-lo8ZcAO/zL2pZWH+LZIyge8u2MklaeuT6+FpVVpBFktMVdYXbaVtzpvWbgRFBZHvL3SRDF+u8jxjtkXhvGUpTw== +"@swc/core-linux-x64-musl@1.3.70": + version "1.3.70" + resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.3.70.tgz#c0b1b4ad5f4ef187eaa093589a4933ecb6836546" + integrity sha512-HoOsPJbt361KGKaivAK0qIiYARkhzlxeAfvF5NlnKxkIMOZpQ46Lwj3tR0VWohKbrhS+cYKFlVuDi5XnDkx0XA== -"@swc/core-win32-arm64-msvc@1.3.66": - version "1.3.66" - resolved "https://registry.yarnpkg.com/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.3.66.tgz#49a432f43a314666e681a98801d7b2d303e5ef75" - integrity sha512-cQoVwBuJY5WkHbfpCOlndNwYr1ZThatRjQQvKy540NUIeAEk9Fa6ozlDBtU75UdaWKtUG6YQ/bWz+KTemheVxw== +"@swc/core-win32-arm64-msvc@1.3.70": + version "1.3.70" + resolved "https://registry.yarnpkg.com/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.3.70.tgz#8640267ce3959db0e7e682103677a5e0500b5ea7" + integrity sha512-hm4IBK/IaRil+aj1cWU6f0GyAdHpw/Jr5nyFYLM2c/tt7w2t5hgb8NjzM2iM84lOClrig1fG6edj2vCF1dFzNQ== -"@swc/core-win32-ia32-msvc@1.3.66": - version "1.3.66" - resolved "https://registry.yarnpkg.com/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.3.66.tgz#80c8af627b46de67fbac05908025e764194669ad" - integrity sha512-y/FrAIINK4UBeUQQknGlWXEyjo+MBvjF7WkUf2KP7sNr9EHHy8+dXohAGd5Anz0eJrqOM1ZXR/GEjxRp7bGQ1Q== +"@swc/core-win32-ia32-msvc@1.3.70": + version "1.3.70" + resolved "https://registry.yarnpkg.com/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.3.70.tgz#f95d5656622f5a963bc0125da9fda84cf40faa8d" + integrity sha512-5cgKUKIT/9Fp5fCA+zIjYCQ4dSvjFYOeWGZR3QiTXGkC4bGa1Ji9SEPyeIAX0iruUnKjYaZB9RvHK2tNn7RLrQ== -"@swc/core-win32-x64-msvc@1.3.66": - version "1.3.66" - resolved "https://registry.yarnpkg.com/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.3.66.tgz#7984da6bf1f1a5410c2e6514dc2814abb2e6c91a" - integrity sha512-yI64ACzS14qFLrfyO12qW+f/UROTotzDeEbuyJAaPD2IZexoT1cICznI3sBmIfrSt33mVuW8eF5m3AG/NUImzw== +"@swc/core-win32-x64-msvc@1.3.70": + version "1.3.70" + resolved "https://registry.yarnpkg.com/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.3.70.tgz#5b3acddb96fdf60df089b837061915cb4be94eaa" + integrity sha512-LE8lW46+TQBzVkn2mHBlk8DIElPIZ2dO5P8AbJiARNBAnlqQWu67l9gWM89UiZ2l33J2cI37pHzON3tKnT8f9g== "@swc/core@^1.3.61": - version "1.3.66" - resolved "https://registry.yarnpkg.com/@swc/core/-/core-1.3.66.tgz#d07e4c9cd49205881171ee1ffd04f824ecea2f25" - integrity sha512-Hpf91kH5ly7fHkWnApwryTQryT+TO4kMMPH3WyciUSQOWLE3UuQz1PtETHQQk7PZ/b1QF0qQurJrgfBr5bSKUA== + version "1.3.70" + resolved "https://registry.yarnpkg.com/@swc/core/-/core-1.3.70.tgz#f5ddc6fe6add7a99f5b94d2214ad0d8527d11479" + integrity sha512-LWVWlEDLlOD25PvA2NEz41UzdwXnlDyBiZbe69s3zM0DfCPwZXLUm79uSqH9ItsOjTrXSL5/1+XUL6C/BZwChA== optionalDependencies: - "@swc/core-darwin-arm64" "1.3.66" - "@swc/core-darwin-x64" "1.3.66" - "@swc/core-linux-arm-gnueabihf" "1.3.66" - "@swc/core-linux-arm64-gnu" "1.3.66" - "@swc/core-linux-arm64-musl" "1.3.66" - "@swc/core-linux-x64-gnu" "1.3.66" - "@swc/core-linux-x64-musl" "1.3.66" - "@swc/core-win32-arm64-msvc" "1.3.66" - "@swc/core-win32-ia32-msvc" "1.3.66" - "@swc/core-win32-x64-msvc" "1.3.66" + "@swc/core-darwin-arm64" "1.3.70" + "@swc/core-darwin-x64" "1.3.70" + "@swc/core-linux-arm-gnueabihf" "1.3.70" + "@swc/core-linux-arm64-gnu" "1.3.70" + "@swc/core-linux-arm64-musl" "1.3.70" + "@swc/core-linux-x64-gnu" "1.3.70" + "@swc/core-linux-x64-musl" "1.3.70" + "@swc/core-win32-arm64-msvc" "1.3.70" + "@swc/core-win32-ia32-msvc" "1.3.70" + "@swc/core-win32-x64-msvc" "1.3.70" "@ts-morph/common@~0.19.0": version "0.19.0" @@ -1952,9 +2062,9 @@ integrity sha512-SZg4JdHIWHQGEokbYGZSDvo5wA4TLYPXaqhigs/wH+REDOejcJzgH+qyY+HtEUtWOZxEUkbhbdYPqQDiEgrXeA== "@types/eslint@^8.4.5": - version "8.40.2" - resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.40.2.tgz#2833bc112d809677864a4b0e7d1de4f04d7dac2d" - integrity sha512-PRVjQ4Eh9z9pmmtaq8nTjZjQwKFk7YIHIud3lRoKRBgUQjgjRmoGxxGEPXQkF+lH7QkHJRNr5F4aBgYCW0lqpQ== + version "8.44.0" + resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.44.0.tgz#55818eabb376e2272f77fbf5c96c43137c3c1e53" + integrity sha512-gsF+c/0XOguWgaOgvFs+xnnRqt9GwgTvIks36WpE6ueeI4KCEHHd8K/CKHqhOqrJKsYH8m27kRzQEvWXAwXUTw== dependencies: "@types/estree" "*" "@types/json-schema" "*" @@ -1993,9 +2103,9 @@ integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== "@types/lodash-es@^4.14.194": - version "4.17.7" - resolved "https://registry.yarnpkg.com/@types/lodash-es/-/lodash-es-4.17.7.tgz#22edcae9f44aff08546e71db8925f05b33c7cc40" - integrity sha512-z0ptr6UI10VlU6l5MYhGwS4mC8DZyYer2mCoyysZtSF7p26zOX8UpbrV0YpNYLGS8K4PUFIyEr62IMFFjveSiQ== + version "4.17.8" + resolved "https://registry.yarnpkg.com/@types/lodash-es/-/lodash-es-4.17.8.tgz#cfffd0969507830c22da18dbb20d2ca126fdaa8b" + integrity sha512-euY3XQcZmIzSy7YH5+Unb3b2X12Wtk54YWINBvvGQ5SmMvwb11JQskGsfkH/5HXK77Kr8GF0wkVDIxzAisWtog== dependencies: "@types/lodash" "*" @@ -2012,9 +2122,9 @@ integrity sha512-Hwx9EUgdwf2GLarOjQp5ZH8ZmblzcbTBC2wtQWNKARBSxM9ezRIAUpeDTgoQRAFB0+8CNWXVA9+MaSOzOF3nPg== "@types/node@^20.3.1": - version "20.3.1" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.3.1.tgz#e8a83f1aa8b649377bb1fb5d7bac5cb90e784dfe" - integrity sha512-EhcH/wvidPy1WeML3TtYFGR83UzjxeWRen9V402T8aUGYsCHOmfoisV3ZSg03gAFIbLq8TnWOJ0f4cALtnSEUg== + version "20.4.2" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.4.2.tgz#129cc9ae69f93824f92fac653eebfb4812ab4af9" + integrity sha512-Dd0BYtWgnWJKwO1jkmTrzofjK2QXXcai0dmtzvIBhcA+RsG5h8R3xlyta0kGOZRNfL9GuRtb1knmPEhQrePCEw== "@types/parse-json@^4.0.0": version "4.0.0" @@ -2027,9 +2137,9 @@ integrity sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w== "@types/react-dom@^18.2.6": - version "18.2.6" - resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.2.6.tgz#ad621fa71a8db29af7c31b41b2ea3d8a6f4144d1" - integrity sha512-2et4PDvg6PVCyS7fuTc4gPoksV58bW0RwSxWKcPRcHZf0PRUGq03TKcD/rUHe3azfV6/5/biUBJw+HhCQjaP0A== + version "18.2.7" + resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.2.7.tgz#67222a08c0a6ae0a0da33c3532348277c70abb63" + integrity sha512-GRaAEriuT4zp9N4p1i8BDBYmEyfo+xQ3yHjJU4eiK5NDa1RmUZG+unZABUTK4/Ox/M+GaHwb6Ow8rUITrtjszA== dependencies: "@types/react" "*" @@ -2058,9 +2168,9 @@ "@types/react" "*" "@types/react@*", "@types/react@^18.2.14": - version "18.2.14" - resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.14.tgz#fa7a6fecf1ce35ca94e74874f70c56ce88f7a127" - integrity sha512-A0zjq+QN/O0Kpe30hA1GidzyFjatVvrpIvWLxD+xv67Vt91TWWgco9IvrJBkeyHm1trGaFS/FSGqPlhyeZRm0g== + version "18.2.15" + resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.15.tgz#14792b35df676c20ec3cf595b262f8c615a73066" + integrity sha512-oEjE7TQt1fFTFSbf8kkNuc798ahTUzn3Le67/PWjE8MAfYAD/qB7O8hSTcromLFqHCt9bcdOg5GXMokzTjJ5SA== dependencies: "@types/prop-types" "*" "@types/scheduler" "*" @@ -2087,46 +2197,46 @@ integrity sha512-kNnC1GFBLuhImSnV7w4njQkUiJi0ZXUycu1rUaouPqiKlXkh77JKgdRnTAp1x5eBwcIwbtI+3otwzuIDEuDoxQ== "@typescript-eslint/eslint-plugin@^5.60.0": - version "5.60.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.60.0.tgz#2f4bea6a3718bed2ba52905358d0f45cd3620d31" - integrity sha512-78B+anHLF1TI8Jn/cD0Q00TBYdMgjdOn980JfAVa9yw5sop8nyTfVOQAv6LWywkOGLclDBtv5z3oxN4w7jxyNg== + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz#aeef0328d172b9e37d9bab6dbc13b87ed88977db" + integrity sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag== dependencies: "@eslint-community/regexpp" "^4.4.0" - "@typescript-eslint/scope-manager" "5.60.0" - "@typescript-eslint/type-utils" "5.60.0" - "@typescript-eslint/utils" "5.60.0" + "@typescript-eslint/scope-manager" "5.62.0" + "@typescript-eslint/type-utils" "5.62.0" + "@typescript-eslint/utils" "5.62.0" debug "^4.3.4" - grapheme-splitter "^1.0.4" + graphemer "^1.4.0" ignore "^5.2.0" natural-compare-lite "^1.4.0" semver "^7.3.7" tsutils "^3.21.0" "@typescript-eslint/parser@^5.60.0": - version "5.60.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.60.0.tgz#08f4daf5fc6548784513524f4f2f359cebb4068a" - integrity sha512-jBONcBsDJ9UoTWrARkRRCgDz6wUggmH5RpQVlt7BimSwaTkTjwypGzKORXbR4/2Hqjk9hgwlon2rVQAjWNpkyQ== + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.62.0.tgz#1b63d082d849a2fcae8a569248fbe2ee1b8a56c7" + integrity sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA== dependencies: - "@typescript-eslint/scope-manager" "5.60.0" - "@typescript-eslint/types" "5.60.0" - "@typescript-eslint/typescript-estree" "5.60.0" + "@typescript-eslint/scope-manager" "5.62.0" + "@typescript-eslint/types" "5.62.0" + "@typescript-eslint/typescript-estree" "5.62.0" debug "^4.3.4" -"@typescript-eslint/scope-manager@5.60.0": - version "5.60.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.60.0.tgz#ae511967b4bd84f1d5e179bb2c82857334941c1c" - integrity sha512-hakuzcxPwXi2ihf9WQu1BbRj1e/Pd8ZZwVTG9kfbxAMZstKz8/9OoexIwnmLzShtsdap5U/CoQGRCWlSuPbYxQ== +"@typescript-eslint/scope-manager@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz#d9457ccc6a0b8d6b37d0eb252a23022478c5460c" + integrity sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w== dependencies: - "@typescript-eslint/types" "5.60.0" - "@typescript-eslint/visitor-keys" "5.60.0" + "@typescript-eslint/types" "5.62.0" + "@typescript-eslint/visitor-keys" "5.62.0" -"@typescript-eslint/type-utils@5.60.0": - version "5.60.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.60.0.tgz#69b09087eb12d7513d5b07747e7d47f5533aa228" - integrity sha512-X7NsRQddORMYRFH7FWo6sA9Y/zbJ8s1x1RIAtnlj6YprbToTiQnM6vxcMu7iYhdunmoC0rUWlca13D5DVHkK2g== +"@typescript-eslint/type-utils@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz#286f0389c41681376cdad96b309cedd17d70346a" + integrity sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew== dependencies: - "@typescript-eslint/typescript-estree" "5.60.0" - "@typescript-eslint/utils" "5.60.0" + "@typescript-eslint/typescript-estree" "5.62.0" + "@typescript-eslint/utils" "5.62.0" debug "^4.3.4" tsutils "^3.21.0" @@ -2135,18 +2245,18 @@ resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-4.33.0.tgz#a1e59036a3b53ae8430ceebf2a919dc7f9af6d72" integrity sha512-zKp7CjQzLQImXEpLt2BUw1tvOMPfNoTAfb8l51evhYbOEEzdWyQNmHWWGPR6hwKJDAi+1VXSBmnhL9kyVTTOuQ== -"@typescript-eslint/types@5.60.0": - version "5.60.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.60.0.tgz#3179962b28b4790de70e2344465ec97582ce2558" - integrity sha512-ascOuoCpNZBccFVNJRSC6rPq4EmJ2NkuoKnd6LDNyAQmdDnziAtxbCGWCbefG1CNzmDvd05zO36AmB7H8RzKPA== +"@typescript-eslint/types@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.62.0.tgz#258607e60effa309f067608931c3df6fed41fd2f" + integrity sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ== -"@typescript-eslint/typescript-estree@5.60.0", "@typescript-eslint/typescript-estree@^5.55.0": - version "5.60.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.60.0.tgz#4ddf1a81d32a850de66642d9b3ad1e3254fb1600" - integrity sha512-R43thAuwarC99SnvrBmh26tc7F6sPa2B3evkXp/8q954kYL6Ro56AwASYWtEEi+4j09GbiNAHqYwNNZuNlARGQ== +"@typescript-eslint/typescript-estree@5.62.0", "@typescript-eslint/typescript-estree@^5.55.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz#7d17794b77fabcac615d6a48fb143330d962eb9b" + integrity sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA== dependencies: - "@typescript-eslint/types" "5.60.0" - "@typescript-eslint/visitor-keys" "5.60.0" + "@typescript-eslint/types" "5.62.0" + "@typescript-eslint/visitor-keys" "5.62.0" debug "^4.3.4" globby "^11.1.0" is-glob "^4.0.3" @@ -2166,17 +2276,17 @@ semver "^7.3.5" tsutils "^3.21.0" -"@typescript-eslint/utils@5.60.0": - version "5.60.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.60.0.tgz#4667c5aece82f9d4f24a667602f0f300864b554c" - integrity sha512-ba51uMqDtfLQ5+xHtwlO84vkdjrqNzOnqrnwbMHMRY8Tqeme8C2Q8Fc7LajfGR+e3/4LoYiWXUM6BpIIbHJ4hQ== +"@typescript-eslint/utils@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.62.0.tgz#141e809c71636e4a75daa39faed2fb5f4b10df86" + integrity sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ== dependencies: "@eslint-community/eslint-utils" "^4.2.0" "@types/json-schema" "^7.0.9" "@types/semver" "^7.3.12" - "@typescript-eslint/scope-manager" "5.60.0" - "@typescript-eslint/types" "5.60.0" - "@typescript-eslint/typescript-estree" "5.60.0" + "@typescript-eslint/scope-manager" "5.62.0" + "@typescript-eslint/types" "5.62.0" + "@typescript-eslint/typescript-estree" "5.62.0" eslint-scope "^5.1.1" semver "^7.3.7" @@ -2188,12 +2298,12 @@ "@typescript-eslint/types" "4.33.0" eslint-visitor-keys "^2.0.0" -"@typescript-eslint/visitor-keys@5.60.0": - version "5.60.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.60.0.tgz#b48b29da3f5f31dd1656281727004589d2722a66" - integrity sha512-wm9Uz71SbCyhUKgcaPRauBdTegUyY/ZWl8gLwD/i/ybJqscrrdVSFImpvUz16BLPChIeKBK5Fa9s6KDQjsjyWw== +"@typescript-eslint/visitor-keys@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz#2174011917ce582875954ffe2f6912d5931e353e" + integrity sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw== dependencies: - "@typescript-eslint/types" "5.60.0" + "@typescript-eslint/types" "5.62.0" eslint-visitor-keys "^3.3.0" "@vitejs/plugin-react-swc@^3.3.2": @@ -2229,9 +2339,9 @@ acorn-jsx@^5.3.2: integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== acorn@^8.8.2, acorn@^8.9.0: - version "8.9.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.9.0.tgz#78a16e3b2bcc198c10822786fa6679e245db5b59" - integrity sha512-jaVNAFBHNLXspO543WnNNPZFRtavh3skAkITqD0/2aeMkKZTN+254PyhwxFYrk3vQ1xfY+2wbesJMs/JC8/PwQ== + version "8.10.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.10.0.tgz#8be5b3907a67221a81ab23c7889c4c5526b62ec5" + integrity sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw== aggregate-error@^3.0.0: version "3.1.0" @@ -2337,7 +2447,7 @@ array-buffer-byte-length@^1.0.0: call-bind "^1.0.2" is-array-buffer "^3.0.1" -array-includes@^3.1.5, array-includes@^3.1.6: +array-includes@^3.1.6: version "3.1.6" resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.6.tgz#9e9e720e194f198266ba9e18c29e6a9b0e4b225f" integrity sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw== @@ -2353,6 +2463,16 @@ array-union@^2.1.0: resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== +array.prototype.flat@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz#ffc6576a7ca3efc2f46a143b9d1dda9b4b3cf5e2" + integrity sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + es-shim-unscopables "^1.0.0" + array.prototype.flatmap@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz#1aae7903c2100433cb8261cd4ed310aab5c4a183" @@ -2374,6 +2494,18 @@ array.prototype.tosorted@^1.1.1: es-shim-unscopables "^1.0.0" get-intrinsic "^1.1.3" +arraybuffer.prototype.slice@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.1.tgz#9b5ea3868a6eebc30273da577eb888381c0044bb" + integrity sha512-09x0ZWFEjj4WD8PDbykUwo3t9arLn8NIzmmYEJFpYekOAQjpkGSyrQhNoRTcwwcFRu+ycWF78QZ63oWTqSjBcw== + dependencies: + array-buffer-byte-length "^1.0.0" + call-bind "^1.0.2" + define-properties "^1.2.0" + get-intrinsic "^1.2.1" + is-array-buffer "^3.0.2" + is-shared-array-buffer "^1.0.2" + ast-module-types@^2.7.1: version "2.7.1" resolved "https://registry.yarnpkg.com/ast-module-types/-/ast-module-types-2.7.1.tgz#3f7989ef8dfa1fdb82dfe0ab02bdfc7c77a57dd3" @@ -2951,7 +3083,7 @@ deep-extend@^0.6.0: resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== -deep-is@^0.1.3, deep-is@~0.1.3: +deep-is@^0.1.3: version "0.1.4" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== @@ -3179,9 +3311,9 @@ doctrine@^3.0.0: esutils "^2.0.2" downshift@^7.6.0: - version "7.6.0" - resolved "https://registry.yarnpkg.com/downshift/-/downshift-7.6.0.tgz#de04fb2962bd6c4ea94589c797c91f34aa9816f3" - integrity sha512-VSoTVynTAsabou/hbZ6HJHUVhtBiVOjQoBsCPcQq5eAROIGP+9XKMp9asAKQ3cEcUP4oe0fFdD2pziUjhFY33Q== + version "7.6.2" + resolved "https://registry.yarnpkg.com/downshift/-/downshift-7.6.2.tgz#16fc951b7ff8f9c1c47d0f71b5ff10d78fb06e4c" + integrity sha512-iOv+E1Hyt3JDdL9yYcOgW7nZ7GQ2Uz6YbggwXvKUSleetYhU2nXD482Rz6CzvM4lvI1At34BYruKAL4swRGxaA== dependencies: "@babel/runtime" "^7.14.8" compute-scroll-into-view "^2.0.4" @@ -3204,10 +3336,10 @@ emoji-regex@^9.2.2: resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== -engine.io-client@~6.5.0: - version "6.5.0" - resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-6.5.0.tgz#c77f14c0e996d3746a1fa681b3b093003dc1743d" - integrity sha512-C7eN3OKggSfd5g8IDgUA9guC8TNS6CEganKT7dL6Fp3q+FobcQ/WBn2Qq2XTL1vNTiFZfDzXohvqLuR9dWejdg== +engine.io-client@~6.5.1: + version "6.5.1" + resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-6.5.1.tgz#1735fb8ae3bae5ae13115e18d2f484daf005dd9c" + integrity sha512-hE5wKXH8Ru4L19MbM1GgYV/2Qo54JSMh1rlJbfpa40bEWkCKNo3ol2eOtGmowcr+ysgbI7+SGL+by42Q3pt/Ng== dependencies: "@socket.io/component-emitter" "~3.1.0" debug "~4.3.1" @@ -3243,17 +3375,18 @@ error-stack-parser@^2.0.6: stackframe "^1.3.4" es-abstract@^1.19.0, es-abstract@^1.20.4: - version "1.21.2" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.21.2.tgz#a56b9695322c8a185dc25975aa3b8ec31d0e7eff" - integrity sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg== + version "1.22.1" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.22.1.tgz#8b4e5fc5cefd7f1660f0f8e1a52900dfbc9d9ccc" + integrity sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw== dependencies: array-buffer-byte-length "^1.0.0" + arraybuffer.prototype.slice "^1.0.1" available-typed-arrays "^1.0.5" call-bind "^1.0.2" es-set-tostringtag "^2.0.1" es-to-primitive "^1.2.1" function.prototype.name "^1.1.5" - get-intrinsic "^1.2.0" + get-intrinsic "^1.2.1" get-symbol-description "^1.0.0" globalthis "^1.0.3" gopd "^1.0.1" @@ -3273,14 +3406,18 @@ es-abstract@^1.19.0, es-abstract@^1.20.4: object-inspect "^1.12.3" object-keys "^1.1.1" object.assign "^4.1.4" - regexp.prototype.flags "^1.4.3" + regexp.prototype.flags "^1.5.0" + safe-array-concat "^1.0.0" safe-regex-test "^1.0.0" string.prototype.trim "^1.2.7" string.prototype.trimend "^1.0.6" string.prototype.trimstart "^1.0.6" + typed-array-buffer "^1.0.0" + typed-array-byte-length "^1.0.0" + typed-array-byte-offset "^1.0.0" typed-array-length "^1.0.4" unbox-primitive "^1.0.2" - which-typed-array "^1.1.9" + which-typed-array "^1.1.10" es-set-tostringtag@^2.0.1: version "2.0.1" @@ -3307,7 +3444,7 @@ es-to-primitive@^1.2.1: is-date-object "^1.0.1" is-symbol "^1.0.2" -esbuild@^0.17.18, esbuild@^0.17.5: +esbuild@^0.17.18: version "0.17.19" resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.17.19.tgz#087a727e98299f0462a3d0bcdd9cd7ff100bd955" integrity sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw== @@ -3335,6 +3472,34 @@ esbuild@^0.17.18, esbuild@^0.17.5: "@esbuild/win32-ia32" "0.17.19" "@esbuild/win32-x64" "0.17.19" +esbuild@^0.18.10: + version "0.18.14" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.18.14.tgz#3df4cfef66c55176583359d79fd416ffeb3cdf7e" + integrity sha512-uNPj5oHPYmj+ZhSQeYQVFZ+hAlJZbAGOmmILWIqrGvPVlNLbyOvU5Bu6Woi8G8nskcx0vwY0iFoMPrzT86Ko+w== + optionalDependencies: + "@esbuild/android-arm" "0.18.14" + "@esbuild/android-arm64" "0.18.14" + "@esbuild/android-x64" "0.18.14" + "@esbuild/darwin-arm64" "0.18.14" + "@esbuild/darwin-x64" "0.18.14" + "@esbuild/freebsd-arm64" "0.18.14" + "@esbuild/freebsd-x64" "0.18.14" + "@esbuild/linux-arm" "0.18.14" + "@esbuild/linux-arm64" "0.18.14" + "@esbuild/linux-ia32" "0.18.14" + "@esbuild/linux-loong64" "0.18.14" + "@esbuild/linux-mips64el" "0.18.14" + "@esbuild/linux-ppc64" "0.18.14" + "@esbuild/linux-riscv64" "0.18.14" + "@esbuild/linux-s390x" "0.18.14" + "@esbuild/linux-x64" "0.18.14" + "@esbuild/netbsd-x64" "0.18.14" + "@esbuild/openbsd-x64" "0.18.14" + "@esbuild/sunos-x64" "0.18.14" + "@esbuild/win32-arm64" "0.18.14" + "@esbuild/win32-ia32" "0.18.14" + "@esbuild/win32-x64" "0.18.14" + escalade@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" @@ -3351,14 +3516,13 @@ escape-string-regexp@^4.0.0: integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== escodegen@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.0.0.tgz#5e32b12833e8aa8fa35e1bf0befa89380484c7dd" - integrity sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw== + version "2.1.0" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.1.0.tgz#ba93bbb7a43986d29d6041f99f5262da773e2e17" + integrity sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w== dependencies: esprima "^4.0.1" estraverse "^5.2.0" esutils "^2.0.2" - optionator "^0.8.1" optionalDependencies: source-map "~0.6.1" @@ -3409,9 +3573,9 @@ eslint-scope@^5.1.1: estraverse "^4.1.1" eslint-scope@^7.2.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.0.tgz#f21ebdafda02352f103634b96dd47d9f81ca117b" - integrity sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw== + version "7.2.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.1.tgz#936821d3462675f25a18ac5fd88a67cc15b393bd" + integrity sha512-CvefSOsDdaYYvxChovdrPo/ZGt8d5lrJWleAc1diXRKhHGiTYEI26cvo8Kle/wGnsizoCJjK73FMg1/IkIwiNA== dependencies: esrecurse "^4.3.0" estraverse "^5.2.0" @@ -3427,9 +3591,9 @@ eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1: integrity sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA== eslint@^8.43.0: - version "8.44.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.44.0.tgz#51246e3889b259bbcd1d7d736a0c10add4f0e500" - integrity sha512-0wpHoUbDUHgNCyvFB5aXLiQVfK9B0at6gUvzy83k4kAsQ/u769TQDX6iKC+aO4upIHO9WSaA3QoXYQDHbNwf1A== + version "8.45.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.45.0.tgz#bab660f90d18e1364352c0a6b7c6db8edb458b78" + integrity sha512-pd8KSxiQpdYRfYa9Wufvdoct3ZPQQuVuU5O6scNgMuOMYuxvH0IGaYK0wUFjo4UYYQQCUndlXiMbnxopwvvTiw== dependencies: "@eslint-community/eslint-utils" "^4.2.0" "@eslint-community/regexpp" "^4.4.0" @@ -3456,7 +3620,6 @@ eslint@^8.43.0: globals "^13.19.0" graphemer "^1.4.0" ignore "^5.2.0" - import-fresh "^3.0.0" imurmurhash "^0.1.4" is-glob "^4.0.0" is-path-inside "^3.0.3" @@ -3468,13 +3631,12 @@ eslint@^8.43.0: natural-compare "^1.4.0" optionator "^0.9.3" strip-ansi "^6.0.1" - strip-json-comments "^3.1.0" text-table "^0.2.0" espree@^9.6.0: - version "9.6.0" - resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.0.tgz#80869754b1c6560f32e3b6929194a3fe07c5b82f" - integrity sha512-1FH/IiruXZ84tpUlm0aCUEwMl2Ho5ilqVh0VvQXw+byAz/4SAciyHLlfmL5WYqsvD38oymdUwBss0LtK8m4s/A== + version "9.6.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f" + integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ== dependencies: acorn "^8.9.0" acorn-jsx "^5.3.2" @@ -3544,10 +3706,10 @@ fast-diff@^1.1.2: resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.3.0.tgz#ece407fa550a64d638536cd727e129c61616e0f0" integrity sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw== -fast-glob@^3.2.12, fast-glob@^3.2.9: - version "3.2.12" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.12.tgz#7f39ec99c2e6ab030337142da9e0c18f37afae80" - integrity sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w== +fast-glob@^3.2.12, fast-glob@^3.2.9, fast-glob@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.0.tgz#7c40cb491e1e2ed5664749e87bfb516dbe8727c0" + integrity sha512-ChDuvbOypPuNjO8yIDf36x7BlZX1smcUMTTcyoIjycexOxd6DFsKsg21qVBzEmr3G7fUKIRy2/psii+CIUt7FA== dependencies: "@nodelib/fs.stat" "^2.0.2" "@nodelib/fs.walk" "^1.2.3" @@ -3570,7 +3732,7 @@ fast-json-stringify@^2.7.10: rfdc "^1.2.0" string-similarity "^4.0.1" -fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6: +fast-levenshtein@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== @@ -3729,9 +3891,9 @@ formik@^2.4.2: tslib "^2.0.0" framer-motion@^10.12.17: - version "10.12.17" - resolved "https://registry.yarnpkg.com/framer-motion/-/framer-motion-10.12.17.tgz#0e891aaddbe6049267c413449945af95585cbc87" - integrity sha512-IR+aAYntsyu6ofyxqQV4QYotmOqzcuKxhqNpfc3DXJjNWOPpOeSyH0A+In3IEBu49Yx/+PNht+YMeZSdCNaYbw== + version "10.12.22" + resolved "https://registry.yarnpkg.com/framer-motion/-/framer-motion-10.12.22.tgz#f1e7e36cc24fa5407ea33ccbd6d2996f50ceb503" + integrity sha512-bBGYPOxvxcfzS7/py9MEqDucmXBkVl2g42HNlXXPieSTSGGkr8L7+MilCnrU6uX3HrNk/tcB++1SkWE8BosHFw== dependencies: tslib "^2.4.0" optionalDependencies: @@ -3837,7 +3999,7 @@ get-caller-file@^2.0.5: resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== -get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.0: +get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.0, get-intrinsic@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.1.tgz#d295644fed4505fc9cde952c37ee12b477a83d82" integrity sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw== @@ -3946,11 +4108,6 @@ graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== -grapheme-splitter@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz#9cf3a665c6247479896834af35cf1dbb4400767e" - integrity sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ== - graphemer@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" @@ -4044,9 +4201,9 @@ hyphenate-style-name@^1.0.3: integrity sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ== i18next-browser-languagedetector@^7.0.2: - version "7.0.2" - resolved "https://registry.yarnpkg.com/i18next-browser-languagedetector/-/i18next-browser-languagedetector-7.0.2.tgz#22d8ed48411750c1a1828ac2031c816a5108e55f" - integrity sha512-5ViaK+gikxfqZ9M3jJ7gJkUzzu/p3HwiqfLoL1bdiL7CUb0IylcTyVLdPaTU3pH5VFWFCiGFuJDg3VkLUikWgg== + version "7.1.0" + resolved "https://registry.yarnpkg.com/i18next-browser-languagedetector/-/i18next-browser-languagedetector-7.1.0.tgz#01876fac51f86b78975e79b48ccb62e2313a2d7d" + integrity sha512-cr2k7u1XJJ4HTOjM9GyOMtbOA47RtUoWRAtt52z43r3AoMs2StYKyjS3URPhzHaf+mn10hY9dZWamga5WPQjhA== dependencies: "@babel/runtime" "^7.19.4" @@ -4058,9 +4215,9 @@ i18next-http-backend@^2.2.1: cross-fetch "3.1.6" i18next@^23.2.3: - version "23.2.3" - resolved "https://registry.yarnpkg.com/i18next/-/i18next-23.2.3.tgz#d89930f0ce343fad2bee0d3c2188f42171a91cdd" - integrity sha512-5spO7L0rNmW0jFuNhz+gfirlFt1anle4mTy4+gFkgsH0+T3R5++4oncBrzeKa7v8pweRyGBoGmOpboqlxovg6A== + version "23.2.11" + resolved "https://registry.yarnpkg.com/i18next/-/i18next-23.2.11.tgz#0c6f3a637fa87d3243e64b78ad285b7f77d41353" + integrity sha512-MA4FsxOjyCaOZtRDB4yuwjCvqYEioD4G4LlXOn7SO3rnQUlxTufyLsOqfL9MKakeLRBkefe8bqcs0D6Z/xFk1w== dependencies: "@babel/runtime" "^7.22.5" @@ -4079,7 +4236,7 @@ immer@^9.0.21: resolved "https://registry.yarnpkg.com/immer/-/immer-9.0.21.tgz#1e025ea31a40f24fb064f1fef23e931496330176" integrity sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA== -import-fresh@^3.0.0, import-fresh@^3.2.1: +import-fresh@^3.2.1: version "3.3.0" resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== @@ -4327,15 +4484,11 @@ is-symbol@^1.0.2, is-symbol@^1.0.3: has-symbols "^1.0.2" is-typed-array@^1.1.10, is-typed-array@^1.1.9: - version "1.1.10" - resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.10.tgz#36a5b5cb4189b575d1a3e4b08536bfb485801e3f" - integrity sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A== + version "1.1.12" + resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.12.tgz#d0bab5686ef4a76f7a73097b95470ab199c57d4a" + integrity sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg== dependencies: - available-typed-arrays "^1.0.5" - call-bind "^1.0.2" - for-each "^0.3.3" - gopd "^1.0.1" - has-tostringtag "^1.0.0" + which-typed-array "^1.1.11" is-unicode-supported@^0.1.0: version "0.1.0" @@ -4373,6 +4526,11 @@ is-wsl@^2.1.1, is-wsl@^2.2.0: dependencies: is-docker "^2.0.0" +isarray@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" + integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== + isexe@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" @@ -4453,12 +4611,14 @@ jsonfile@^6.0.1: graceful-fs "^4.1.6" "jsx-ast-utils@^2.4.1 || ^3.0.0": - version "3.3.3" - resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz#76b3e6e6cece5c69d49a5792c3d01bd1a0cdc7ea" - integrity sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw== + version "3.3.4" + resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.3.4.tgz#b896535fed5b867650acce5a9bd4135ffc7b3bf9" + integrity sha512-fX2TVdCViod6HwKEtSWGHs57oFhVfCMwieb9PuRDgjDPh5XeqJiHFFFJCHxU5cnTc3Bu/GRL+kPiFmw8XWOfKw== dependencies: - array-includes "^3.1.5" - object.assign "^4.1.3" + array-includes "^3.1.6" + array.prototype.flat "^1.3.1" + object.assign "^4.1.4" + object.values "^1.1.6" klaw-sync@^6.0.0: version "6.0.0" @@ -4490,14 +4650,6 @@ levn@^0.4.1: prelude-ls "^1.2.1" type-check "~0.4.0" -levn@~0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" - integrity sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA== - dependencies: - prelude-ls "~1.1.2" - type-check "~0.3.2" - lilconfig@2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.1.0.tgz#78e23ac89ebb7e1bfbf25b18043de756548e7f52" @@ -4786,9 +4938,9 @@ nanoid@^3.3.6: integrity sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA== nanostores@^0.9.2: - version "0.9.2" - resolved "https://registry.yarnpkg.com/nanostores/-/nanostores-0.9.2.tgz#bd1d1792bc79168f6b331e3e61cfbf05e451e010" - integrity sha512-wfKlqLGtOYV9+qzGveqDOSWZUBgTeMr/g+JzfV/GofXQ//0wp0cgHF+QBVlmNH/JW9YA9QN+vR6N0vpniPpARA== + version "0.9.3" + resolved "https://registry.yarnpkg.com/nanostores/-/nanostores-0.9.3.tgz#a095de5cb695e027b84657d5e31cabd6c5bb269c" + integrity sha512-KobZjcVyNndNrb5DAjfs0WG0lRcZu5Q1BOrfTOxokFLi25zFrWPjg+joXC6kuDqNfSt9fQwppyjUBkRPtsL+8w== natural-compare-lite@^1.4.0: version "1.4.0" @@ -4816,9 +4968,9 @@ neo-async@^2.6.0: integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== node-fetch@^2.6.11: - version "2.6.11" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.11.tgz#cde7fc71deef3131ef80a738919f999e6edfff25" - integrity sha512-4I6pdBY1EthSqDmJkiNk3JIT8cswwR9nfeW/cPdUagJYEQG7R95WRH74wpz7ma8Gh/9dI9FP+OU+0E4FvtA55w== + version "2.6.12" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.12.tgz#02eb8e22074018e3d5a83016649d04df0e348fba" + integrity sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g== dependencies: whatwg-url "^5.0.0" @@ -4863,7 +5015,7 @@ object-keys@^1.1.1: resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== -object.assign@^4.1.3, object.assign@^4.1.4: +object.assign@^4.1.4: version "4.1.4" resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.4.tgz#9673c7c7c351ab8c4d0b516f4343ebf4dfb7799f" integrity sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ== @@ -4968,29 +5120,17 @@ openapi-typescript-codegen@^0.24.0: json-schema-ref-parser "^9.0.9" openapi-typescript@^6.2.8: - version "6.2.8" - resolved "https://registry.yarnpkg.com/openapi-typescript/-/openapi-typescript-6.2.8.tgz#71f43e932b1405a22a6fd5b94bcb37a90698a834" - integrity sha512-yA+y5MHiu6cjmtsGfNLavzVuvGCKzjL3H+exgHDPK6bnp6ZVFibtAiafenNSRDWL0x+7Sw/VPv5SbaqiPLW46w== + version "6.3.4" + resolved "https://registry.yarnpkg.com/openapi-typescript/-/openapi-typescript-6.3.4.tgz#5351a73666e876206c50d8c100c8e8b2e4718882" + integrity sha512-icWb7WBBFr8+RxX7NZC5ez0WkTSQAScLnI33vHRLvWxkpOGKLlp94C0wcicZWzh85EoIoFjO+tujcQxo7zeZdA== dependencies: ansi-colors "^4.1.3" - fast-glob "^3.2.12" + fast-glob "^3.3.0" js-yaml "^4.1.0" - supports-color "^9.3.1" + supports-color "^9.4.0" undici "^5.22.1" yargs-parser "^21.1.1" -optionator@^0.8.1: - version "0.8.3" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" - integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== - dependencies: - deep-is "~0.1.3" - fast-levenshtein "~2.0.6" - levn "~0.3.0" - prelude-ls "~1.1.2" - type-check "~0.3.2" - word-wrap "~1.2.3" - optionator@^0.9.3: version "0.9.3" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.3.tgz#007397d44ed1872fdc6ed31360190f81814e2c64" @@ -5024,14 +5164,14 @@ os-tmpdir@~1.0.2: integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g== overlayscrollbars-react@^0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/overlayscrollbars-react/-/overlayscrollbars-react-0.5.0.tgz#0272bdc6304c7228a58d30e5b678e97fd5c5d8dd" - integrity sha512-uCNTnkfWW74veoiEv3kSwoLelKt4e8gTNv65D771X3il0x5g5Yo0fUbro7SpQzR9yNgi23cvB2mQHTTdQH96pA== + version "0.5.1" + resolved "https://registry.yarnpkg.com/overlayscrollbars-react/-/overlayscrollbars-react-0.5.1.tgz#b5dde9803bae0115f0f214db0c60cdf98213eedb" + integrity sha512-0xw9J1CT/cQ+ELYy3hudG6nY1H5dgJ1DdVW3d8aZwqx6wyHNZV4nsBQXUxoHmPo3dmlJ5MvOLzpKWA4X6nL4QA== overlayscrollbars@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/overlayscrollbars/-/overlayscrollbars-2.2.0.tgz#589e27c570a1fc5f08e26860ed0ec9d3133d4aac" - integrity sha512-Sx7gI2TEx+TFvFXJq4BUYM5R4bfWQR2ertdxyzAQ589ouPKKifMBU0/opdCb1bUC7x6sMiSNI1u9ngC0RbMnBg== + version "2.2.1" + resolved "https://registry.yarnpkg.com/overlayscrollbars/-/overlayscrollbars-2.2.1.tgz#2a6d43ebba5188a394a8b99611f39e22aad6e0c0" + integrity sha512-5oMxq4UCiEVLiOSvovbX8p+P2NtPosjHC0KkIcaobnYuxGwMyTOwBCtBdqO1tXrrA02VVrNzuIjGMLisO2mIwg== p-limit@^3.0.2: version "3.1.0" @@ -5077,9 +5217,9 @@ parse-ms@^2.1.0: integrity sha512-kHt7kzLoS9VBZfUsiKjv43mr91ea+U05EyKkEtqp7vNbHxmaVuEqN7XxeEVnGrMtYOAxGrDElSi96K7EgO1zCA== patch-package@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/patch-package/-/patch-package-7.0.0.tgz#5c646b6b4b4bf37e5184a6950777b21dea6bb66e" - integrity sha512-eYunHbnnB2ghjTNc5iL1Uo7TsGMuXk0vibX3RFcE/CdVdXzmdbMsG/4K4IgoSuIkLTI5oHrMQk4+NkFqSed0BQ== + version "7.0.2" + resolved "https://registry.yarnpkg.com/patch-package/-/patch-package-7.0.2.tgz#c01589bb6964854b5210506a5845d47900641f5a" + integrity sha512-PMYfL8LXxGIRmxXLqlEaBxzKPu7/SdP13ld6GSfAUJUZRmBDPp8chZs0dpzaAFn9TSPnFiMwkC6PJt6pBiAl8Q== dependencies: "@yarnpkg/lockfile" "^1.1.0" chalk "^4.1.2" @@ -5091,7 +5231,7 @@ patch-package@^7.0.0: minimist "^1.2.6" open "^7.4.2" rimraf "^2.6.3" - semver "^5.6.0" + semver "^7.5.3" slash "^2.0.0" tmp "^0.0.33" yaml "^2.2.2" @@ -5169,10 +5309,10 @@ postcss-values-parser@^6.0.2: is-url-superb "^4.0.0" quote-unquote "^1.0.0" -postcss@^8.1.7, postcss@^8.4.23: - version "8.4.24" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.24.tgz#f714dba9b2284be3cc07dbd2fc57ee4dc972d2df" - integrity sha512-M0RzbcI0sO/XJNucsGjvWU9ERWxb/ytp1w6dKtxTKgixdtQDq4rmx/g8W1hnaheq9jgwL/oyEdH5Bc4WwJKMqg== +postcss@^8.1.7, postcss@^8.4.23, postcss@^8.4.25: + version "8.4.26" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.26.tgz#1bc62ab19f8e1e5463d98cf74af39702a00a9e94" + integrity sha512-jrXHFF8iTloAenySjM/ob3gSj7pCu0Ji49hnjqzsgSRa50hkWCKD0HQ+gMNJkW38jBI68MpAAg7ZWwHwX8NMMw== dependencies: nanoid "^3.3.6" picocolors "^1.0.0" @@ -5225,11 +5365,6 @@ prelude-ls@^1.2.1: resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== -prelude-ls@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" - integrity sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w== - prettier-linter-helpers@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz#d23d41fe1375646de2d0104d3454a3008802cf7b" @@ -5355,9 +5490,9 @@ react-fast-compare@^2.0.1: integrity sha512-suNP+J1VU1MWFKcyt7RtjiSWUjvidmQSlqu+eHslq+342xCbGTYmC0mEhPCOHxlW0CywylOC1u2DFAT+bv4dBw== react-focus-lock@^2.9.4: - version "2.9.4" - resolved "https://registry.yarnpkg.com/react-focus-lock/-/react-focus-lock-2.9.4.tgz#4753f6dcd167c39050c9d84f9c63c71b3ff8462e" - integrity sha512-7pEdXyMseqm3kVjhdVH18sovparAzLg5h6WvIx7/Ck3ekjhrrDMEegHSa3swwC8wgfdd7DIdUVRGeiHT9/7Sgg== + version "2.9.5" + resolved "https://registry.yarnpkg.com/react-focus-lock/-/react-focus-lock-2.9.5.tgz#8a82f4f0128cccc27b9e77a4472e8a22f1b52189" + integrity sha512-h6vrdgUbsH2HeD5I7I3Cx1PPrmwGuKYICS+kB9m+32X/9xHRrAbxgvaBpG7BFBN9h3tO+C3qX1QAVESmi4CiIA== dependencies: "@babel/runtime" "^7.0.0" focus-lock "^0.11.6" @@ -5372,9 +5507,9 @@ react-hotkeys-hook@4.4.0: integrity sha512-wOaCWLwgT/f895CMJrR9hmzVf+gfL8IpjWDXWXKngBp9i6Xqzf0tvLv4VI8l3Vlsg/cc4C/Iik3Ck76L/Hj0tw== react-i18next@^13.0.1: - version "13.0.1" - resolved "https://registry.yarnpkg.com/react-i18next/-/react-i18next-13.0.1.tgz#4d047d2d63d9616f7f5fd4ca88b1cc449cc15290" - integrity sha512-gMO6N2GfSfuH7xlHSsZ/mZf+Py9bLm/+EDKIn5fNTuDTjcCcwmMU5UEuGCDk5mdfivbo7ySyYXBN7B9tbGUxiA== + version "13.0.2" + resolved "https://registry.yarnpkg.com/react-i18next/-/react-i18next-13.0.2.tgz#1708a9bdabc1fe1dd4a8534f4c3a80ab784b01e9" + integrity sha512-NEVxC32v0oR4egwYM0QM0WE93AiJG5r0NTXTL8mhQfAhsMfDS2fSO6jpluyfsfypP988KzUQrAXncspcJ7+GHA== dependencies: "@babel/runtime" "^7.22.5" html-parse-stringify "^3.0.1" @@ -5497,14 +5632,14 @@ react-use@^17.4.0: tslib "^2.1.0" react-virtuoso@^4.3.11: - version "4.3.11" - resolved "https://registry.yarnpkg.com/react-virtuoso/-/react-virtuoso-4.3.11.tgz#ab24e707287ef1b4bb5b52f3b14795ba896e9768" - integrity sha512-0YrCvQ5GsIKRcN34GxrzhSJGuMNI+hGxWci5cTVuPQ8QWTEsrKfCyqm7YNBMmV3pu7onG1YVUBo86CyCXdejXg== + version "4.4.1" + resolved "https://registry.yarnpkg.com/react-virtuoso/-/react-virtuoso-4.4.1.tgz#43d7ac35346c4eba947b40858b375d5844b5ae9f" + integrity sha512-QrZ0JLnZFH8ltMw6q+S7U1+V2vUcSHzoIfLRzQKSv4nMJhEdjiZ+e9PqWCI7xJiy2AmSCAgo7g1V5osuurJo2Q== react-zoom-pan-pinch@^3.0.8: - version "3.0.8" - resolved "https://registry.yarnpkg.com/react-zoom-pan-pinch/-/react-zoom-pan-pinch-3.0.8.tgz#c649d644e8aef239afe678a65fd618e65746ddc9" - integrity sha512-z6O5SV5X+XBo/LLO59PgzNE2WT+tp8lw1w3M0y138jCXViwHWKK1MqorICbmSVSOOD5Fa2o6pcg1ppJj9vzqJA== + version "3.1.0" + resolved "https://registry.yarnpkg.com/react-zoom-pan-pinch/-/react-zoom-pan-pinch-3.1.0.tgz#d87a66fd22a97f5dd56b54076411a9dce1f448cd" + integrity sha512-a3LlP8QPgTikvteCNkZ3X6wIWC0lrg1geP5WkUJyx2MXXAhHQek3r17N1nT/esOiWGuPIECnsd9AGoK8jOeGcg== react@^18.2.0: version "18.2.0" @@ -5568,7 +5703,7 @@ regenerator-runtime@^0.13.11: resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz#f6dca3e7ceec20590d07ada785636a90cdca17f9" integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg== -regexp.prototype.flags@^1.4.3: +regexp.prototype.flags@^1.4.3, regexp.prototype.flags@^1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz#fe7ce25e7e4cca8db37b6634c8a2c7009199b9cb" integrity sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA== @@ -5707,10 +5842,10 @@ rollup@^2.77.2: optionalDependencies: fsevents "~2.3.2" -rollup@^3.21.0: - version "3.25.2" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-3.25.2.tgz#3479d72955a83da9019f926d4ba285d630b7656b" - integrity sha512-VLnkxZMDr3jpxgtmS8pQZ0UvhslmF4ADq/9w4erkctbgjCqLW9oa89fJuXEs4ZmgyoF7Dm8rMDKSS5b5u2hHUg== +rollup@^3.25.2: + version "3.26.3" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-3.26.3.tgz#bbc8818cadd0aebca348dbb3d68d296d220967b8" + integrity sha512-7Tin0C8l86TkpcMtXvQu6saWH93nhG3dGQ1/+l5V2TDMceTxO7kDiK6GzbfLWNNxqJXm591PcEZUozZm51ogwQ== optionalDependencies: fsevents "~2.3.2" @@ -5735,6 +5870,16 @@ rxjs@^7.8.0, rxjs@^7.8.1: dependencies: tslib "^2.1.0" +safe-array-concat@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.0.0.tgz#2064223cba3c08d2ee05148eedbc563cd6d84060" + integrity sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.2.0" + has-symbols "^1.0.3" + isarray "^2.0.5" + safe-buffer@~5.2.0: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" @@ -5778,20 +5923,15 @@ semver-compare@^1.0.0: resolved "https://registry.yarnpkg.com/semver-compare/-/semver-compare-1.0.0.tgz#0dee216a1c941ab37e9efb1788f6afc5ff5537fc" integrity sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow== -semver@^5.6.0: - version "5.7.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" - integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== - semver@^6.3.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" - integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + version "6.3.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" + integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== -semver@^7.3.5, semver@^7.3.7: - version "7.5.3" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.3.tgz#161ce8c2c6b4b3bdca6caadc9fa3317a4c4fe88e" - integrity sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ== +semver@^7.3.5, semver@^7.3.7, semver@^7.5.3: + version "7.5.4" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" + integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== dependencies: lru-cache "^6.0.0" @@ -5882,13 +6022,13 @@ slice-ansi@^5.0.0: is-fullwidth-code-point "^4.0.0" socket.io-client@^4.7.0: - version "4.7.0" - resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-4.7.0.tgz#f869a41a2593bc36f058f3b46175024491d997b5" - integrity sha512-7Q8CeDrhuZzg4QLXl3tXlk5yb086oxYzehAVZRLiGCzCmtDneiHz1qHyyWcxhTgxXiokVpWQXoG/u60HoXSQew== + version "4.7.1" + resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-4.7.1.tgz#48e5f703abe4fb0402182bcf9c06b7820fb3453b" + integrity sha512-Qk3Xj8ekbnzKu3faejo4wk2MzXA029XppiXtTF/PkbTg+fcwaTw1PlDrTrrrU4mKoYC4dvlApOnSeyLCKwek2w== dependencies: "@socket.io/component-emitter" "~3.1.0" debug "~4.3.2" - engine.io-client "~6.5.0" + engine.io-client "~6.5.1" socket.io-parser "~4.2.4" socket.io-parser@~4.2.4: @@ -6102,7 +6242,7 @@ strip-final-newline@^3.0.0: resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-3.0.0.tgz#52894c313fbff318835280aed60ff71ebf12b8fd" integrity sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw== -strip-json-comments@^3.1.0, strip-json-comments@^3.1.1, strip-json-comments@~3.1.1: +strip-json-comments@^3.1.1, strip-json-comments@~3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== @@ -6112,11 +6252,16 @@ strip-json-comments@~2.0.1: resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== -stylis@4.2.0, stylis@^4.0.6: +stylis@4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.2.0.tgz#79daee0208964c8fe695a42fcffcac633a211a51" integrity sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw== +stylis@^4.0.6: + version "4.3.0" + resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.3.0.tgz#abe305a669fc3d8777e10eefcfc73ad861c5588c" + integrity sha512-E87pIogpwUsUwXw7dNyU4QDjdgVMy52m+XEOPEKUn161cCzWjjhPSQhByfd1CcNvrOLnXQ6OnnZDwnJrz/Z4YQ== + stylus-lookup@^3.0.1: version "3.0.2" resolved "https://registry.yarnpkg.com/stylus-lookup/-/stylus-lookup-3.0.2.tgz#c9eca3ff799691020f30b382260a67355fefdddd" @@ -6146,10 +6291,10 @@ supports-color@^8.1.1: dependencies: has-flag "^4.0.0" -supports-color@^9.3.1: - version "9.3.1" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-9.3.1.tgz#34e4ad3c71c9a39dae3254ecc46c9b74e89e15a6" - integrity sha512-knBY82pjmnIzK3NifMo3RxEIRD9E0kIzV4BKcyTZ9+9kWgLMxd4PrsTSMoFQUabgRBbF8KOLRDCyKgNV+iK44Q== +supports-color@^9.4.0: + version "9.4.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-9.4.0.tgz#17bfcf686288f531db3dea3215510621ccb55954" + integrity sha512-VL+lNrEoIXww1coLPOmiEmK/0sGigko5COxI09KzHc2VJXJsQ37UaQ+8quuxjDeA7+KnLGTWRyOXSLLR2Wb4jw== supports-preserve-symlinks-flag@^1.0.0: version "1.0.0" @@ -6157,9 +6302,9 @@ supports-preserve-symlinks-flag@^1.0.0: integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== tabbable@^6.0.1: - version "6.1.2" - resolved "https://registry.yarnpkg.com/tabbable/-/tabbable-6.1.2.tgz#b0d3ca81d582d48a80f71b267d1434b1469a3703" - integrity sha512-qCN98uP7i9z0fIS4amQ5zbGBOq+OSigYeGvPy7NDk8Y9yncqDZ9pRPgfsc2PJIVM9RrJj7GIfuRgmjoUU9zTHQ== + version "6.2.0" + resolved "https://registry.yarnpkg.com/tabbable/-/tabbable-6.2.0.tgz#732fb62bc0175cfcec257330be187dcfba1f3b97" + integrity sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew== tapable@^2.2.0: version "2.2.1" @@ -6167,9 +6312,9 @@ tapable@^2.2.0: integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== terser@^5.18.1: - version "5.18.1" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.18.1.tgz#6d8642508ae9fb7b48768e48f16d675c89a78460" - integrity sha512-j1n0Ao919h/Ai5r43VAnfV/7azUYW43GPxK7qSATzrsERfW7+y2QW9Cp9ufnRF5CQUWbnLSo7UJokSWCqg4tsQ== + version "5.19.1" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.19.1.tgz#dbd7231f224a9e2401d0f0959542ed74d76d340b" + integrity sha512-27hxBUVdV6GoNg1pKQ7Z5cbR6V9txPVyBA+FQw3BaZ1Wuzvztce5p156DaP0NVZNrMZZ+6iG9Syf7WgMNKDg2Q== dependencies: "@jridgewell/source-map" "^0.3.3" acorn "^8.8.2" @@ -6264,9 +6409,9 @@ ts-toolbelt@^9.6.0: integrity sha512-nsZd8ZeNUzukXPlJmTBwUAuABDe/9qtVDelJeT/qW0ow3ZS3BsQJtNkan1802aM9Uf68/Y8ljw86Hu0h5IUW3w== tsconfck@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/tsconfck/-/tsconfck-2.1.1.tgz#9b51603d2712d1f4740fa14748ca886a2e1893e5" - integrity sha512-ZPCkJBKASZBmBUNqGHmRhdhM8pJYDdOXp4nRgj/O0JwUwsMq50lCDRQP/M5GBNAA0elPrq4gAeu4dkaVCuKWww== + version "2.1.2" + resolved "https://registry.yarnpkg.com/tsconfck/-/tsconfck-2.1.2.tgz#f667035874fa41d908c1fe4d765345fcb1df6e35" + integrity sha512-ghqN1b0puy3MhhviwO2kGF8SeMDNhEbnKxjK7h6+fvY9JAxqvXi8y5NAHSQv687OVboS2uZIByzGd45/YxrRHg== tsconfig-paths@^3.10.1: version "3.14.2" @@ -6289,9 +6434,9 @@ tslib@^1.8.1: integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== tslib@^2.0.0, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.3.0, tslib@^2.4.0: - version "2.5.3" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.5.3.tgz#24944ba2d990940e6e982c4bea147aba80209913" - integrity sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w== + version "2.6.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.0.tgz#b295854684dbda164e181d259a22cd779dcd7bc3" + integrity sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA== tsutils@^3.21.0: version "3.21.0" @@ -6307,13 +6452,6 @@ type-check@^0.4.0, type-check@~0.4.0: dependencies: prelude-ls "^1.2.1" -type-check@~0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" - integrity sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg== - dependencies: - prelude-ls "~1.1.2" - type-fest@^0.20.2: version "0.20.2" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" @@ -6329,6 +6467,36 @@ type-fest@^2.12.2: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-2.19.0.tgz#88068015bb33036a598b952e55e9311a60fd3a9b" integrity sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA== +typed-array-buffer@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz#18de3e7ed7974b0a729d3feecb94338d1472cd60" + integrity sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.2.1" + is-typed-array "^1.1.10" + +typed-array-byte-length@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz#d787a24a995711611fb2b87a4052799517b230d0" + integrity sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA== + dependencies: + call-bind "^1.0.2" + for-each "^0.3.3" + has-proto "^1.0.1" + is-typed-array "^1.1.10" + +typed-array-byte-offset@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz#cbbe89b51fdef9cd6aaf07ad4707340abbc4ea0b" + integrity sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + for-each "^0.3.3" + has-proto "^1.0.1" + is-typed-array "^1.1.10" + typed-array-length@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.4.tgz#89d83785e5c4098bec72e08b319651f0eac9c1bb" @@ -6460,9 +6628,9 @@ validator@^13.7.0: integrity sha512-B+dGG8U3fdtM0/aNK4/X8CXq/EcxU2WPrPEkJGslb47qyHsxmbggTWK0yEA4qnYVNF+nxNlN88o14hIcPmSIEA== vite-plugin-css-injected-by-js@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/vite-plugin-css-injected-by-js/-/vite-plugin-css-injected-by-js-3.1.1.tgz#8324412636cf6fdada1a86f595aa2e78458e5ddb" - integrity sha512-mwrFvEEy0TuH8Ul0cb2HgjmNboQ/JnEFy+kHCWqAJph3ikMOiIuyYVdx0JO4nEIWJyzSnc4TTdmoTulsikvJEg== + version "3.2.1" + resolved "https://registry.yarnpkg.com/vite-plugin-css-injected-by-js/-/vite-plugin-css-injected-by-js-3.2.1.tgz#c23e10e28a1afb78414fa3c162ac8a253cd1a6a4" + integrity sha512-8UQWy7tcmgwkaUKYfbj/8GOeAD0RPG2tdetAGg7WikWC8IEtNrovs8RRuLjFqdRqORT1XxchBB5tPl6xO/H95g== vite-plugin-dts@^2.3.0: version "2.3.0" @@ -6499,13 +6667,13 @@ vite-tsconfig-paths@^4.2.0: tsconfck "^2.1.0" vite@^4.3.9: - version "4.3.9" - resolved "https://registry.yarnpkg.com/vite/-/vite-4.3.9.tgz#db896200c0b1aa13b37cdc35c9e99ee2fdd5f96d" - integrity sha512-qsTNZjO9NoJNW7KnOrgYwczm0WctJ8m/yqYAMAK9Lxt4SoySUfS5S8ia9K7JHpa3KEeMfyF8LoJ3c5NeBJy6pg== + version "4.4.4" + resolved "https://registry.yarnpkg.com/vite/-/vite-4.4.4.tgz#b76e6049c0e080cb54e735ad2d18287753752118" + integrity sha512-4mvsTxjkveWrKDJI70QmelfVqTm+ihFAb6+xf4sjEU2TmUCTlVX87tmg/QooPEMQb/lM9qGHT99ebqPziEd3wg== dependencies: - esbuild "^0.17.5" - postcss "^8.4.23" - rollup "^3.21.0" + esbuild "^0.18.10" + postcss "^8.4.25" + rollup "^3.25.2" optionalDependencies: fsevents "~2.3.2" @@ -6550,17 +6718,16 @@ which-boxed-primitive@^1.0.2: is-string "^1.0.5" is-symbol "^1.0.3" -which-typed-array@^1.1.9: - version "1.1.9" - resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.9.tgz#307cf898025848cf995e795e8423c7f337efbde6" - integrity sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA== +which-typed-array@^1.1.10, which-typed-array@^1.1.11: + version "1.1.11" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.11.tgz#99d691f23c72aab6768680805a271b69761ed61a" + integrity sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew== dependencies: available-typed-arrays "^1.0.5" call-bind "^1.0.2" for-each "^0.3.3" gopd "^1.0.1" has-tostringtag "^1.0.0" - is-typed-array "^1.1.10" which@^2.0.1: version "2.0.2" @@ -6569,11 +6736,6 @@ which@^2.0.1: dependencies: isexe "^2.0.0" -word-wrap@~1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" - integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== - wordwrap@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" @@ -6677,8 +6839,8 @@ zod@^3.21.4: integrity sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw== zustand@^4.3.1: - version "4.3.8" - resolved "https://registry.yarnpkg.com/zustand/-/zustand-4.3.8.tgz#37113df8e9e1421b0be1b2dca02b49b76210e7c4" - integrity sha512-4h28KCkHg5ii/wcFFJ5Fp+k1J3gJoasaIbppdgZFO4BPJnsNxL0mQXBSFgOgAdCdBj35aDTPvdAJReTMntFPGg== + version "4.3.9" + resolved "https://registry.yarnpkg.com/zustand/-/zustand-4.3.9.tgz#a7d4332bbd75dfd25c6848180b3df1407217f2ad" + integrity sha512-Tat5r8jOMG1Vcsj8uldMyqYKC5IZvQif8zetmLHs9WoZlntTHmIoNM8TpLRY31ExncuUvUOXehd0kvahkuHjDw== dependencies: use-sync-external-store "1.2.0" diff --git a/invokeai/version/invokeai_version.py b/invokeai/version/invokeai_version.py index 0b9bff289b..d2be8bdfef 100644 --- a/invokeai/version/invokeai_version.py +++ b/invokeai/version/invokeai_version.py @@ -1 +1 @@ -__version__ = "3.0.0+b5" +__version__ = "3.0.0+b10" diff --git a/pull_request_template.md b/pull_request_template.md new file mode 100644 index 0000000000..e365120f24 --- /dev/null +++ b/pull_request_template.md @@ -0,0 +1,45 @@ +## What type of PR is this? (check all applicable) + +- [ ] Refactor +- [ ] Feature +- [ ] Bug Fix +- [ ] Optimization +- [ ] Documentation Update + + +## Have you discussed this change with the InvokeAI team? +- [ ] Yes +- [ ] No, because: + + +## Description + + +## Related Tickets & Documents + + + +- Related Issue # +- Closes # + +## QA Instructions, Screenshots, Recordings + + + +## Added/updated tests? + +- [ ] Yes +- [ ] No : _please replace this line with details on why tests + have not been included_ + +## [optional] Are there any post deployment tasks we need to perform? diff --git a/pyproject.toml b/pyproject.toml index 1a410ab5d9..5fd9d1f05d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -23,8 +23,6 @@ classifiers = [ 'Operating System :: MacOS', 'Operating System :: Microsoft :: Windows', 'Programming Language :: Python :: 3 :: Only', - 'Programming Language :: Python :: 3.8', - 'Programming Language :: Python :: 3.9', 'Programming Language :: Python :: 3.10', 'Topic :: Artistic Software', 'Topic :: Internet :: WWW/HTTP :: WSGI :: Application', @@ -38,7 +36,7 @@ dependencies = [ "albumentations", "click", "clip_anytorch", # replacing "clip @ https://github.com/openai/CLIP/archive/eaa22acb90a5876642d0507623e859909230a52d.zip", - "compel>=1.2.1", + "compel==2.0.0", "controlnet-aux>=0.0.6", "timm==0.6.13", # needed to override timm latest in controlnet_aux, see https://github.com/isl-org/ZoeDepth/issues/26 "datasets", @@ -58,8 +56,9 @@ dependencies = [ "flaskwebgui==1.0.3", "gfpgan==1.3.8", "huggingface-hub>=0.11.1", - "matplotlib", # needed for plotting of Penner easing functions - "mediapipe", # needed for "mediapipeface" controlnet model + "invisible-watermark>=0.2.0", # needed to install SDXL base and refiner using their repo_ids + "matplotlib", # needed for plotting of Penner easing functions + "mediapipe", # needed for "mediapipeface" controlnet model "npyscreen", "numpy<1.24", "omegaconf", @@ -86,7 +85,7 @@ dependencies = [ "torchvision>=0.14.1", "torchmetrics==0.11.4", "torchsde==0.2.5", - "transformers~=4.30", + "transformers==4.30.2", "uvicorn[standard]==0.21.1", "windows-curses; sys_platform=='win32'", ] diff --git a/tests/nodes/test_graph_execution_state.py b/tests/nodes/test_graph_execution_state.py index f34b18310b..bc4a3f4176 100644 --- a/tests/nodes/test_graph_execution_state.py +++ b/tests/nodes/test_graph_execution_state.py @@ -55,7 +55,6 @@ def mock_services() -> InvocationServices: ), graph_execution_manager = SqliteItemStorage[GraphExecutionState](filename = sqlite_memory, table_name = 'graph_executions'), processor = DefaultInvocationProcessor(), - restoration = None, # type: ignore configuration = None, # type: ignore ) diff --git a/tests/nodes/test_invoker.py b/tests/nodes/test_invoker.py index 19d7dd20b3..4741e7f58b 100644 --- a/tests/nodes/test_invoker.py +++ b/tests/nodes/test_invoker.py @@ -48,7 +48,6 @@ def mock_services() -> InvocationServices: ), graph_execution_manager = SqliteItemStorage[GraphExecutionState](filename = sqlite_memory, table_name = 'graph_executions'), processor = DefaultInvocationProcessor(), - restoration = None, # type: ignore configuration = None, # type: ignore ) diff --git a/tests/nodes/test_node_graph.py b/tests/nodes/test_node_graph.py index df7378150d..cd995141ab 100644 --- a/tests/nodes/test_node_graph.py +++ b/tests/nodes/test_node_graph.py @@ -1,6 +1,6 @@ from .test_nodes import ImageToImageTestInvocation, TextToImageTestInvocation, ListPassThroughInvocation, PromptTestInvocation from invokeai.app.services.graph import Edge, Graph, GraphInvocation, InvalidEdgeError, NodeAlreadyInGraphError, NodeNotFoundError, are_connections_compatible, EdgeConnection, CollectInvocation, IterateInvocation -from invokeai.app.invocations.upscale import UpscaleInvocation +from invokeai.app.invocations.upscale import ESRGANInvocation from invokeai.app.invocations.image import * from invokeai.app.invocations.math import AddInvocation, SubtractInvocation from invokeai.app.invocations.params import ParamIntInvocation @@ -19,7 +19,7 @@ def create_edge(from_id: str, from_field: str, to_id: str, to_field: str) -> Edg def test_connections_are_compatible(): from_node = TextToImageTestInvocation(id = "1", prompt = "Banana sushi") from_field = "image" - to_node = UpscaleInvocation(id = "2") + to_node = ESRGANInvocation(id = "2") to_field = "image" result = are_connections_compatible(from_node, from_field, to_node, to_field) @@ -29,7 +29,7 @@ def test_connections_are_compatible(): def test_connections_are_incompatible(): from_node = TextToImageTestInvocation(id = "1", prompt = "Banana sushi") from_field = "image" - to_node = UpscaleInvocation(id = "2") + to_node = ESRGANInvocation(id = "2") to_field = "strength" result = are_connections_compatible(from_node, from_field, to_node, to_field) @@ -39,7 +39,7 @@ def test_connections_are_incompatible(): def test_connections_incompatible_with_invalid_fields(): from_node = TextToImageTestInvocation(id = "1", prompt = "Banana sushi") from_field = "invalid_field" - to_node = UpscaleInvocation(id = "2") + to_node = ESRGANInvocation(id = "2") to_field = "image" # From field is invalid @@ -86,10 +86,10 @@ def test_graph_fails_to_update_node_if_type_changes(): g = Graph() n = TextToImageTestInvocation(id = "1", prompt = "Banana sushi") g.add_node(n) - n2 = UpscaleInvocation(id = "2") + n2 = ESRGANInvocation(id = "2") g.add_node(n2) - nu = UpscaleInvocation(id = "1") + nu = ESRGANInvocation(id = "1") with pytest.raises(TypeError): g.update_node("1", nu) @@ -98,7 +98,7 @@ def test_graph_allows_non_conflicting_id_change(): g = Graph() n = TextToImageTestInvocation(id = "1", prompt = "Banana sushi") g.add_node(n) - n2 = UpscaleInvocation(id = "2") + n2 = ESRGANInvocation(id = "2") g.add_node(n2) e1 = create_edge(n.id,"image",n2.id,"image") g.add_edge(e1) @@ -128,7 +128,7 @@ def test_graph_fails_to_update_node_id_if_conflict(): def test_graph_adds_edge(): g = Graph() n1 = TextToImageTestInvocation(id = "1", prompt = "Banana sushi") - n2 = UpscaleInvocation(id = "2") + n2 = ESRGANInvocation(id = "2") g.add_node(n1) g.add_node(n2) e = create_edge(n1.id,"image",n2.id,"image") @@ -139,7 +139,7 @@ def test_graph_adds_edge(): def test_graph_fails_to_add_edge_with_cycle(): g = Graph() - n1 = UpscaleInvocation(id = "1") + n1 = ESRGANInvocation(id = "1") g.add_node(n1) e = create_edge(n1.id,"image",n1.id,"image") with pytest.raises(InvalidEdgeError): @@ -148,8 +148,8 @@ def test_graph_fails_to_add_edge_with_cycle(): def test_graph_fails_to_add_edge_with_long_cycle(): g = Graph() n1 = TextToImageTestInvocation(id = "1", prompt = "Banana sushi") - n2 = UpscaleInvocation(id = "2") - n3 = UpscaleInvocation(id = "3") + n2 = ESRGANInvocation(id = "2") + n3 = ESRGANInvocation(id = "3") g.add_node(n1) g.add_node(n2) g.add_node(n3) @@ -164,7 +164,7 @@ def test_graph_fails_to_add_edge_with_long_cycle(): def test_graph_fails_to_add_edge_with_missing_node_id(): g = Graph() n1 = TextToImageTestInvocation(id = "1", prompt = "Banana sushi") - n2 = UpscaleInvocation(id = "2") + n2 = ESRGANInvocation(id = "2") g.add_node(n1) g.add_node(n2) e1 = create_edge("1","image","3","image") @@ -177,8 +177,8 @@ def test_graph_fails_to_add_edge_with_missing_node_id(): def test_graph_fails_to_add_edge_when_destination_exists(): g = Graph() n1 = TextToImageTestInvocation(id = "1", prompt = "Banana sushi") - n2 = UpscaleInvocation(id = "2") - n3 = UpscaleInvocation(id = "3") + n2 = ESRGANInvocation(id = "2") + n3 = ESRGANInvocation(id = "3") g.add_node(n1) g.add_node(n2) g.add_node(n3) @@ -194,7 +194,7 @@ def test_graph_fails_to_add_edge_when_destination_exists(): def test_graph_fails_to_add_edge_with_mismatched_types(): g = Graph() n1 = TextToImageTestInvocation(id = "1", prompt = "Banana sushi") - n2 = UpscaleInvocation(id = "2") + n2 = ESRGANInvocation(id = "2") g.add_node(n1) g.add_node(n2) e1 = create_edge("1","image","2","strength") @@ -344,7 +344,7 @@ def test_graph_iterator_invalid_if_output_and_input_types_different(): def test_graph_validates(): g = Graph() n1 = TextToImageTestInvocation(id = "1", prompt = "Banana sushi") - n2 = UpscaleInvocation(id = "2") + n2 = ESRGANInvocation(id = "2") g.add_node(n1) g.add_node(n2) e1 = create_edge("1","image","2","image") @@ -377,8 +377,8 @@ def test_graph_invalid_if_subgraph_invalid(): def test_graph_invalid_if_has_cycle(): g = Graph() - n1 = UpscaleInvocation(id = "1") - n2 = UpscaleInvocation(id = "2") + n1 = ESRGANInvocation(id = "1") + n2 = ESRGANInvocation(id = "2") g.nodes[n1.id] = n1 g.nodes[n2.id] = n2 e1 = create_edge("1","image","2","image") @@ -391,7 +391,7 @@ def test_graph_invalid_if_has_cycle(): def test_graph_invalid_with_invalid_connection(): g = Graph() n1 = TextToImageTestInvocation(id = "1", prompt = "Banana sushi") - n2 = UpscaleInvocation(id = "2") + n2 = ESRGANInvocation(id = "2") g.nodes[n1.id] = n1 g.nodes[n2.id] = n2 e1 = create_edge("1","image","2","strength") @@ -503,7 +503,7 @@ def test_graph_fails_to_enumerate_non_subgraph_node(): g.add_node(n1) - n2 = UpscaleInvocation(id = "2") + n2 = ESRGANInvocation(id = "2") g.add_node(n2) with pytest.raises(NodeNotFoundError): @@ -512,7 +512,7 @@ def test_graph_fails_to_enumerate_non_subgraph_node(): def test_graph_gets_networkx_graph(): g = Graph() n1 = TextToImageTestInvocation(id = "1", prompt = "Banana sushi") - n2 = UpscaleInvocation(id = "2") + n2 = ESRGANInvocation(id = "2") g.add_node(n1) g.add_node(n2) e = create_edge(n1.id,"image",n2.id,"image") @@ -529,7 +529,7 @@ def test_graph_gets_networkx_graph(): def test_graph_can_serialize(): g = Graph() n1 = TextToImageTestInvocation(id = "1", prompt = "Banana sushi") - n2 = UpscaleInvocation(id = "2") + n2 = ESRGANInvocation(id = "2") g.add_node(n1) g.add_node(n2) e = create_edge(n1.id,"image",n2.id,"image") @@ -541,7 +541,7 @@ def test_graph_can_serialize(): def test_graph_can_deserialize(): g = Graph() n1 = TextToImageTestInvocation(id = "1", prompt = "Banana sushi") - n2 = UpscaleInvocation(id = "2") + n2 = ESRGANInvocation(id = "2") g.add_node(n1) g.add_node(n2) e = create_edge(n1.id,"image",n2.id,"image")