v0.1
This commit is contained in:
		
							
								
								
									
										1
									
								
								.config/ai/scpt
									
									
									
									
									
										Submodule
									
								
							
							
								
								
								
								
								
							
						
						
									
										1
									
								
								.config/ai/scpt
									
									
									
									
									
										Submodule
									
								
							 Submodule .config/ai/scpt added at 3dc38ce5fa
									
								
							
							
								
								
									
										0
									
								
								.config/keep
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										0
									
								
								.config/keep
									
									
									
									
									
										Normal file
									
								
							
							
								
								
									
										12
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,12 @@
 | 
			
		||||
Cargo.lock
 | 
			
		||||
target
 | 
			
		||||
*.json
 | 
			
		||||
*.DS_Store
 | 
			
		||||
**.DS_Store
 | 
			
		||||
scpt/json/
 | 
			
		||||
.config/ai/*.toml
 | 
			
		||||
.config/ai/*.json
 | 
			
		||||
.config/ai/txt
 | 
			
		||||
.config/ai/png
 | 
			
		||||
.ssh
 | 
			
		||||
.env
 | 
			
		||||
							
								
								
									
										3
									
								
								.gitmodules
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								.gitmodules
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,3 @@
 | 
			
		||||
[submodule "bot_scpt"]
 | 
			
		||||
	path = .config/ai/scpt
 | 
			
		||||
	url = git@git.syui.ai:ai/bot_scpt.git
 | 
			
		||||
							
								
								
									
										19
									
								
								Cargo.toml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								Cargo.toml
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,19 @@
 | 
			
		||||
[package]
 | 
			
		||||
name = "ai"
 | 
			
		||||
version = "0.0.1"
 | 
			
		||||
edition = "2021"
 | 
			
		||||
 | 
			
		||||
[dependencies]
 | 
			
		||||
seahorse = "*"
 | 
			
		||||
reqwest = { version = "*", features = ["blocking", "json"] }
 | 
			
		||||
tokio = { version = "1", features = ["full"] }
 | 
			
		||||
shellexpand = "*"
 | 
			
		||||
config = "*"
 | 
			
		||||
serde = "*"
 | 
			
		||||
serde_json = "*"
 | 
			
		||||
serde_derive = "*"
 | 
			
		||||
url = { version = "2.0", features = ["serde"] }
 | 
			
		||||
rustc-serialize = "*"
 | 
			
		||||
toml = "*"
 | 
			
		||||
iso8601-timestamp = "*"
 | 
			
		||||
sysinfo = "*"
 | 
			
		||||
							
								
								
									
										8
									
								
								Dockerfile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								Dockerfile
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,8 @@
 | 
			
		||||
FROM syui/aios
 | 
			
		||||
ADD .ssh /root/.ssh
 | 
			
		||||
 | 
			
		||||
WORKDIR /root
 | 
			
		||||
ADD ./test/entrypoint.sh .
 | 
			
		||||
RUN chmod +x /root/entrypoint.sh
 | 
			
		||||
 | 
			
		||||
ENTRYPOINT ["/root/entrypoint.sh"]
 | 
			
		||||
							
								
								
									
										25
									
								
								Makefile.toml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								Makefile.toml
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,25 @@
 | 
			
		||||
[tasks.format]
 | 
			
		||||
install_crate = "rustfmt"
 | 
			
		||||
command = "cargo"
 | 
			
		||||
args = ["fmt", "--", "--emit=files"]
 | 
			
		||||
 | 
			
		||||
[tasks.clean]
 | 
			
		||||
command = "cargo"
 | 
			
		||||
args = ["clean"]
 | 
			
		||||
 | 
			
		||||
[tasks.build]
 | 
			
		||||
command = "cargo"
 | 
			
		||||
args = ["build"]
 | 
			
		||||
dependencies = ["clean"]
 | 
			
		||||
 | 
			
		||||
[tasks.test]
 | 
			
		||||
command = "cargo"
 | 
			
		||||
args = ["test"]
 | 
			
		||||
dependencies = ["clean"]
 | 
			
		||||
 | 
			
		||||
[tasks.my-flow]
 | 
			
		||||
dependencies = [
 | 
			
		||||
    "format",
 | 
			
		||||
    "build",
 | 
			
		||||
    "test"
 | 
			
		||||
]
 | 
			
		||||
							
								
								
									
										82
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										82
									
								
								README.md
									
									
									
									
									
								
							@@ -1,6 +1,86 @@
 | 
			
		||||
## ai `bot`
 | 
			
		||||
 | 
			
		||||
<img src="./icon/avatar.png" width="100">
 | 
			
		||||
 | 
			
		||||
- name : ai bot
 | 
			
		||||
- base : [rust](https://www.rust-lang.org)
 | 
			
		||||
- host : [yui.syui.ai](https://bsky.app/profile/yui.syui.ai), [ai.syu.is](https://web.syu.is/profile/ai.syu.is)
 | 
			
		||||
 | 
			
		||||
```sh
 | 
			
		||||
$ ai
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
### logo
 | 
			
		||||
 | 
			
		||||
```sh
 | 
			
		||||
$ cargo build
 | 
			
		||||
$ ./target/debug/ai
 | 
			
		||||
$ ./target/debug/ai ai
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
```sh
 | 
			
		||||
$ ai ai -t avatar
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
### login
 | 
			
		||||
 | 
			
		||||
```sh
 | 
			
		||||
# ai login $handle -p $password
 | 
			
		||||
$ ai l yui.syui.ai -p password
 | 
			
		||||
 | 
			
		||||
$ cat ~/.config/ai/token.toml
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
```sh
 | 
			
		||||
# ai l $handle -p $password -s $server
 | 
			
		||||
$ ai l ai.syu.is -p password -s syu.is
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
### refresh
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
$ ai r
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
### notify
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
$ ai n
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
$ ai n | jq .
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
### bot
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
$ ai bot
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
|command|sub|type|body|
 | 
			
		||||
|---|---|---|---|
 | 
			
		||||
|@yui.syui.ai did||mention, reply| [plc.directory](https://plc.directory)/$did/log |
 | 
			
		||||
|@yui.syui.ai card|r, s, b|mention, reply| https://card.syui.ai |
 | 
			
		||||
|@yui.syui.ai ten|start, d, p|mention, reply| https://card.syui.ai |
 | 
			
		||||
|@yui.syui.ai fav|{cid}|mention, reply| https://card.syui.ai |
 | 
			
		||||
|@yui.syui.ai egg|{password}|mention, reply| https://card.syui.ai |
 | 
			
		||||
|@yui.syui.ai 占い||mention, reply| https://yui.syui.ai |
 | 
			
		||||
|@yui.syui.ai nyan|🍰|mention, reply| https://yui.syui.ai |
 | 
			
		||||
|@yui.syui.ai diffusers|{keyword}|mention, reply| [diffusers](https://huggingface.co/docs/diffusers/index) |
 | 
			
		||||
|@yui.syui.ai sh(admin)|{command}|mention, reply| [archlinux](https://wiki.archlinux.org/title/Systemd-nspawn) |
 | 
			
		||||
 | 
			
		||||
### test
 | 
			
		||||
 | 
			
		||||
`zsh`
 | 
			
		||||
 | 
			
		||||
```sh
 | 
			
		||||
$ ./test/ai.zsh t
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
### make
 | 
			
		||||
 | 
			
		||||
```sh
 | 
			
		||||
$ cargo install --force cargo-make
 | 
			
		||||
$ cargo make build
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										11
									
								
								compose.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								compose.yml
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,11 @@
 | 
			
		||||
services:
 | 
			
		||||
  aios:
 | 
			
		||||
    #image: syui/aios
 | 
			
		||||
    #command: ai bot -a syui.syu.is
 | 
			
		||||
    build:
 | 
			
		||||
      context: .
 | 
			
		||||
    restart: always
 | 
			
		||||
    env_file:
 | 
			
		||||
      - .env
 | 
			
		||||
    volumes:
 | 
			
		||||
      - ./.config:/root/.config
 | 
			
		||||
							
								
								
									
										52
									
								
								docs/wiki.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										52
									
								
								docs/wiki.md
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,52 @@
 | 
			
		||||
### docker
 | 
			
		||||
 | 
			
		||||
```sh
 | 
			
		||||
$ docker run -it syui/aios ai
 | 
			
		||||
$ docker run -it -d syui/aios zsh -c "ai login <handle> -p <password> && ai bot"
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
```sh
 | 
			
		||||
$ cp -rf ~/.config/ai ./.config/
 | 
			
		||||
 | 
			
		||||
$ docker compose up
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
### cron
 | 
			
		||||
 | 
			
		||||
```sh
 | 
			
		||||
$ sudo pacman -S fcron
 | 
			
		||||
$ fcrontab -e
 | 
			
		||||
* * * * * $HOME/bot/test/ai.zsh c
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
### ssh
 | 
			
		||||
 | 
			
		||||
```sh
 | 
			
		||||
$ ssh-keygen -f /.ssh/diffusers.key -t ed25519
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
```sh
 | 
			
		||||
FROM syui/aios
 | 
			
		||||
ADD .ssh /root/.ssh
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
```sh
 | 
			
		||||
Host diffusers
 | 
			
		||||
	HostName localhost
 | 
			
		||||
	User root
 | 
			
		||||
	IdentityFile ~/.ssh/diffusers.key
 | 
			
		||||
	StrictHostKeyChecking no
 | 
			
		||||
	UserKnownHostsFile /dev/null
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
```sh
 | 
			
		||||
services:
 | 
			
		||||
  aios:
 | 
			
		||||
    #image: syui/aios
 | 
			
		||||
    build:
 | 
			
		||||
      context: .
 | 
			
		||||
    restart: always
 | 
			
		||||
    volumes:
 | 
			
		||||
      - ./.config:/root/.config
 | 
			
		||||
    command: ai bot -a syui.syu.is
 | 
			
		||||
```
 | 
			
		||||
							
								
								
									
										
											BIN
										
									
								
								icon/ai.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								icon/ai.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| 
		 After Width: | Height: | Size: 89 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								icon/avatar.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								icon/avatar.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| 
		 After Width: | Height: | Size: 557 KiB  | 
							
								
								
									
										57
									
								
								k8s/aios-deployment.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										57
									
								
								k8s/aios-deployment.yaml
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,57 @@
 | 
			
		||||
apiVersion: apps/v1
 | 
			
		||||
kind: Deployment
 | 
			
		||||
metadata:
 | 
			
		||||
  annotations:
 | 
			
		||||
    kompose.cmd: kompose convert -f ../compose.yml --volumes hostPath
 | 
			
		||||
    kompose.version: 1.32.0 (HEAD)
 | 
			
		||||
  labels:
 | 
			
		||||
    io.kompose.service: aios
 | 
			
		||||
  name: aios
 | 
			
		||||
spec:
 | 
			
		||||
  replicas: 1
 | 
			
		||||
  selector:
 | 
			
		||||
    matchLabels:
 | 
			
		||||
      io.kompose.service: aios
 | 
			
		||||
  strategy:
 | 
			
		||||
    type: Recreate
 | 
			
		||||
  template:
 | 
			
		||||
    metadata:
 | 
			
		||||
      annotations:
 | 
			
		||||
        kompose.cmd: kompose convert -f ../compose.yml --volumes hostPath
 | 
			
		||||
        kompose.version: 1.32.0 (HEAD)
 | 
			
		||||
      labels:
 | 
			
		||||
        io.kompose.network/bot-default: "true"
 | 
			
		||||
        io.kompose.service: aios
 | 
			
		||||
    spec:
 | 
			
		||||
      containers:
 | 
			
		||||
        - env:
 | 
			
		||||
            - name: ADMIN
 | 
			
		||||
              valueFrom:
 | 
			
		||||
                configMapKeyRef:
 | 
			
		||||
                  key: ADMIN
 | 
			
		||||
                  name: env
 | 
			
		||||
            - name: HANDLE
 | 
			
		||||
              valueFrom:
 | 
			
		||||
                configMapKeyRef:
 | 
			
		||||
                  key: HANDLE
 | 
			
		||||
                  name: env
 | 
			
		||||
            - name: HOST
 | 
			
		||||
              valueFrom:
 | 
			
		||||
                configMapKeyRef:
 | 
			
		||||
                  key: HOST
 | 
			
		||||
                  name: env
 | 
			
		||||
            - name: PASSWORD
 | 
			
		||||
              valueFrom:
 | 
			
		||||
                configMapKeyRef:
 | 
			
		||||
                  key: PASSWORD
 | 
			
		||||
                  name: env
 | 
			
		||||
          image: aios
 | 
			
		||||
          name: aios
 | 
			
		||||
          volumeMounts:
 | 
			
		||||
            - mountPath: /root/.config
 | 
			
		||||
              name: aios-hostpath0
 | 
			
		||||
      restartPolicy: Always
 | 
			
		||||
      volumes:
 | 
			
		||||
        - hostPath:
 | 
			
		||||
            path: /Users/syui/ai/bot/.config
 | 
			
		||||
          name: aios-hostpath0
 | 
			
		||||
							
								
								
									
										11
									
								
								k8s/env-configmap.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								k8s/env-configmap.yaml
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,11 @@
 | 
			
		||||
apiVersion: v1
 | 
			
		||||
data:
 | 
			
		||||
  ADMIN: $ADMIN
 | 
			
		||||
  HANDLE: $HANDLE
 | 
			
		||||
  HOST: $HOST
 | 
			
		||||
  PASSWORD: $PASSWORD
 | 
			
		||||
kind: ConfigMap
 | 
			
		||||
metadata:
 | 
			
		||||
  labels:
 | 
			
		||||
    io.kompose.service: aios-env
 | 
			
		||||
  name: env
 | 
			
		||||
							
								
								
									
										205
									
								
								src/ascii.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										205
									
								
								src/ascii.rs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,205 @@
 | 
			
		||||
use sysinfo::System;
 | 
			
		||||
 | 
			
		||||
pub fn c_ascii(x: &str) {
 | 
			
		||||
    let logo = "
 | 
			
		||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
 | 
			
		||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢠⣿⣧⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
 | 
			
		||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣰⣿⣿⣿⣧⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
 | 
			
		||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣰⣿⣿⣿⣿⣿⣷⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
 | 
			
		||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣼⣿⣿⣿⣿⣿⣿⣿⣿⡄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
 | 
			
		||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣀⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣆⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
 | 
			
		||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣠⣴⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣶⣤⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
 | 
			
		||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣠⣶⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⣦⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
 | 
			
		||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣴⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣶⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
 | 
			
		||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣠⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣦⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
 | 
			
		||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣴⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠟⠋⠉⠀⠀⠀⠀⠀⠈⠉⠛⠿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⡄⠀⠀⠀⠀⠀⠀⠀⠀⠀
 | 
			
		||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⣼⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠟⠉⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠙⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡄⠀⠀⠀⠀⠀⠀⠀⠀
 | 
			
		||||
⠀⠀⠀⠀⠀⠀⠀⠀⣸⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠹⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡀⠀⠀⠀⠀⠀⠀⠀
 | 
			
		||||
⠀⠀⠀⠀⠀⠀⠀⢀⣿⣿⣿⣿⣿⣿⣿⣿⣿⡟⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠘⣿⣿⣿⣿⣿⣿⣿⣿⣿⣇⠀⠀⠀⠀⠀⠀⠀
 | 
			
		||||
⠀⠀⠀⠀⠀⠀⠀⢸⣿⣿⣿⣿⣿⣿⣿⣿⣿⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢹⣿⣿⣿⣿⣿⣿⣿⣿⣿⠀⠀⠀⠀⠀⠀⠀
 | 
			
		||||
⠀⠀⠀⠀⠀⠀⠀⣿⣿⣿⣿⣿⣿⣿⣿⣿⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⣿⣿⣿⣿⣿⣿⣿⣿⣿⡇⠀⠀⠀⠀⠀⠀
 | 
			
		||||
⠀⠀⠀⠀⠀⠀⠀⣿⣿⣿⣿⣿⣿⣿⣿⣿⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⣿⣿⣿⣿⣿⣿⣿⣿⡇⠀⠀⠀⠀⠀⠀
 | 
			
		||||
⠀⠀⠀⠀⠀⠀⠀⢹⣿⣿⣿⣿⣿⣿⣿⣿⣷⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢰⣿⣿⣿⣿⣿⣿⣿⣿⣿⠁⠀⠀⠀⠀⠀⠀
 | 
			
		||||
⠀⠀⠀⠀⠀⠀⠀⠸⣿⣿⣿⣿⣿⣿⣿⣿⣿⣆⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣾⣿⣿⣿⣿⣿⣿⣿⣿⡿⠀⠀⠀⠀⠀⠀⠀
 | 
			
		||||
⠀⠀⠀⠀⠀⠀⠀⣰⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣆⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⡀⠀⠀⠀⠀⠀⠀
 | 
			
		||||
⠀⠀⠀⠀⠀⠀⢰⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣧⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣠⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⠀⠀⠀⠀⠀⠀
 | 
			
		||||
⠀⠀⠀⠀⠀⢠⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⣄⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⣴⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣧⠀⠀⠀⠀⠀
 | 
			
		||||
⠀⠀⠀⠀⢠⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣶⣦⣤⣤⣤⣤⣶⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣇⠀⠀⠀⠀
 | 
			
		||||
⠀⠀⠀⢀⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣆⠀⠀⠀
 | 
			
		||||
⠀⠀⠀⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡆⠀⠀
 | 
			
		||||
⠀⠀⠘⠛⠛⠛⠛⠉⠉⠉⠉⠁⠀⠀⠀⠀⠈⠛⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠟⠋⠀⠀⠀⠀⠀⠉⠉⠉⠉⠙⠛⠛⠛⠛⠀⠀
 | 
			
		||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠙⠛⠿⠿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠿⠟⠋⠉⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
 | 
			
		||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠉⠉⠉⠉⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
 | 
			
		||||
";
 | 
			
		||||
 | 
			
		||||
    let avatar = "
 | 
			
		||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
 | 
			
		||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣀⣀⣀⣀⣁⣀⣀⣀⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
 | 
			
		||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣠⣤⠖⠋⠉⠉⠀⠀⠀⠀⠀⠀⠀⠀⠈⠉⠙⠒⢦⣄⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
 | 
			
		||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠰⢿⣷⣦⣤⣤⣤⣤⣤⣤⣤⣤⣤⣤⣤⣤⣤⣤⣤⣴⣿⠷⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
 | 
			
		||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⣴⣶⠿⠟⠛⠛⠋⠉⠋⠉⠉⠉⠉⠙⠛⠙⠛⠛⠻⠿⢷⣶⣄⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
 | 
			
		||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠚⠉⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠉⠙⠂⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
 | 
			
		||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
 | 
			
		||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣀⣀⣀⣀⣀⣀⣀⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
 | 
			
		||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⣤⣴⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣶⣦⣤⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
 | 
			
		||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣠⣴⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣦⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
 | 
			
		||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣠⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⣤⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
 | 
			
		||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣴⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣦⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
 | 
			
		||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢠⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
 | 
			
		||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢠⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
 | 
			
		||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠋⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡟⠘⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣧⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
 | 
			
		||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠏⣼⡀⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⢠⣷⠸⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
 | 
			
		||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠏⣼⣿⡇⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⢁⣾⣿⡆⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡆⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
 | 
			
		||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⢰⣿⣿⣧⢸⣿⣿⣿⣿⣿⣿⣿⣿⣿⠃⣾⣿⣿⡇⣿⣿⣿⢻⣿⣿⣿⣿⣿⣿⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
 | 
			
		||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⣿⣿⣿⣿⣿⣿⣿⣿⠇⣾⣿⣿⣿⡄⣿⣿⣿⣿⣿⣿⣿⣿⠏⣼⣿⣿⣿⡇⣿⡿⢣⠈⣿⣿⣿⣿⣿⣿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
 | 
			
		||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢿⣿⣿⣿⣿⣿⣿⣿⢹⠀⣿⣿⣿⣿⣧⢹⣿⡏⢹⣿⣿⣿⠏⣼⣿⡿⠿⢿⢣⡿⣡⣿⠀⣿⣿⣿⣿⣿⡿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
 | 
			
		||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⣿⣿⣿⣿⣿⣿⢃⠸⠀⣵⡶⠶⢶⣿⡆⢿⢁⠸⣿⣿⢋⣼⣯⡴⠒⠒⠒⣼⡑⢟⣿⢠⣿⣿⣿⣿⣿⠇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
 | 
			
		||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡀⢿⣿⣿⣿⣿⡟⠈⣄⠈⠡⡐⢿⣦⠹⣿⡌⢸⡆⠿⣡⣾⣿⡟⢐⠇⠙⣡⡀⣿⡎⢿⠈⢐⡲⣆⢻⡟⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
 | 
			
		||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⢳⡘⣿⣿⣿⣿⡇⣸⣿⡄⣶⡄⠀⣿⠀⣿⣿⣜⣷⣼⣿⣿⣿⡇⢸⡇⠀⣿⠃⣿⣿⣸⠀⡌⢇⣿⠘⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
 | 
			
		||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠑⠘⣿⣿⣿⡇⣿⣿⣧⡘⢷⣾⠟⣰⣿⣿⣿⣿⣿⣿⣿⣿⣿⣌⣿⣿⣃⣼⣿⣿⡟⠀⣿⣾⠇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
 | 
			
		||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⢿⣿⡇⢸⣿⣿⣿⣾⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠡⠾⢛⡁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
 | 
			
		||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠙⢿⡘⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⢃⣶⡾⠏⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
 | 
			
		||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢠⡅⢀⡹⣿⣿⣿⣿⣿⣿⣯⣛⡛⣛⣛⣭⣿⣿⣿⣿⣿⠿⢋⣤⠟⢉⠠⣶⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
 | 
			
		||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⠃⣸⣿⣦⡍⠛⠻⠿⣿⣿⣿⣿⣿⣿⣿⠿⠿⢛⡉⢠⡶⠋⡄⢺⣿⡀⣿⡄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
 | 
			
		||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠘⠀⣿⣿⢿⠇⣼⢹⡀⣶⣦⣭⣭⣭⣴⣶⣿⠂⡟⠀⢋⣴⡇⡇⣾⣿⡇⢻⣷⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
 | 
			
		||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⠀⣿⡿⢸⢀⠇⣸⡀⣿⣿⣿⣿⣿⣿⣿⣿⠀⣠⠀⣿⣿⡇⠀⣿⢹⣷⠸⣿⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
 | 
			
		||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣾⠀⣿⡇⡟⠘⢠⡿⠃⣿⣿⣿⣿⣿⣿⣿⣿⡀⣤⠀⣿⣿⠃⢰⣿⠸⣿⡀⣿⣿⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
 | 
			
		||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢜⣽⠀⣿⠁⡇⡰⣢⣼⣰⣿⣿⣿⣿⣿⣿⣿⣿⣷⣌⠀⣿⣿⠀⣼⣿⡄⣿⣧⠸⣿⣧⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
 | 
			
		||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⠔⣠⠞⣋⠀⣿⢸⠃⣴⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠀⣿⣿⢠⣬⣍⣁⣙⠛⠦⠹⣿⣆⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
 | 
			
		||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡠⢋⠜⣡⣿⣿⢠⡿⠘⢠⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⢠⣿⡇⣸⣿⣿⣿⣿⣿⣷⣦⣍⠻⣆⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
 | 
			
		||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢠⠞⡰⢫⣾⣿⡟⣵⢸⡇⠀⢸⡿⠿⢛⣋⣉⣿⣿⣿⣿⣿⣿⣫⣭⡍⢸⣿⠇⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⡌⢦⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
 | 
			
		||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡴⢃⡞⣰⣿⣿⣿⣦⡛⢸⡇⠀⣿⣷⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡇⢸⣿⠀⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡈⢷⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
 | 
			
		||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⡞⢡⡏⣼⣿⣿⣿⣿⣿⣿⢸⡇⠀⣭⣭⣭⣤⣶⣦⢠⣭⣙⠻⣿⣿⣿⣿⡇⣾⡇⢰⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡇⡄⢻⣆⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
 | 
			
		||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣠⡟⢰⣿⢰⣿⣿⣿⣿⣿⣿⣿⠸⣇⠀⣿⣿⣿⣿⣿⡇⢸⣿⣿⣿⡜⣿⣿⣿⡇⣿⠀⢸⣿⡿⠿⠿⠛⠿⠿⠟⣛⣛⣉⣥⣿⡈⣿⣷⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
 | 
			
		||||
 | 
			
		||||
";
 | 
			
		||||
 | 
			
		||||
    let color = "
 | 
			
		||||
[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m
 | 
			
		||||
[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m
 | 
			
		||||
[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m
 | 
			
		||||
[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m
 | 
			
		||||
[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m
 | 
			
		||||
[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m
 | 
			
		||||
[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m
 | 
			
		||||
[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m
 | 
			
		||||
[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m
 | 
			
		||||
[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m
 | 
			
		||||
[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m
 | 
			
		||||
[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⣰[0m[38;2;7;7;0m⡄[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m
 | 
			
		||||
[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⣼[0m[38;2;255;255;0m⣿[0m[38;2;253;253;0m⣿[0m[38;2;28;28;0m⣄[0m[38;2;1;1;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m
 | 
			
		||||
[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;2;1;0m⢀[0m[38;2;40;39;0m⣼[0m[38;2;252;252;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;252;252;0m⣿[0m[38;2;108;108;0m⣆[0m[38;2;4;4;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m
 | 
			
		||||
[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⣀[0m[38;2;4;4;0m⣤[0m[38;2;116;116;0m⣾[0m[38;2;252;252;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;252;252;0m⣿[0m[38;2;193;193;0m⣧[0m[38;2;1;1;0m⣄[0m[38;2;2;1;0m⡀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m
 | 
			
		||||
[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;4;4;0m⣠[0m[38;2;10;10;0m⣶[0m[38;2;240;240;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;252;252;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;253;253;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣷[0m[38;2;35;35;0m⣦[0m[38;2;1;1;0m⣀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m
 | 
			
		||||
[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⣴[0m[38;2;203;203;0m⣿[0m[38;2;250;250;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;251;251;0m⣿[0m[38;2;244;244;0m⣷[0m[38;2;0;0;0m⣄[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m
 | 
			
		||||
[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;3;2;0m⢠[0m[38;2;112;111;0m⣾[0m[38;2;250;250;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⡿[0m[38;2;254;254;0m⠟[0m[38;2;254;254;0m⠛[0m[38;2;255;255;0m⠉[0m[38;2;255;255;0m⠉[0m[38;2;255;255;0m⠉[0m[38;2;255;255;0m⠙[0m[38;2;255;255;0m⠛[0m[38;2;253;253;0m⠿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;251;251;0m⣿[0m[38;2;185;185;0m⣦[0m[38;2;4;4;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m
 | 
			
		||||
[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;1;0;0m⢠[0m[38;2;229;229;0m⣿[0m[38;2;253;253;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⡿[0m[38;2;255;255;0m⠋[0m[38;2;78;77;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;1;1;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;2;1;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;36;36;0m⠈[0m[38;2;255;255;0m⠙[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣧[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m
 | 
			
		||||
[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;3;3;0m⠀[0m[38;2;160;160;0m⣾[0m[38;2;251;251;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;252;252;0m⠏[0m[38;2;92;91;0m⠀[0m[38;2;5;4;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;2;1;0m⠀[0m[38;2;28;28;0m⠈[0m[38;2;253;253;0m⢿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;253;253;0m⣿[0m[38;2;227;227;0m⣇[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m
 | 
			
		||||
[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⢰[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;252;252;0m⡿[0m[38;2;88;87;0m⠀[0m[38;2;4;4;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;1;1;0m⠀[0m[38;2;22;22;0m⠈[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;10;10;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m
 | 
			
		||||
[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;1;1;0m⠀[0m[38;2;37;37;0m⢸[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⡇[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;251;251;0m⣿[0m[38;2;108;108;0m⠀[0m[38;2;4;3;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m
 | 
			
		||||
[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;1;1;0m⠀[0m[38;2;31;31;0m⠸[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣷[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⢠[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;251;251;0m⣿[0m[38;2;101;101;0m⠀[0m[38;2;4;4;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m
 | 
			
		||||
[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⢀[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;253;253;0m⣿[0m[38;2;207;207;0m⣧[0m[38;2;2;2;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;4;4;0m⢀[0m[38;2;133;132;0m⣾[0m[38;2;251;251;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣧[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m
 | 
			
		||||
[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;4;4;0m⢀[0m[38;2;128;128;0m⣾[0m[38;2;251;251;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;254;254;0m⣿[0m[38;2;254;254;0m⣷[0m[38;2;0;0;0m⣄[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⢀[0m[38;2;0;0;0m⣴[0m[38;2;221;221;0m⣿[0m[38;2;253;253;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;252;252;0m⣿[0m[38;2;202;202;0m⣇[0m[38;2;2;2;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m
 | 
			
		||||
[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;3;2;0m⠀[0m[38;2;72;71;0m⣼[0m[38;2;252;252;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;254;254;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;67;66;0m⣦[0m[38;2;0;0;0m⣤[0m[38;2;1;1;0m⣄[0m[38;2;4;4;0m⣀[0m[38;2;4;4;0m⣀[0m[38;2;3;3;0m⣠[0m[38;2;0;0;0m⣤[0m[38;2;36;36;0m⣶[0m[38;2;254;254;0m⣿[0m[38;2;252;252;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;251;251;0m⣿[0m[38;2;153;153;0m⣆[0m[38;2;3;3;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m
 | 
			
		||||
[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;20;20;0m⣼[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;252;252;0m⣿[0m[38;2;251;251;0m⣿[0m[38;2;251;251;0m⣿[0m[38;2;252;252;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;252;252;0m⣿[0m[38;2;81;80;0m⡆[0m[38;2;4;4;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m
 | 
			
		||||
[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠸[0m[38;2;252;252;0m⠟[0m[38;2;251;251;0m⠛[0m[38;2;251;251;0m⠛[0m[38;2;254;254;0m⠛[0m[38;2;255;255;0m⠛[0m[38;2;255;255;0m⠉[0m[38;2;255;255;0m⠉[0m[38;2;255;255;0m⠉[0m[38;2;255;255;0m⠙[0m[38;2;252;252;0m⠻[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⡿[0m[38;2;253;253;0m⠟[0m[38;2;255;255;0m⠉[0m[38;2;255;255;0m⠉[0m[38;2;255;255;0m⠉[0m[38;2;255;255;0m⠙[0m[38;2;255;255;0m⠛[0m[38;2;255;255;0m⠛[0m[38;2;251;251;0m⠛[0m[38;2;251;251;0m⠛[0m[38;2;251;251;0m⠿[0m[38;2;34;34;0m⠀[0m[38;2;2;1;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m
 | 
			
		||||
[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;4;4;0m⠀[0m[38;2;4;4;0m⠀[0m[38;2;3;3;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;1;1;0m⠀[0m[38;2;5;5;0m⠀[0m[38;2;206;206;0m⠉[0m[38;2;255;255;0m⠙[0m[38;2;253;253;0m⠛[0m[38;2;252;252;0m⠻[0m[38;2;254;254;0m⠿[0m[38;2;255;255;0m⠿[0m[38;2;255;255;0m⠿[0m[38;2;254;254;0m⠿[0m[38;2;252;252;0m⠟[0m[38;2;252;252;0m⠛[0m[38;2;255;255;0m⠉[0m[38;2;228;228;0m⠁[0m[38;2;27;27;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;2;1;0m⠀[0m[38;2;4;4;0m⠀[0m[38;2;4;4;0m⠀[0m[38;2;1;1;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m
 | 
			
		||||
[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;3;2;0m⠀[0m[38;2;2;2;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;1;1;0m⠀[0m[38;2;3;2;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m
 | 
			
		||||
[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m
 | 
			
		||||
[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m
 | 
			
		||||
[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m
 | 
			
		||||
[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m
 | 
			
		||||
[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m
 | 
			
		||||
[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m
 | 
			
		||||
[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m
 | 
			
		||||
[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m
 | 
			
		||||
[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m
 | 
			
		||||
[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m
 | 
			
		||||
    ";
 | 
			
		||||
 | 
			
		||||
    let avatar_color = "
 | 
			
		||||
[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m
 | 
			
		||||
[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m
 | 
			
		||||
[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m
 | 
			
		||||
[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⢀[0m[38;2;0;0;0m⣀[0m[38;2;0;0;0m⣀[0m[38;2;0;0;0m⣀[0m[38;2;5;5;0m⣀[0m[38;2;184;184;0m⡀[0m[38;2;25;25;0m⠀[0m[38;2;0;0;0m⣀[0m[38;2;0;0;0m⣀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m
 | 
			
		||||
[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⣀[0m[38;2;0;0;5m⡤[0m[38;2;35;35;2m⠖[0m[38;2;164;164;0m⠊[0m[38;2;237;237;0m⠉[0m[38;2;200;200;0m⠁[0m[38;2;101;101;0m⠀[0m[38;2;51;51;0m⠀[0m[38;2;24;24;0m⠀[0m[38;2;15;15;0m⠀[0m[38;2;14;14;0m⠀[0m[38;2;27;27;0m⠀[0m[38;2;38;38;0m⠀[0m[38;2;71;71;1m⠀[0m[38;2;127;127;0m⠀[0m[38;2;197;197;0m⠉[0m[38;2;203;203;0m⠁[0m[38;2;127;127;0m⠒[0m[38;2;18;18;2m⠦[0m[38;2;0;0;4m⣄[0m[38;2;0;0;0m⡀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m
 | 
			
		||||
[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;3;3;4m⠐[0m[38;2;253;253;0m⠿[0m[38;2;254;254;0m⣷[0m[38;2;0;0;2m⣤[0m[38;2;0;0;0m⣤[0m[38;2;0;0;0m⣤[0m[38;2;0;0;0m⣤[0m[38;2;0;0;0m⣤[0m[38;2;0;0;0m⣤[0m[38;2;0;0;0m⣤[0m[38;2;0;0;0m⣤[0m[38;2;0;0;0m⣤[0m[38;2;0;0;0m⣤[0m[38;2;0;0;1m⣤[0m[38;2;0;0;2m⣤[0m[38;2;0;0;4m⣤[0m[38;2;0;0;2m⣤[0m[38;2;0;0;2m⣤[0m[38;2;0;0;4m⣤[0m[38;2;0;0;3m⣴[0m[38;2;254;254;0m⡿[0m[38;2;253;253;0m⠷[0m[38;2;4;4;4m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m
 | 
			
		||||
[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;1;1;0m⢀[0m[38;2;0;0;5m⣴[0m[38;2;71;71;0m⡶[0m[38;2;176;176;0m⠾[0m[38;2;251;251;0m⠟[0m[38;2;254;254;0m⠛[0m[38;2;253;253;0m⠋[0m[38;2;253;253;0m⠉[0m[38;2;252;252;0m⠉[0m[38;2;254;254;0m⠉[0m[38;2;254;254;0m⠉[0m[38;2;253;253;0m⠉[0m[38;2;252;252;0m⠉[0m[38;2;252;252;0m⠉[0m[38;2;253;253;0m⠉[0m[38;2;253;253;0m⠉[0m[38;2;253;253;0m⠉[0m[38;2;253;253;0m⠉[0m[38;2;254;254;0m⠛[0m[38;2;252;252;0m⠛[0m[38;2;251;251;0m⠿[0m[38;2;194;194;0m⠷[0m[38;2;49;49;0m⣶[0m[38;2;0;0;6m⣄[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m
 | 
			
		||||
[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;1;1;4m⠀[0m[38;2;74;74;3m⠊[0m[38;2;250;250;0m⠉[0m[38;2;156;156;0m⠀[0m[38;2;37;37;2m⠀[0m[38;2;0;0;6m⠀[0m[38;2;0;0;3m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;3m⠀[0m[38;2;0;0;6m⠀[0m[38;2;49;49;2m⠀[0m[38;2;173;173;0m⠈[0m[38;2;250;250;0m⠙[0m[38;2;66;66;3m⠂[0m[38;2;1;1;4m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m
 | 
			
		||||
[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;2;2;2m⠀[0m[38;2;4;4;4m⠀[0m[38;2;1;1;4m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;5m⠀[0m[38;2;4;4;4m⠀[0m[38;2;3;3;3m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m
 | 
			
		||||
[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⣀[0m[38;2;0;0;0m⣀[0m[38;2;0;0;0m⣀[0m[38;2;0;0;0m⣀[0m[38;2;0;0;0m⣀[0m[38;2;0;0;0m⣀[0m[38;2;0;0;0m⡀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m
 | 
			
		||||
[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⢀[0m[38;2;11;11;4m⣠[0m[38;2;0;0;0m⣴[0m[38;2;63;63;0m⣶[0m[38;2;221;221;0m⣿[0m[38;2;243;243;0m⣿[0m[38;2;236;236;0m⣿[0m[38;2;232;232;0m⣿[0m[38;2;230;230;0m⣿[0m[38;2;228;228;0m⣿[0m[38;2;228;228;0m⣿[0m[38;2;230;230;0m⣿[0m[38;2;233;233;0m⣿[0m[38;2;240;240;0m⣿[0m[38;2;222;222;0m⣷[0m[38;2;113;113;0m⣶[0m[38;2;3;3;1m⣤[0m[38;2;0;0;0m⣄[0m[38;2;0;0;0m⣀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m
 | 
			
		||||
[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;4;4;2m⢀[0m[38;2;0;0;1m⣴[0m[38;2;156;156;0m⣾[0m[38;2;241;241;0m⣿[0m[38;2;226;226;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;6m⣿[0m[38;2;233;233;41m⣿[0m[38;2;231;231;38m⣿[0m[38;2;231;231;48m⣿[0m[38;2;248;248;48m⣿[0m[38;2;65;65;12m⣦[0m[38;2;11;11;0m⣄[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m
 | 
			
		||||
[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;12;12;4m⢀[0m[38;2;74;74;0m⣼[0m[38;2;233;233;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;231;231;23m⣿[0m[38;2;230;230;11m⣿[0m[38;2;232;232;29m⣿[0m[38;2;227;227;20m⣿[0m[38;2;241;241;41m⣷[0m[38;2;3;3;0m⣄[0m[38;2;4;4;4m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m
 | 
			
		||||
[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;1;1;1m⠀[0m[38;2;32;32;1m⣴[0m[38;2;231;231;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;1m⣿[0m[38;2;230;230;7m⣿[0m[38;2;248;248;27m⣷[0m[38;2;10;10;1m⣄[0m[38;2;5;5;3m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m
 | 
			
		||||
[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;7;7;7m⢀[0m[38;2;121;121;0m⣾[0m[38;2;228;228;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;231;231;37m⣿[0m[38;2;228;228;49m⣷[0m[38;2;0;0;0m⡀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m
 | 
			
		||||
[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;1;1;2m⢠[0m[38;2;183;183;0m⣾[0m[38;2;227;227;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;245;245;73m⣷[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m
 | 
			
		||||
[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;1;1;1m⠀[0m[38;2;130;130;0m⣾[0m[38;2;227;227;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⠟[0m[38;2;230;230;0m⠉[0m[38;2;214;214;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;232;232;0m⡇[0m[38;2;120;120;2m⠈[0m[38;2;219;219;0m⢿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;1m⣿[0m[38;2;229;229;0m⣿[0m[38;2;228;228;2m⣿[0m[38;2;218;218;62m⣇[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m
 | 
			
		||||
[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;6;6;0m⢰[0m[38;2;238;238;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;227;227;0m⠋[0m[38;2;47;47;1m⣴[0m[38;2;120;115;102m⠀[0m[38;2;212;212;2m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;227;227;0m⡟[0m[38;2;143;144;0m⢀[0m[38;2;208;199;183m⣧[0m[38;2;119;119;0m⠸[0m[38;2;227;227;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;240;240;72m⣿[0m[38;2;36;36;11m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m
 | 
			
		||||
[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;3;3;2m⠀[0m[38;2;145;145;0m⢸[0m[38;2;226;226;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;232;232;1m⠃[0m[38;2;26;26;11m⣸[0m[38;2;255;251;232m⣿[0m[38;2;170;164;159m⡆[0m[38;2;190;190;1m⢸[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;228;228;0m⡿[0m[38;2;211;211;0m⠁[0m[38;2;129;124;120m⣾[0m[38;2;245;235;217m⣿[0m[38;2;98;94;94m⡀[0m[38;2;241;241;19m⣿[0m[38;2;229;229;1m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;226;226;0m⣿[0m[38;2;128;128;37m⠀[0m[38;2;2;2;1m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m
 | 
			
		||||
[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;1;1;2m⠀[0m[38;2;199;199;0m⣿[0m[38;2;227;227;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⡟[0m[38;2;72;72;0m⢠[0m[38;2;255;252;232m⣿[0m[38;2;255;245;227m⣿[0m[38;2;255;255;240m⣧[0m[38;2;90;90;0m⠸[0m[38;2;228;228;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;238;238;2m⠃[0m[38;2;62;60;64m⣼[0m[38;2;223;214;199m⣿[0m[38;2;253;243;225m⣿[0m[38;2;198;189;174m⡇[0m[38;2;226;226;54m⣿[0m[38;2;228;228;2m⣿[0m[38;2;229;229;0m⡿[0m[38;2;232;232;0m⠛[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;227;227;0m⣿[0m[38;2;164;164;40m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m
 | 
			
		||||
[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;3m⠀[0m[38;2;209;209;0m⢻[0m[38;2;228;228;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;228;228;0m⣿[0m[38;2;221;221;2m⠃[0m[38;2;100;96;97m⣼[0m[38;2;254;244;226m⣿[0m[38;2;255;245;227m⣿[0m[38;2;254;246;230m⣿[0m[38;2;56;54;52m⡀[0m[38;2;241;241;2m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;240;240;1m⠃[0m[38;2;28;28;24m⣰[0m[38;2;204;196;181m⣿[0m[38;2;255;247;230m⣿[0m[38;2;253;243;226m⣿[0m[38;2;213;206;193m⠇[0m[38;2;222;222;24m⣿[0m[38;2;228;228;1m⡿[0m[38;2;225;225;0m⢡[0m[38;2;77;73;89m⠀[0m[38;2;244;244;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;227;227;4m⣿[0m[38;2;127;127;13m⠀[0m[38;2;2;2;1m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m
 | 
			
		||||
[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;3;3;4m⠀[0m[38;2;181;181;0m⢸[0m[38;2;227;227;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;232;232;0m⡏[0m[38;2;175;175;1m⢸[0m[38;2;113;113;0m⠀[0m[38;2;225;216;199m⣿[0m[38;2;254;244;226m⡿[0m[38;2;255;245;227m⢿[0m[38;2;254;245;227m⣿[0m[38;2;251;243;227m⣇[0m[38;2;147;148;0m⠸[0m[38;2;227;227;0m⣿[0m[38;2;230;230;0m⠏[0m[38;2;223;223;0m⢹[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;236;236;1m⠃[0m[38;2;26;26;11m⣰[0m[38;2;210;202;187m⣿[0m[38;2;255;248;234m⠿[0m[38;2;255;247;232m⠿[0m[38;2;253;242;224m⠿[0m[38;2;155;151;160m⢀[0m[38;2;244;244;0m⡟[0m[38;2;215;215;1m⢡[0m[38;2;207;199;192m⣿[0m[38;2;85;82;83m⠀[0m[38;2;242;242;4m⣿[0m[38;2;229;229;4m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;232;232;6m⡏[0m[38;2;38;38;6m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m
 | 
			
		||||
[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;3;3;0m⠀[0m[38;2;108;108;0m⠸[0m[38;2;226;226;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;234;234;0m⠃[0m[38;2;58;58;0m⠘[0m[38;2;67;67;0m⠀[0m[38;2;137;132;120m⣤[0m[38;2;44;42;39m⠶[0m[38;2;69;67;62m⠶[0m[38;2;59;57;52m⢦[0m[38;2;224;216;201m⣿[0m[38;2;89;86;88m⡆[0m[38;2;237;237;3m⢻[0m[38;2;160;160;0m⠀[0m[38;2;107;107;0m⠘[0m[38;2;227;227;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;238;238;1m⠃[0m[38;2;24;23;13m⣴[0m[38;2;255;253;238m⣯[0m[38;2;103;100;94m⡴[0m[38;2;67;65;61m⠒[0m[38;2;118;115;108m⠒[0m[38;2;105;102;95m⠂[0m[38;2;63;62;62m⠜[0m[38;2;153;154;6m⡀[0m[38;2;252;248;232m⠛[0m[38;2;255;248;233m⣿[0m[38;2;59;57;58m⠀[0m[38;2;241;241;2m⣿[0m[38;2;229;229;0m⠿[0m[38;2;229;229;0m⢿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;7m⣿[0m[38;2;227;227;32m⠃[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m
 | 
			
		||||
[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⡀[0m[38;2;238;238;0m⢻[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;236;236;1m⡏[0m[38;2;56;54;29m⠈[0m[38;2;55;53;56m⡀[0m[38;2;61;61;0m⠀[0m[38;2;209;205;192m⠡[0m[38;2;11;28;36m⠀[0m[38;2;74;158;202m⠶[0m[38;2;40;93;122m⣆[0m[38;2;223;216;204m⠹[0m[38;2;254;251;236m⣿[0m[38;2;32;31;11m⡌[0m[38;2;110;110;2m⢸[0m[38;2;116;112;112m⡄[0m[38;2;237;237;2m⠿[0m[38;2;231;230;2m⢡[0m[38;2;93;89;90m⣾[0m[38;2;254;247;233m⣿[0m[38;2;254;249;235m⡏[0m[38;2;70;65;60m⠐[0m[38;2;156;155;155m⠂[0m[38;2;70;184;239m⠘[0m[38;2;132;184;210m⣁[0m[38;2;13;12;22m⠀[0m[38;2;255;255;244m⣿[0m[38;2;43;42;39m⡄[0m[38;2;255;255;243m⢿[0m[38;2;55;53;51m⠀[0m[38;2;131;132;0m⠐[0m[38;2;119;115;101m⠒[0m[38;2;28;26;24m⡆[0m[38;2;235;235;4m⢹[0m[38;2;234;234;10m⡏[0m[38;2;31;31;10m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m
 | 
			
		||||
[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;254;254;241m⠳[0m[38;2;48;49;0m⠈[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;228;228;0m⣿[0m[38;2;226;226;0m⡇[0m[38;2;0;0;2m⢰[0m[38;2;255;255;242m⣿[0m[38;2;11;8;6m⡀[0m[38;2;59;126;160m⢰[0m[38;2;25;31;35m⠀[0m[38;2;0;0;0m⠀[0m[38;2;100;201;251m⣹[0m[38;2;39;91;118m⠀[0m[38;2;255;255;242m⣿[0m[38;2;255;255;243m⣷[0m[38;2;21;20;21m⣌[0m[38;2;255;255;243m⣷[0m[38;2;26;27;1m⣴[0m[38;2;254;247;233m⣿[0m[38;2;254;246;230m⣿[0m[38;2;254;245;229m⣿[0m[38;2;255;248;233m⡇[0m[38;2;55;135;176m⢸[0m[38;2;85;176;220m⡀[0m[38;2;0;0;0m⠀[0m[38;2;89;183;229m⣸[0m[38;2;80;182;234m⠀[0m[38;2;191;180;166m⣿[0m[38;2;255;255;242m⣷[0m[38;2;80;76;71m⣸[0m[38;2;75;73;68m⠀[0m[38;2;125;120;111m⡌[0m[38;2;255;249;230m⠃[0m[38;2;178;171;157m⡿[0m[38;2;15;16;3m⠘[0m[38;2;124;124;32m⠀[0m[38;2;2;2;1m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m
 | 
			
		||||
[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;181;173;159m⠁[0m[38;2;102;102;0m⠈[0m[38;2;227;227;0m⢿[0m[38;2;229;229;0m⣿[0m[38;2;228;228;0m⣿[0m[38;2;220;220;0m⡇[0m[38;2;183;176;172m⢹[0m[38;2;252;243;227m⣿[0m[38;2;248;241;225m⣧[0m[38;2;54;118;152m⠘[0m[38;2;102;204;255m⢷[0m[38;2;45;92;116m⢶[0m[38;2;102;205;254m⠋[0m[38;2;29;72;94m⣰[0m[38;2;255;254;239m⣿[0m[38;2;255;246;230m⣿[0m[38;2;254;245;229m⣿[0m[38;2;255;249;233m⣿[0m[38;2;254;245;229m⣿[0m[38;2;255;246;230m⣿[0m[38;2;255;246;230m⣿[0m[38;2;255;246;231m⣿[0m[38;2;255;255;243m⣷[0m[38;2;25;70;94m⣌[0m[38;2;100;205;254m⡛[0m[38;2;92;189;237m⠚[0m[38;2;101;212;255m⢁[0m[38;2;20;26;29m⣼[0m[38;2;255;253;238m⣿[0m[38;2;255;246;230m⣿[0m[38;2;255;254;238m⡏[0m[38;2;104;99;92m⠀[0m[38;2;215;206;191m⣿[0m[38;2;132;127;118m⣾[0m[38;2;254;250;233m⠃[0m[38;2;12;12;0m⠀[0m[38;2;1;1;2m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m
 | 
			
		||||
[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;70;70;1m⠈[0m[38;2;229;229;0m⢻[0m[38;2;229;229;0m⣿[0m[38;2;236;236;2m⡇[0m[38;2;123;118;121m⢸[0m[38;2;253;244;228m⣿[0m[38;2;255;246;230m⣿[0m[38;2;255;254;238m⣿[0m[38;2;121;120;114m⣾[0m[38;2;91;118;129m⣶[0m[38;2;226;237;232m⣿[0m[38;2;255;248;233m⣿[0m[38;2;255;246;230m⣿[0m[38;2;255;246;230m⣿[0m[38;2;255;246;230m⣿[0m[38;2;255;246;230m⣿[0m[38;2;255;246;230m⣿[0m[38;2;255;246;230m⣿[0m[38;2;255;246;230m⣿[0m[38;2;255;246;230m⣿[0m[38;2;255;246;230m⣿[0m[38;2;254;245;229m⣿[0m[38;2;255;251;236m⣿[0m[38;2;243;232;216m⣿[0m[38;2;255;255;241m⣿[0m[38;2;254;245;229m⣿[0m[38;2;255;246;230m⣿[0m[38;2;253;244;228m⡿[0m[38;2;151;146;136m⠠[0m[38;2;35;33;30m⠞[0m[38;2;255;254;235m⠋[0m[38;2;191;184;173m⠁[0m[38;2;32;33;0m⠀[0m[38;2;2;2;2m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m
 | 
			
		||||
[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;2;2;7m⠀[0m[38;2;219;219;0m⠙[0m[38;2;237;236;1m⢷[0m[38;2;35;34;23m⡈[0m[38;2;254;252;235m⢿[0m[38;2;255;246;230m⣿[0m[38;2;255;246;230m⣿[0m[38;2;255;246;230m⣿[0m[38;2;255;246;230m⣿[0m[38;2;255;246;230m⣿[0m[38;2;255;246;230m⣿[0m[38;2;255;246;230m⣿[0m[38;2;255;246;230m⣿[0m[38;2;255;246;230m⣿[0m[38;2;255;250;234m⣿[0m[38;2;223;216;201m⣿[0m[38;2;254;245;229m⣿[0m[38;2;255;246;230m⣿[0m[38;2;255;246;230m⣿[0m[38;2;255;246;230m⣿[0m[38;2;255;246;230m⣿[0m[38;2;255;246;230m⣿[0m[38;2;255;246;230m⣿[0m[38;2;255;246;230m⣿[0m[38;2;255;246;230m⣿[0m[38;2;254;245;229m⡿[0m[38;2;233;224;209m⠁[0m[38;2;32;33;0m⠀[0m[38;2;118;118;0m⠀[0m[38;2;184;184;2m⠀[0m[38;2;97;97;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m
 | 
			
		||||
[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;15;15;11m⢠[0m[38;2;214;214;0m⡁[0m[38;2;0;0;0m⢀[0m[38;2;253;248;230m⠙[0m[38;2;254;245;229m⢿[0m[38;2;255;246;230m⣿[0m[38;2;255;246;230m⣿[0m[38;2;255;246;230m⣿[0m[38;2;255;246;230m⣿[0m[38;2;255;247;230m⣿[0m[38;2;203;196;183m⣍[0m[38;2;255;255;243m⣛[0m[38;2;255;246;230m⠛[0m[38;2;255;246;230m⢛[0m[38;2;255;255;240m⣋[0m[38;2;255;246;230m⣩[0m[38;2;222;214;200m⣿[0m[38;2;255;246;230m⣿[0m[38;2;255;246;230m⣿[0m[38;2;255;246;230m⣿[0m[38;2;255;246;230m⣿[0m[38;2;255;246;230m⠿[0m[38;2;255;250;234m⠋[0m[38;2;118;113;111m⠀[0m[38;2;146;146;0m⠀[0m[38;2;182;182;0m⢀[0m[38;2;40;40;0m⠀[0m[38;2;63;63;2m⣆[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m
 | 
			
		||||
[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;18;18;0m⢸[0m[38;2;166;166;0m⠀[0m[38;2;84;84;0m⣸[0m[38;2;240;240;1m⣷[0m[38;2;27;27;2m⣤[0m[38;2;218;211;198m⡉[0m[38;2;255;255;239m⠛[0m[38;2;253;244;228m⠻[0m[38;2;254;245;229m⠿[0m[38;2;255;246;230m⣿[0m[38;2;255;246;230m⣿[0m[38;2;255;250;234m⣿[0m[38;2;255;255;243m⣿[0m[38;2;255;255;243m⣿[0m[38;2;255;252;235m⣿[0m[38;2;253;244;228m⡿[0m[38;2;255;246;230m⠿[0m[38;2;254;245;229m⠟[0m[38;2;255;247;231m⠛[0m[38;2;255;249;231m⠉[0m[38;2;92;89;85m⠀[0m[38;2;59;59;0m⠀[0m[38;2;183;183;2m⠀[0m[38;2;132;132;0m⡀[0m[38;2;38;38;0m⢰[0m[38;2;213;213;0m⣿[0m[38;2;80;80;0m⠀[0m[38;2;240;240;0m⣿[0m[38;2;85;85;0m⡀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m
 | 
			
		||||
[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;1;1;0m⠈[0m[38;2;96;96;0m⠀[0m[38;2;229;229;0m⣿[0m[38;2;228;228;0m⣿[0m[38;2;221;221;0m⢻[0m[38;2;222;222;0m⠃[0m[38;2;126;126;1m⠈[0m[38;2;162;162;2m⠀[0m[38;2;81;82;0m⠀[0m[38;2;71;69;64m⣶[0m[38;2;72;69;65m⣤[0m[38;2;132;128;120m⣤[0m[38;2;181;175;164m⣭[0m[38;2;229;221;207m⣭[0m[38;2;125;120;113m⣴[0m[38;2;76;73;68m⣶[0m[38;2;144;138;128m⣾[0m[38;2;112;107;104m⠀[0m[38;2;188;188;2m⠌[0m[38;2;115;115;0m⠀[0m[38;2;167;167;0m⢀[0m[38;2;50;50;0m⣴[0m[38;2;175;175;0m⡆[0m[38;2;208;208;0m⠃[0m[38;2;139;139;3m⣸[0m[38;2;203;203;0m⢿[0m[38;2;179;179;0m⡆[0m[38;2;180;180;0m⢸[0m[38;2;237;237;0m⣧[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m
 | 
			
		||||
[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⢀[0m[38;2;5;5;0m⠀[0m[38;2;241;241;0m⣿[0m[38;2;233;233;0m⡏[0m[38;2;119;119;0m⢸[0m[38;2;96;96;0m⠀[0m[38;2;192;192;0m⠃[0m[38;2;58;58;0m⠐[0m[38;2;141;141;0m⠀[0m[38;2;211;202;190m⣿[0m[38;2;231;222;205m⣿[0m[38;2;229;220;204m⣿[0m[38;2;229;220;204m⣿[0m[38;2;228;219;203m⣿[0m[38;2;229;220;204m⣿[0m[38;2;230;222;205m⣿[0m[38;2;236;229;218m⣿[0m[38;2;98;94;96m⠀[0m[38;2;119;119;2m⠀[0m[38;2;18;18;0m⠀[0m[38;2;200;200;1m⣿[0m[38;2;225;225;2m⣿[0m[38;2;187;187;43m⠁[0m[38;2;127;127;0m⠀[0m[38;2;213;213;0m⡇[0m[38;2;157;157;0m⢸[0m[38;2;218;218;0m⣇[0m[38;2;44;44;0m⠘[0m[38;2;227;227;0m⣿[0m[38;2;146;146;0m⡆[0m[38;2;1;1;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m
 | 
			
		||||
[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;1;1;0m⠀[0m[38;2;113;113;0m⣼[0m[38;2;36;36;0m⠀[0m[38;2;243;243;0m⣿[0m[38;2;232;232;0m⠇[0m[38;2;163;163;1m⡄[0m[38;2;29;29;22m⠀[0m[38;2;94;94;0m⠀[0m[38;2;182;182;1m⠀[0m[38;2;144;145;26m⠀[0m[38;2;218;210;193m⣿[0m[38;2;253;243;226m⣿[0m[38;2;255;245;227m⣿[0m[38;2;255;245;227m⣿[0m[38;2;255;245;227m⣿[0m[38;2;255;245;227m⣿[0m[38;2;255;245;227m⣿[0m[38;2;254;247;235m⣿[0m[38;2;110;107;103m⠀[0m[38;2;48;48;2m⣄[0m[38;2;114;114;1m⠀[0m[38;2;198;198;1m⣿[0m[38;2;225;225;3m⣿[0m[38;2;151;151;79m⠀[0m[38;2;39;39;3m⢀[0m[38;2;222;222;0m⣧[0m[38;2;82;82;0m⠈[0m[38;2;206;206;0m⣿[0m[38;2;58;58;0m⠀[0m[38;2;242;242;0m⢿[0m[38;2;236;236;0m⣷[0m[38;2;10;10;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m
 | 
			
		||||
[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;1;1;0m⠀[0m[38;2;31;31;0m⠈[0m[38;2;203;203;0m⣹[0m[38;2;40;40;0m⠀[0m[38;2;242;242;0m⣿[0m[38;2;150;150;0m⠀[0m[38;2;223;223;1m⡇[0m[38;2;24;24;24m⠠[0m[38;2;26;26;0m⢀[0m[38;2;1;2;0m⣴[0m[38;2;117;113;102m⣠[0m[38;2;255;253;236m⣿[0m[38;2;255;245;227m⣿[0m[38;2;255;245;227m⣿[0m[38;2;255;245;227m⣿[0m[38;2;255;245;227m⣿[0m[38;2;255;245;227m⣿[0m[38;2;255;245;227m⣿[0m[38;2;254;247;235m⣿[0m[38;2;220;214;203m⣷[0m[38;2;80;81;82m⣌[0m[38;2;117;117;122m⠀[0m[38;2;198;198;1m⣿[0m[38;2;228;228;24m⣿[0m[38;2;90;90;56m⠀[0m[38;2;69;69;5m⣸[0m[38;2;204;204;0m⣿[0m[38;2;81;81;0m⠀[0m[38;2;219;219;0m⢿[0m[38;2;210;210;0m⣇[0m[38;2;99;99;0m⠘[0m[38;2;226;226;0m⣿[0m[38;2;217;217;0m⣇[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m
 | 
			
		||||
[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⢀[0m[38;2;0;0;0m⠄[0m[38;2;96;96;0m⡠[0m[38;2;127;127;0m⠞[0m[38;2;207;207;1m⣋[0m[38;2;41;41;4m⠀[0m[38;2;247;247;0m⡿[0m[38;2;60;60;0m⠀[0m[38;2;173;173;0m⠀[0m[38;2;62;62;64m⣰[0m[38;2;251;244;226m⣿[0m[38;2;254;244;225m⣿[0m[38;2;255;249;230m⣿[0m[38;2;255;245;227m⣿[0m[38;2;255;245;227m⣿[0m[38;2;255;245;227m⣿[0m[38;2;255;245;227m⣿[0m[38;2;255;245;227m⣿[0m[38;2;255;245;227m⣿[0m[38;2;255;245;227m⣿[0m[38;2;255;248;236m⣿[0m[38;2;255;246;230m⣿[0m[38;2;251;241;223m⣿[0m[38;2;106;102;100m⠀[0m[38;2;221;221;2m⣿[0m[38;2;237;237;32m⡟[0m[38;2;13;13;18m⢠[0m[38;2;123;123;0m⣤[0m[38;2;189;189;1m⣈[0m[38;2;222;222;2m⣁[0m[38;2;151;151;1m⡈[0m[38;2;201;201;0m⠛[0m[38;2;140;140;0m⠂[0m[38;2;204;204;0m⠹[0m[38;2;225;225;0m⣿[0m[38;2;120;120;0m⡆[0m[38;2;1;1;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m
 | 
			
		||||
[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;2;2;0m⡠[0m[38;2;165;165;0m⢂[0m[38;2;22;22;0m⠔[0m[38;2;200;200;2m⣡[0m[38;2;157;157;170m⣾[0m[38;2;246;246;246m⡯[0m[38;2;14;14;29m⠀[0m[38;2;252;252;1m⡇[0m[38;2;35;35;0m⠀[0m[38;2;50;50;0m⢀[0m[38;2;206;198;182m⣿[0m[38;2;255;247;229m⣿[0m[38;2;255;245;227m⣿[0m[38;2;255;245;227m⣿[0m[38;2;255;245;227m⣿[0m[38;2;255;245;227m⣿[0m[38;2;255;245;227m⣿[0m[38;2;255;245;227m⣿[0m[38;2;255;245;227m⣿[0m[38;2;255;245;227m⣿[0m[38;2;255;245;227m⣿[0m[38;2;255;245;227m⣿[0m[38;2;255;245;227m⣿[0m[38;2;255;245;227m⣿[0m[38;2;58;56;55m⠀[0m[38;2;237;237;1m⣿[0m[38;2;246;246;15m⡇[0m[38;2;34;32;42m⢸[0m[38;2;254;247;228m⣿[0m[38;2;252;243;225m⣿[0m[38;2;253;243;226m⣿[0m[38;2;255;250;232m⣿[0m[38;2;255;255;234m⣿[0m[38;2;165;159;151m⣶[0m[38;2;4;4;5m⣦[0m[38;2;153;152;0m⣈[0m[38;2;226;226;0m⠛[0m[38;2;81;81;0m⣄[0m[38;2;1;1;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m
 | 
			
		||||
[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;1;1;0m⢀[0m[38;2;32;32;0m⠎[0m[38;2;120;120;0m⡠[0m[38;2;199;199;1m⢃[0m[38;2;27;27;20m⣼[0m[38;2;255;255;255m⣿[0m[38;2;253;253;253m⠟[0m[38;2;163;163;163m⣰[0m[38;2;29;28;29m⠀[0m[38;2;252;252;2m⡇[0m[38;2;47;47;2m⠀[0m[38;2;48;46;42m⢸[0m[38;2;205;197;182m⡿[0m[38;2;254;245;227m⠿[0m[38;2;253;243;225m⠛[0m[38;2;255;255;236m⣋[0m[38;2;255;250;231m⣉[0m[38;2;255;247;229m⣻[0m[38;2;253;243;225m⣿[0m[38;2;253;243;225m⣿[0m[38;2;255;245;227m⣿[0m[38;2;254;244;225m⣿[0m[38;2;253;243;225m⡿[0m[38;2;255;249;231m⢋[0m[38;2;155;149;138m⣤[0m[38;2;208;201;185m⡍[0m[38;2;41;40;21m⢰[0m[38;2;238;238;10m⣿[0m[38;2;222;221;1m⠃[0m[38;2;167;160;154m⣾[0m[38;2;252;242;224m⣿[0m[38;2;255;245;227m⣿[0m[38;2;255;245;227m⣿[0m[38;2;255;245;227m⣿[0m[38;2;255;245;227m⣿[0m[38;2;255;245;227m⣿[0m[38;2;255;246;231m⣿[0m[38;2;253;246;235m⣿[0m[38;2;241;236;220m⣷[0m[38;2;76;76;15m⡌[0m[38;2;130;130;0m⢆[0m[38;2;1;1;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m
 | 
			
		||||
[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⡰[0m[38;2;238;238;0m⢁[0m[38;2;19;19;0m⠜[0m[38;2;143;143;0m⣰[0m[38;2;231;231;232m⣿[0m[38;2;253;253;253m⣿[0m[38;2;255;255;255m⣿[0m[38;2;65;65;66m⣤[0m[38;2;255;255;247m⡙[0m[38;2;49;48;28m⠘[0m[38;2;246;246;2m⡇[0m[38;2;55;55;1m⠀[0m[38;2;144;138;136m⣼[0m[38;2;184;177;164m⣷[0m[38;2;152;146;135m⣾[0m[38;2;255;251;233m⣿[0m[38;2;255;250;232m⣿[0m[38;2;235;226;210m⣿[0m[38;2;227;219;202m⣿[0m[38;2;238;229;212m⣿[0m[38;2;253;243;225m⣿[0m[38;2;254;244;226m⣿[0m[38;2;252;242;224m⣿[0m[38;2;204;196;181m⣿[0m[38;2;233;225;208m⣿[0m[38;2;243;233;216m⣿[0m[38;2;254;254;234m⡇[0m[38;2;63;64;0m⢸[0m[38;2;226;226;0m⡿[0m[38;2;75;75;0m⠀[0m[38;2;245;235;215m⣿[0m[38;2;254;244;226m⣿[0m[38;2;255;245;227m⣿[0m[38;2;255;245;227m⣿[0m[38;2;255;245;227m⣿[0m[38;2;255;245;227m⣿[0m[38;2;255;245;227m⣿[0m[38;2;255;248;235m⣿[0m[38;2;255;252;245m⣿[0m[38;2;255;254;251m⣿[0m[38;2;254;255;242m⣿[0m[38;2;54;54;21m⠈[0m[38;2;220;220;0m⢧[0m[38;2;0;0;0m⡀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m
 | 
			
		||||
[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;1;1;0m⢀[0m[38;2;47;47;0m⡜[0m[38;2;165;165;0m⢠[0m[38;2;159;159;0m⠎[0m[38;2;49;49;0m⣰[0m[38;2;255;255;255m⣿[0m[38;2;255;255;255m⣿[0m[38;2;255;255;255m⣿[0m[38;2;254;254;254m⣿[0m[38;2;255;255;255m⣿[0m[38;2;255;255;255m⣿[0m[38;2;46;46;35m⠀[0m[38;2;246;246;3m⡇[0m[38;2;52;52;0m⠀[0m[38;2;217;208;197m⣉[0m[38;2;225;216;201m⣩[0m[38;2;190;183;168m⣥[0m[38;2;121;116;107m⣤[0m[38;2;73;70;64m⣤[0m[38;2;62;60;55m⡄[0m[38;2;95;91;84m⢠[0m[38;2;196;188;174m⣍[0m[38;2;255;255;238m⣙[0m[38;2;254;244;226m⠻[0m[38;2;253;243;225m⢿[0m[38;2;255;245;227m⣿[0m[38;2;255;245;227m⣿[0m[38;2;254;244;226m⣿[0m[38;2;250;240;222m⡇[0m[38;2;143;143;0m⢸[0m[38;2;241;241;1m⠇[0m[38;2;0;0;0m⢠[0m[38;2;255;255;239m⣿[0m[38;2;255;245;227m⣿[0m[38;2;255;245;227m⣿[0m[38;2;255;245;227m⣿[0m[38;2;255;245;227m⣿[0m[38;2;255;245;227m⣿[0m[38;2;255;245;227m⣿[0m[38;2;255;245;227m⣿[0m[38;2;255;247;234m⣿[0m[38;2;255;249;238m⣿[0m[38;2;252;245;233m⣿[0m[38;2;170;165;155m⡆[0m[38;2;24;24;21m⡄[0m[38;2;245;245;1m⢳[0m[38;2;20;20;0m⣄[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m
 | 
			
		||||
[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⢠[0m[38;2;173;173;0m⡞[0m[38;2;108;108;0m⢠[0m[38;2;210;210;0m⣿[0m[38;2;120;120;0m⢠[0m[38;2;255;255;255m⣿[0m[38;2;255;255;255m⣿[0m[38;2;255;255;255m⣿[0m[38;2;255;255;255m⣿[0m[38;2;255;255;255m⣿[0m[38;2;255;255;255m⣿[0m[38;2;255;255;255m⣿[0m[38;2;72;72;75m⠀[0m[38;2;254;254;4m⡇[0m[38;2;41;41;0m⠀[0m[38;2;233;233;235m⣿[0m[38;2;239;239;239m⣿[0m[38;2;254;254;254m⣿[0m[38;2;255;255;255m⣿[0m[38;2;255;255;255m⣿[0m[38;2;255;255;255m⡇[0m[38;2;84;84;84m⢸[0m[38;2;231;231;231m⣿[0m[38;2;233;233;233m⣿[0m[38;2;246;246;246m⣿[0m[38;2;73;71;69m⡘[0m[38;2;254;245;227m⣿[0m[38;2;255;245;227m⣿[0m[38;2;253;243;225m⣿[0m[38;2;194;186;177m⠃[0m[38;2;200;200;0m⡿[0m[38;2;130;130;1m⠀[0m[38;2;42;40;35m⢸[0m[38;2;255;250;231m⣿[0m[38;2;255;245;227m⡿[0m[38;2;254;244;226m⠿[0m[38;2;252;243;225m⠛[0m[38;2;253;243;225m⠛[0m[38;2;253;243;225m⠛[0m[38;2;253;243;225m⠿[0m[38;2;253;243;225m⠛[0m[38;2;255;245;227m⢛[0m[38;2;255;255;236m⣋[0m[38;2;255;255;238m⣉[0m[38;2;168;161;148m⣀[0m[38;2;255;255;255m⣿[0m[38;2;17;17;7m⠀[0m[38;2;234;234;0m⣿[0m[38;2;192;192;0m⣧[0m[38;2;0;0;0m⡀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m
 | 
			
		||||
    ";
 | 
			
		||||
 | 
			
		||||
    let mut sys = System::new_all();
 | 
			
		||||
    sys.refresh_all();
 | 
			
		||||
 | 
			
		||||
    let s = x.to_string();
 | 
			
		||||
    match &*s {
 | 
			
		||||
        "logo" => println!("{}", logo),
 | 
			
		||||
        "color" => println!("{}", color),
 | 
			
		||||
        "avatar" => println!("{}", avatar),
 | 
			
		||||
        "avatar_color" => println!("{}", avatar_color),
 | 
			
		||||
        "os" => println!("{}\n\t", color),
 | 
			
		||||
        _ => println!("not matched"),
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    println!("total memory: {} bytes", sys.total_memory());
 | 
			
		||||
    println!("System name:             {:?}", System::name().unwrap());
 | 
			
		||||
    println!(
 | 
			
		||||
        "System kernel version:   {:?}",
 | 
			
		||||
        System::kernel_version().unwrap()
 | 
			
		||||
    );
 | 
			
		||||
    //println!("System OS version:       {:?}", System::os_version().unwrap());
 | 
			
		||||
    println!(
 | 
			
		||||
        "System host name:        {:?}",
 | 
			
		||||
        System::host_name().unwrap()
 | 
			
		||||
    );
 | 
			
		||||
    println!("NB CPUs: {}", sys.cpus().len());
 | 
			
		||||
 | 
			
		||||
    //let disks = Disks::new_with_refreshed_list();
 | 
			
		||||
    //for disk in &disks {
 | 
			
		||||
    //    println!("{disk:?}");
 | 
			
		||||
    //}
 | 
			
		||||
 | 
			
		||||
    //let networks = Networks::new_with_refreshed_list();
 | 
			
		||||
    //println!("=> networks:");
 | 
			
		||||
    //for (interface_name, data) in &networks {
 | 
			
		||||
    //    println!("{interface_name}: {}/{} B", data.received(), data.transmitted());
 | 
			
		||||
    //}
 | 
			
		||||
 | 
			
		||||
    //let components = Components::new_with_refreshed_list();
 | 
			
		||||
    //println!("=> components:");
 | 
			
		||||
    //for component in &components {
 | 
			
		||||
    //    println!("{component:?}");
 | 
			
		||||
    //}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										364
									
								
								src/bot.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										364
									
								
								src/bot.rs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,364 @@
 | 
			
		||||
use seahorse::Context;
 | 
			
		||||
use std::process::Command;
 | 
			
		||||
 | 
			
		||||
use crate::notify;
 | 
			
		||||
use crate::notify_read;
 | 
			
		||||
use crate::openai;
 | 
			
		||||
use crate::refresh;
 | 
			
		||||
use crate::reply;
 | 
			
		||||
use crate::reply_link;
 | 
			
		||||
 | 
			
		||||
use crate::data::c_char;
 | 
			
		||||
use crate::data::data_scpt;
 | 
			
		||||
use crate::data::log_file;
 | 
			
		||||
use crate::data::w_cid;
 | 
			
		||||
use crate::data::Notify;
 | 
			
		||||
 | 
			
		||||
pub fn c_bot(c: &Context) {
 | 
			
		||||
    let h = async {
 | 
			
		||||
        let mut notify = notify::get_request(100).await;
 | 
			
		||||
        if notify == "err" {
 | 
			
		||||
            refresh(c);
 | 
			
		||||
            notify = notify::get_request(100).await;
 | 
			
		||||
        }
 | 
			
		||||
        let notify: Notify = serde_json::from_str(¬ify).unwrap();
 | 
			
		||||
 | 
			
		||||
        let n = notify.notifications;
 | 
			
		||||
        let length = &n.len();
 | 
			
		||||
        let su = 0..*length;
 | 
			
		||||
        for i in su {
 | 
			
		||||
            let reason = &n[i].reason;
 | 
			
		||||
            let handle = &n[i].author.handle;
 | 
			
		||||
            let did = &n[i].author.did;
 | 
			
		||||
            let read = n[i].isRead;
 | 
			
		||||
            let cid = &n[i].cid;
 | 
			
		||||
            let uri = &n[i].uri;
 | 
			
		||||
            let time = &n[i].indexedAt;
 | 
			
		||||
            let mut cid_root = cid;
 | 
			
		||||
            let mut uri_root = uri;
 | 
			
		||||
            let check_cid = w_cid(cid.to_string(), log_file(&"n1"), false);
 | 
			
		||||
            let check_cid_run = w_cid(cid.to_string(), log_file(&"n2"), false);
 | 
			
		||||
            // thread
 | 
			
		||||
            if !n[i].record.reply.is_none() {
 | 
			
		||||
                cid_root = &n[i].record.reply.as_ref().unwrap().root.cid;
 | 
			
		||||
                uri_root = &n[i].record.reply.as_ref().unwrap().root.uri;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            let mut text = "";
 | 
			
		||||
            if !n[i].record.text.is_none() {
 | 
			
		||||
                text = &n[i].record.text.as_ref().unwrap();
 | 
			
		||||
            }
 | 
			
		||||
            let vec: Vec<&str> = text.split_whitespace().collect();
 | 
			
		||||
            let handlev: Vec<&str> = handle.split('.').collect();
 | 
			
		||||
            let mut handlev = handlev[0].trim().to_string();
 | 
			
		||||
 | 
			
		||||
            let mut link = "https://card.syui.ai/".to_owned() + &handlev;
 | 
			
		||||
            let s = 0;
 | 
			
		||||
            let mut e = link.chars().count();
 | 
			
		||||
 | 
			
		||||
            let mut com = "".to_string();
 | 
			
		||||
            let mut prompt = "".to_string();
 | 
			
		||||
            let mut prompt_sub = "".to_string();
 | 
			
		||||
            let mut prompt_chat = "".to_string();
 | 
			
		||||
            if reason == "mention" {
 | 
			
		||||
                com = vec[1].trim().to_string();
 | 
			
		||||
                prompt = vec[2..].join(" ");
 | 
			
		||||
                prompt_chat = vec[1..].join(" ");
 | 
			
		||||
                if vec.len() > 2 {
 | 
			
		||||
                    prompt_sub = vec[3..].join(" ");
 | 
			
		||||
                }
 | 
			
		||||
            } else if reason == "reply" {
 | 
			
		||||
                com = vec[0].trim().to_string();
 | 
			
		||||
                prompt = vec[1..].join(" ");
 | 
			
		||||
                prompt_chat = vec[0..].join(" ");
 | 
			
		||||
                if vec.len() > 1 {
 | 
			
		||||
                    prompt_sub = vec[2..].join(" ");
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            if prompt.is_empty() == false || com.is_empty() == false {
 | 
			
		||||
                println!("{}", read);
 | 
			
		||||
                println!("{}", handle);
 | 
			
		||||
                println!(
 | 
			
		||||
                    "cid:{}\nuri:{}\ncid_root:{}\nuri_root:{}",
 | 
			
		||||
                    cid, uri, cid_root, uri_root
 | 
			
		||||
                );
 | 
			
		||||
                println!("reason:{}\ncom:{}\nprompt:{}", reason, com, prompt);
 | 
			
		||||
                println!("prompt_sub:{}", prompt_sub);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            let mut admin = "".to_string();
 | 
			
		||||
            if c.string_flag("admin").is_ok() {
 | 
			
		||||
                admin = c.string_flag("admin").unwrap();
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            if check_cid == false && { reason == "mention" || reason == "reply" }
 | 
			
		||||
                || check_cid_run == false && { reason == "mention" || reason == "reply" }
 | 
			
		||||
            {
 | 
			
		||||
                w_cid(cid.to_string(), log_file(&"n2"), true);
 | 
			
		||||
                if com == "/did" || com == "did" {
 | 
			
		||||
                    let link = "https://plc.directory/".to_owned() + &did + &"/log";
 | 
			
		||||
                    let s = 0;
 | 
			
		||||
                    let e = link.chars().count();
 | 
			
		||||
                    let d = "\n".to_owned() + &did.to_string();
 | 
			
		||||
                    let text_limit = c_char(d);
 | 
			
		||||
                    if text_limit.len() > 3 {
 | 
			
		||||
                        let str_rep = reply_link::post_request(
 | 
			
		||||
                            text_limit.to_string(),
 | 
			
		||||
                            link.to_string(),
 | 
			
		||||
                            s,
 | 
			
		||||
                            e.try_into().unwrap(),
 | 
			
		||||
                            cid.to_string(),
 | 
			
		||||
                            uri.to_string(),
 | 
			
		||||
                            cid_root.to_string(),
 | 
			
		||||
                            uri_root.to_string(),
 | 
			
		||||
                        )
 | 
			
		||||
                        .await;
 | 
			
		||||
                        w_cid(cid.to_string(), log_file(&"n1"), true);
 | 
			
		||||
                        println!("{}", str_rep);
 | 
			
		||||
                    }
 | 
			
		||||
                } else if com == "/diffusers" || com == "diffusers" {
 | 
			
		||||
                    let _output = Command::new(data_scpt(&"diffusers"))
 | 
			
		||||
                        .arg(&did)
 | 
			
		||||
                        .arg(&prompt)
 | 
			
		||||
                        .output()
 | 
			
		||||
                        .expect("zsh");
 | 
			
		||||
                    let _output = Command::new(data_scpt(&"diffusers_img"))
 | 
			
		||||
                        .arg(&cid)
 | 
			
		||||
                        .arg(&uri)
 | 
			
		||||
                        .output()
 | 
			
		||||
                        .expect("zsh");
 | 
			
		||||
                    w_cid(cid.to_string(), log_file(&"n1"), true);
 | 
			
		||||
                } else if com.contains("占") == true
 | 
			
		||||
                    || com.contains("うらない") == true
 | 
			
		||||
                    || com.contains("うらなって") == true
 | 
			
		||||
                {
 | 
			
		||||
                    let output = Command::new(data_scpt(&"card_fortune"))
 | 
			
		||||
                        .arg(&handle)
 | 
			
		||||
                        .arg(&did)
 | 
			
		||||
                        .arg(&cid)
 | 
			
		||||
                        .arg(&uri)
 | 
			
		||||
                        .output()
 | 
			
		||||
                        .expect("zsh");
 | 
			
		||||
                    let d = String::from_utf8_lossy(&output.stdout);
 | 
			
		||||
                    let d = d.to_string();
 | 
			
		||||
                    let text_limit = c_char(d);
 | 
			
		||||
                    if text_limit.len() > 3 {
 | 
			
		||||
                        println!("{}", text_limit);
 | 
			
		||||
                        w_cid(cid.to_string(), log_file(&"n1"), true);
 | 
			
		||||
                    }
 | 
			
		||||
                } else if com == "/card" || com == "card" {
 | 
			
		||||
                    let output = Command::new(data_scpt(&"api_card"))
 | 
			
		||||
                        .arg(&handle)
 | 
			
		||||
                        .arg(&did)
 | 
			
		||||
                        .arg(&prompt)
 | 
			
		||||
                        .output()
 | 
			
		||||
                        .expect("zsh");
 | 
			
		||||
                    let d = String::from_utf8_lossy(&output.stdout);
 | 
			
		||||
                    let dd = "\n".to_owned() + &d.to_string();
 | 
			
		||||
                    let text_limit = c_char(dd);
 | 
			
		||||
                    if text_limit.len() > 3 {
 | 
			
		||||
                        if d.contains("handle") == false {
 | 
			
		||||
                            let str_rep = reply_link::post_request(
 | 
			
		||||
                                text_limit.to_string(),
 | 
			
		||||
                                link.to_string(),
 | 
			
		||||
                                s,
 | 
			
		||||
                                e.try_into().unwrap(),
 | 
			
		||||
                                cid.to_string(),
 | 
			
		||||
                                uri.to_string(),
 | 
			
		||||
                                cid_root.to_string(),
 | 
			
		||||
                                uri_root.to_string(),
 | 
			
		||||
                            )
 | 
			
		||||
                            .await;
 | 
			
		||||
                            println!("{}", str_rep);
 | 
			
		||||
                        } else {
 | 
			
		||||
                            handlev = handle.replace(".", "-").to_string();
 | 
			
		||||
                            link = "https://card.syui.ai/".to_owned() + &handlev;
 | 
			
		||||
                            e = link.chars().count();
 | 
			
		||||
                            let str_rep = reply_link::post_request(
 | 
			
		||||
                                d.to_string(),
 | 
			
		||||
                                link.to_string(),
 | 
			
		||||
                                s,
 | 
			
		||||
                                e.try_into().unwrap(),
 | 
			
		||||
                                cid.to_string(),
 | 
			
		||||
                                uri.to_string(),
 | 
			
		||||
                                cid_root.to_string(),
 | 
			
		||||
                                uri_root.to_string(),
 | 
			
		||||
                            )
 | 
			
		||||
                            .await;
 | 
			
		||||
                            println!("{}", str_rep);
 | 
			
		||||
                        }
 | 
			
		||||
                        w_cid(cid.to_string(), log_file(&"n1"), true);
 | 
			
		||||
                    }
 | 
			
		||||
                } else if com == "/fav" || com == "fav" {
 | 
			
		||||
                    let output = Command::new(data_scpt(&"api_fav"))
 | 
			
		||||
                        .arg(&handle)
 | 
			
		||||
                        .arg(&did)
 | 
			
		||||
                        .arg(&prompt)
 | 
			
		||||
                        .output()
 | 
			
		||||
                        .expect("zsh");
 | 
			
		||||
                    let d = String::from_utf8_lossy(&output.stdout);
 | 
			
		||||
                    let dd = "\n".to_owned() + &d.to_string();
 | 
			
		||||
                    let text_limit = c_char(dd);
 | 
			
		||||
                    if text_limit.len() > 3 {
 | 
			
		||||
                        let str_rep = reply_link::post_request(
 | 
			
		||||
                            d.to_string(),
 | 
			
		||||
                            link.to_string(),
 | 
			
		||||
                            s,
 | 
			
		||||
                            e.try_into().unwrap(),
 | 
			
		||||
                            cid.to_string(),
 | 
			
		||||
                            uri.to_string(),
 | 
			
		||||
                            cid_root.to_string(),
 | 
			
		||||
                            uri_root.to_string(),
 | 
			
		||||
                        )
 | 
			
		||||
                        .await;
 | 
			
		||||
                        println!("{}", str_rep);
 | 
			
		||||
                        w_cid(cid.to_string(), log_file(&"n1"), true);
 | 
			
		||||
                    }
 | 
			
		||||
                } else if com == "/egg" || com == "egg" {
 | 
			
		||||
                    let output = Command::new(data_scpt(&"api_egg"))
 | 
			
		||||
                        .arg(&handle)
 | 
			
		||||
                        .arg(&did)
 | 
			
		||||
                        .arg(&prompt)
 | 
			
		||||
                        .output()
 | 
			
		||||
                        .expect("zsh");
 | 
			
		||||
                    let d = String::from_utf8_lossy(&output.stdout);
 | 
			
		||||
                    let dd = "\n".to_owned() + &d.to_string();
 | 
			
		||||
                    let text_limit = c_char(dd);
 | 
			
		||||
                    if text_limit.len() > 3 {
 | 
			
		||||
                        let str_rep = reply_link::post_request(
 | 
			
		||||
                            d.to_string(),
 | 
			
		||||
                            link.to_string(),
 | 
			
		||||
                            s,
 | 
			
		||||
                            e.try_into().unwrap(),
 | 
			
		||||
                            cid.to_string(),
 | 
			
		||||
                            uri.to_string(),
 | 
			
		||||
                            cid_root.to_string(),
 | 
			
		||||
                            uri_root.to_string(),
 | 
			
		||||
                        )
 | 
			
		||||
                        .await;
 | 
			
		||||
                        println!("{}", str_rep);
 | 
			
		||||
                        w_cid(cid.to_string(), log_file(&"n1"), true);
 | 
			
		||||
                    }
 | 
			
		||||
                } else if com == "/nyan" || com == "nyan" {
 | 
			
		||||
                    let output = Command::new(data_scpt(&"nyancat"))
 | 
			
		||||
                        .arg(&handle)
 | 
			
		||||
                        .arg(&did)
 | 
			
		||||
                        .arg(&cid)
 | 
			
		||||
                        .arg(&uri)
 | 
			
		||||
                        .arg(&prompt)
 | 
			
		||||
                        .output()
 | 
			
		||||
                        .expect("zsh");
 | 
			
		||||
                    let d = String::from_utf8_lossy(&output.stdout);
 | 
			
		||||
                    let dd = "\n".to_owned() + &d.to_string();
 | 
			
		||||
                    let text_limit = c_char(dd);
 | 
			
		||||
                    println!("{}", text_limit);
 | 
			
		||||
                    if text_limit.len() > 3 {
 | 
			
		||||
                        let str_rep = reply::post_request(
 | 
			
		||||
                            text_limit.to_string(),
 | 
			
		||||
                            cid.to_string(),
 | 
			
		||||
                            uri.to_string(),
 | 
			
		||||
                            cid_root.to_string(),
 | 
			
		||||
                            uri_root.to_string(),
 | 
			
		||||
                        )
 | 
			
		||||
                        .await;
 | 
			
		||||
                        println!("{}", str_rep);
 | 
			
		||||
                        w_cid(cid.to_string(), log_file(&"n1"), true);
 | 
			
		||||
                    }
 | 
			
		||||
                } else if com == "/ten" || com == "ten" {
 | 
			
		||||
                    let output = Command::new(data_scpt(&"api_ten"))
 | 
			
		||||
                        .arg(&handle)
 | 
			
		||||
                        .arg(&did)
 | 
			
		||||
                        .arg(&cid)
 | 
			
		||||
                        .arg(&uri)
 | 
			
		||||
                        .arg(&prompt)
 | 
			
		||||
                        .arg(&prompt_sub)
 | 
			
		||||
                        .output()
 | 
			
		||||
                        .expect("zsh");
 | 
			
		||||
                    let d = String::from_utf8_lossy(&output.stdout);
 | 
			
		||||
                    let d = "\n".to_owned() + &d.to_string();
 | 
			
		||||
                    let text_limit = c_char(d);
 | 
			
		||||
                    if text_limit.len() > 3 {
 | 
			
		||||
                        let str_rep = reply_link::post_request(
 | 
			
		||||
                            text_limit.to_string(),
 | 
			
		||||
                            link.to_string(),
 | 
			
		||||
                            s,
 | 
			
		||||
                            e.try_into().unwrap(),
 | 
			
		||||
                            cid.to_string(),
 | 
			
		||||
                            uri.to_string(),
 | 
			
		||||
                            cid_root.to_string(),
 | 
			
		||||
                            uri_root.to_string(),
 | 
			
		||||
                        )
 | 
			
		||||
                        .await;
 | 
			
		||||
                        println!("{}", str_rep);
 | 
			
		||||
                        w_cid(cid.to_string(), log_file(&"n1"), true);
 | 
			
		||||
                    }
 | 
			
		||||
                } else if { com == "sh" || com == "/sh" } && handle == &admin {
 | 
			
		||||
                    println!("admin:{}", admin);
 | 
			
		||||
                    let output = Command::new(data_scpt(&"arch"))
 | 
			
		||||
                        .arg(&prompt)
 | 
			
		||||
                        .output()
 | 
			
		||||
                        .expect("zsh");
 | 
			
		||||
                    let d = String::from_utf8_lossy(&output.stdout);
 | 
			
		||||
                    let d = d.to_string();
 | 
			
		||||
                    let text_limit = c_char(d);
 | 
			
		||||
                    let str_rep = reply::post_request(
 | 
			
		||||
                        text_limit.to_string(),
 | 
			
		||||
                        cid.to_string(),
 | 
			
		||||
                        uri.to_string(),
 | 
			
		||||
                        cid_root.to_string(),
 | 
			
		||||
                        uri_root.to_string(),
 | 
			
		||||
                    )
 | 
			
		||||
                    .await;
 | 
			
		||||
                    println!("{}", str_rep);
 | 
			
		||||
                    w_cid(cid.to_string(), log_file(&"n1"), true);
 | 
			
		||||
                } else if { com == "mitractl" || com == "/mitractl" } && handle == &admin {
 | 
			
		||||
                    println!("admin:{}", admin);
 | 
			
		||||
                    let output = Command::new(data_scpt(&"mitractl"))
 | 
			
		||||
                        .arg(&prompt)
 | 
			
		||||
                        .output()
 | 
			
		||||
                        .expect("zsh");
 | 
			
		||||
                    let d = String::from_utf8_lossy(&output.stdout);
 | 
			
		||||
                    let d = "\n".to_owned() + &d.to_string();
 | 
			
		||||
                    let text_limit = c_char(d);
 | 
			
		||||
                    link = "https://m.syu.is".to_string();
 | 
			
		||||
                    e = link.chars().count();
 | 
			
		||||
                    if text_limit.len() > 3 {
 | 
			
		||||
                        let str_rep = reply_link::post_request(
 | 
			
		||||
                            text_limit.to_string(),
 | 
			
		||||
                            link.to_string(),
 | 
			
		||||
                            s,
 | 
			
		||||
                            e.try_into().unwrap(),
 | 
			
		||||
                            cid.to_string(),
 | 
			
		||||
                            uri.to_string(),
 | 
			
		||||
                            cid_root.to_string(),
 | 
			
		||||
                            uri_root.to_string(),
 | 
			
		||||
                        )
 | 
			
		||||
                        .await;
 | 
			
		||||
                        println!("{}", str_rep);
 | 
			
		||||
                        w_cid(cid.to_string(), log_file(&"n1"), true);
 | 
			
		||||
                    }
 | 
			
		||||
                } else {
 | 
			
		||||
                    // openai
 | 
			
		||||
                    let str_openai = openai::post_request(prompt_chat.to_string()).await;
 | 
			
		||||
                    let text_limit = c_char(str_openai);
 | 
			
		||||
                    let str_rep = reply::post_request(
 | 
			
		||||
                        text_limit.to_string(),
 | 
			
		||||
                        cid.to_string(),
 | 
			
		||||
                        uri.to_string(),
 | 
			
		||||
                        cid_root.to_string(),
 | 
			
		||||
                        uri_root.to_string(),
 | 
			
		||||
                    )
 | 
			
		||||
                    .await;
 | 
			
		||||
                    println!("{}", str_rep);
 | 
			
		||||
                    w_cid(cid.to_string(), log_file(&"n1"), true);
 | 
			
		||||
                }
 | 
			
		||||
                let str_notify = notify_read::post_request(time.to_string()).await;
 | 
			
		||||
                println!("{}", str_notify);
 | 
			
		||||
                println!("---");
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    };
 | 
			
		||||
    let res = tokio::runtime::Runtime::new().unwrap().block_on(h);
 | 
			
		||||
    return res;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										647
									
								
								src/data.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										647
									
								
								src/data.rs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,647 @@
 | 
			
		||||
use config::{Config, ConfigError, File};
 | 
			
		||||
use seahorse::Context;
 | 
			
		||||
use serde_derive::{Deserialize, Serialize};
 | 
			
		||||
use std::fs;
 | 
			
		||||
use std::fs::OpenOptions;
 | 
			
		||||
use std::io::Read;
 | 
			
		||||
use std::io::Write;
 | 
			
		||||
use std::path::Path;
 | 
			
		||||
 | 
			
		||||
pub fn data_file(s: &str) -> String {
 | 
			
		||||
    let file = "/.config/ai/";
 | 
			
		||||
    let mut f = shellexpand::tilde("~").to_string();
 | 
			
		||||
    f.push_str(&file);
 | 
			
		||||
    let path = Path::new(&f);
 | 
			
		||||
    if path.is_dir() == false {
 | 
			
		||||
        let _ = fs::create_dir_all(f.clone());
 | 
			
		||||
    }
 | 
			
		||||
    match &*s {
 | 
			
		||||
        "toml" => f + &"token.toml",
 | 
			
		||||
        "json" => f + &"token.json",
 | 
			
		||||
        "refresh" => f + &"refresh.toml",
 | 
			
		||||
        _ => f + &"." + &s,
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
pub fn log_file(s: &str) -> String {
 | 
			
		||||
    let file = "/.config/ai/txt/";
 | 
			
		||||
    let mut f = shellexpand::tilde("~").to_string();
 | 
			
		||||
    f.push_str(&file);
 | 
			
		||||
    let path = Path::new(&f);
 | 
			
		||||
    if path.is_dir() == false {
 | 
			
		||||
        let _ = fs::create_dir_all(f.clone());
 | 
			
		||||
    }
 | 
			
		||||
    match &*s {
 | 
			
		||||
        "n1" => f + &"notify_cid.txt",
 | 
			
		||||
        "n2" => f + &"notify_cid_run.txt",
 | 
			
		||||
        _ => f + &s,
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl Token {
 | 
			
		||||
    pub fn new() -> Result<Self, ConfigError> {
 | 
			
		||||
        let d = data_file("json");
 | 
			
		||||
        let s = Config::builder()
 | 
			
		||||
            .add_source(File::with_name(&d))
 | 
			
		||||
            .add_source(config::Environment::with_prefix("APP"))
 | 
			
		||||
            .build()?;
 | 
			
		||||
        s.try_deserialize()
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl Data {
 | 
			
		||||
    pub fn new() -> Result<Self, ConfigError> {
 | 
			
		||||
        let d = data_file("toml");
 | 
			
		||||
        let s = Config::builder()
 | 
			
		||||
            .add_source(File::with_name(&d))
 | 
			
		||||
            .add_source(config::Environment::with_prefix("APP"))
 | 
			
		||||
            .build()?;
 | 
			
		||||
        s.try_deserialize()
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl Refresh {
 | 
			
		||||
    pub fn new() -> Result<Self, ConfigError> {
 | 
			
		||||
        let d = data_file("refresh");
 | 
			
		||||
        let s = Config::builder()
 | 
			
		||||
            .add_source(File::with_name(&d))
 | 
			
		||||
            .add_source(config::Environment::with_prefix("APP"))
 | 
			
		||||
            .build()?;
 | 
			
		||||
        s.try_deserialize()
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[derive(Debug, Serialize, Deserialize)]
 | 
			
		||||
#[allow(non_snake_case)]
 | 
			
		||||
pub struct Token {
 | 
			
		||||
    pub did: String,
 | 
			
		||||
    pub handle: String,
 | 
			
		||||
    pub accessJwt: String,
 | 
			
		||||
    pub refreshJwt: String,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[derive(Debug, Serialize, Deserialize)]
 | 
			
		||||
#[allow(non_snake_case)]
 | 
			
		||||
pub struct Data {
 | 
			
		||||
    pub host: String,
 | 
			
		||||
    pub password: String,
 | 
			
		||||
    pub did: String,
 | 
			
		||||
    pub handle: String,
 | 
			
		||||
    pub access: String,
 | 
			
		||||
    pub refresh: String,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[derive(Debug, Serialize, Deserialize)]
 | 
			
		||||
#[allow(non_snake_case)]
 | 
			
		||||
pub struct Refresh {
 | 
			
		||||
    pub access: String,
 | 
			
		||||
    pub refresh: String,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[derive(Debug, Serialize, Deserialize)]
 | 
			
		||||
pub struct BaseUrl {
 | 
			
		||||
    pub profile_get: String,
 | 
			
		||||
    pub thread_get: String,
 | 
			
		||||
    pub describe: String,
 | 
			
		||||
    pub record_list: String,
 | 
			
		||||
    pub record_create: String,
 | 
			
		||||
    pub record_delete: String,
 | 
			
		||||
    pub session_create: String,
 | 
			
		||||
    pub session_refresh: String,
 | 
			
		||||
    pub session_get: String,
 | 
			
		||||
    pub timeline_get: String,
 | 
			
		||||
    pub timeline_author: String,
 | 
			
		||||
    pub upload_blob: String,
 | 
			
		||||
    pub update_handle: String,
 | 
			
		||||
    pub account_create: String,
 | 
			
		||||
    pub notify_count: String,
 | 
			
		||||
    pub notify_list: String,
 | 
			
		||||
    pub notify_update: String,
 | 
			
		||||
    pub repo_update: String,
 | 
			
		||||
    pub like: String,
 | 
			
		||||
    pub repost: String,
 | 
			
		||||
    pub follow: String,
 | 
			
		||||
    pub follows: String,
 | 
			
		||||
    pub followers: String,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
pub fn url(s: &str) -> String {
 | 
			
		||||
    let s = String::from(s);
 | 
			
		||||
    let data = Data::new().unwrap();
 | 
			
		||||
    let data = Data {
 | 
			
		||||
        host: data.host,
 | 
			
		||||
        password: data.password,
 | 
			
		||||
        handle: data.handle,
 | 
			
		||||
        did: data.did,
 | 
			
		||||
        access: data.access,
 | 
			
		||||
        refresh: data.refresh,
 | 
			
		||||
    };
 | 
			
		||||
    let t = "https://".to_string() + &data.host.to_string() + &"/xrpc/".to_string();
 | 
			
		||||
    let baseurl = BaseUrl {
 | 
			
		||||
        profile_get: "com.atproto.identity.resolveHandle".to_string(),
 | 
			
		||||
        thread_get: "app.bsky.feed.getPostThread".to_string(),
 | 
			
		||||
        record_create: "com.atproto.repo.createRecord".to_string(),
 | 
			
		||||
        record_delete: "com.atproto.repo.deleteRecord".to_string(),
 | 
			
		||||
        describe: "com.atproto.repo.describeRepo".to_string(),
 | 
			
		||||
        record_list: "com.atproto.repo.listRecords".to_string(),
 | 
			
		||||
        session_create: "com.atproto.server.createSession".to_string(),
 | 
			
		||||
        session_refresh: "com.atproto.server.refreshSession".to_string(),
 | 
			
		||||
        session_get: "com.atproto.server.getSession".to_string(),
 | 
			
		||||
        timeline_get: "app.bsky.feed.getTimeline".to_string(),
 | 
			
		||||
        timeline_author: "app.bsky.feed.getAuthorFeed".to_string(),
 | 
			
		||||
        like: "app.bsky.feed.like".to_string(),
 | 
			
		||||
        repost: "app.bsky.feed.repost".to_string(),
 | 
			
		||||
        follow: "app.bsky.graph.follow".to_string(),
 | 
			
		||||
        follows: "app.bsky.graph.getFollows".to_string(),
 | 
			
		||||
        followers: "app.bsky.graph.getFollowers".to_string(),
 | 
			
		||||
        upload_blob: "com.atproto.repo.uploadBlob".to_string(),
 | 
			
		||||
        account_create: "com.atproto.server.createAccount".to_string(),
 | 
			
		||||
        update_handle: "com.atproto.identity.updateHandle".to_string(),
 | 
			
		||||
        notify_count: "app.bsky.notification.getUnreadCount".to_string(),
 | 
			
		||||
        notify_list: "app.bsky.notification.listNotifications".to_string(),
 | 
			
		||||
        notify_update: "app.bsky.notification.updateSeen".to_string(),
 | 
			
		||||
        repo_update: "com.atproto.sync.updateRepo".to_string(),
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    match &*s {
 | 
			
		||||
        "profile_get" => t.to_string() + &baseurl.profile_get,
 | 
			
		||||
        "thread_get" => t.to_string() + &baseurl.thread_get,
 | 
			
		||||
        "describe" => t.to_string() + &baseurl.describe,
 | 
			
		||||
        "record_list" => t.to_string() + &baseurl.record_list,
 | 
			
		||||
        "record_create" => t.to_string() + &baseurl.record_create,
 | 
			
		||||
        "record_delete" => t.to_string() + &baseurl.record_delete,
 | 
			
		||||
        "session_create" => t.to_string() + &baseurl.session_create,
 | 
			
		||||
        "session_refresh" => t.to_string() + &baseurl.session_refresh,
 | 
			
		||||
        "session_get" => t.to_string() + &baseurl.session_get,
 | 
			
		||||
        "timeline_get" => t.to_string() + &baseurl.timeline_get,
 | 
			
		||||
        "timeline_author" => t.to_string() + &baseurl.timeline_get,
 | 
			
		||||
        "upload_blob" => t.to_string() + &baseurl.upload_blob,
 | 
			
		||||
        "account_create" => t.to_string() + &baseurl.account_create,
 | 
			
		||||
        "update_handle" => t.to_string() + &baseurl.update_handle,
 | 
			
		||||
        "notify_list" => t.to_string() + &baseurl.notify_list,
 | 
			
		||||
        "notify_count" => t.to_string() + &baseurl.notify_count,
 | 
			
		||||
        "notify_update" => t.to_string() + &baseurl.notify_update,
 | 
			
		||||
        "repo_update" => t.to_string() + &baseurl.repo_update,
 | 
			
		||||
        "like" => t.to_string() + &baseurl.like,
 | 
			
		||||
        "repost" => t.to_string() + &baseurl.repost,
 | 
			
		||||
        "follow" => t.to_string() + &baseurl.follow,
 | 
			
		||||
        "follows" => t.to_string() + &baseurl.follows,
 | 
			
		||||
        "followers" => t.to_string() + &baseurl.followers,
 | 
			
		||||
        _ => s,
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
pub fn data_toml(s: &str) -> String {
 | 
			
		||||
    let s = String::from(s);
 | 
			
		||||
    let data = Data::new().unwrap();
 | 
			
		||||
    let data = Data {
 | 
			
		||||
        host: data.host,
 | 
			
		||||
        password: data.password,
 | 
			
		||||
        handle: data.handle,
 | 
			
		||||
        did: data.did,
 | 
			
		||||
        access: data.access,
 | 
			
		||||
        refresh: data.refresh,
 | 
			
		||||
    };
 | 
			
		||||
    match &*s {
 | 
			
		||||
        "host" => data.host,
 | 
			
		||||
        "password" => data.password,
 | 
			
		||||
        "handle" => data.handle,
 | 
			
		||||
        "did" => data.did,
 | 
			
		||||
        "access" => data.access,
 | 
			
		||||
        "refresh" => data.refresh,
 | 
			
		||||
        _ => s,
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
pub fn c_refresh(access: &str, refresh: &str) {
 | 
			
		||||
    let ff = data_file(&"refresh");
 | 
			
		||||
    let mut ff = fs::File::create(ff.clone()).unwrap();
 | 
			
		||||
    let refreshs = Refresh {
 | 
			
		||||
        access: access.to_string(),
 | 
			
		||||
        refresh: refresh.to_string(),
 | 
			
		||||
    };
 | 
			
		||||
    let toml = toml::to_string(&refreshs).unwrap();
 | 
			
		||||
    ff.write_all(&toml.as_bytes()).unwrap();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
pub fn data_refresh(s: &str) -> String {
 | 
			
		||||
    let s = String::from(s);
 | 
			
		||||
 | 
			
		||||
    let data = Data::new().unwrap();
 | 
			
		||||
    let data = Data {
 | 
			
		||||
        host: data.host,
 | 
			
		||||
        password: data.password,
 | 
			
		||||
        handle: data.handle,
 | 
			
		||||
        did: data.did,
 | 
			
		||||
        access: data.access,
 | 
			
		||||
        refresh: data.refresh,
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    let mut _file = match Refresh::new()
 | 
			
		||||
    {
 | 
			
		||||
        Err(_why) => c_refresh(&data.access, &data.refresh),
 | 
			
		||||
        Ok(_) => println!(""),
 | 
			
		||||
    };
 | 
			
		||||
    let refresh = Refresh::new().unwrap();
 | 
			
		||||
    let refresh = Refresh {
 | 
			
		||||
        access: refresh.access,
 | 
			
		||||
        refresh: refresh.refresh,
 | 
			
		||||
    };
 | 
			
		||||
    match &*s {
 | 
			
		||||
        "access" => refresh.access,
 | 
			
		||||
        "refresh" => refresh.refresh,
 | 
			
		||||
        _ => s,
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
pub fn data_scpt(s: &str) -> String {
 | 
			
		||||
    let s = String::from(s);
 | 
			
		||||
    let file = "/.config/ai/scpt/".to_owned() + &s + &".zsh";
 | 
			
		||||
    let mut f = shellexpand::tilde("~").to_string();
 | 
			
		||||
    f.push_str(&file);
 | 
			
		||||
    return f;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[derive(Serialize, Deserialize)]
 | 
			
		||||
pub struct Notify {
 | 
			
		||||
    pub notifications: Vec<Notifications>,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[derive(Serialize, Deserialize)]
 | 
			
		||||
pub struct Status {
 | 
			
		||||
    pub handle: String,
 | 
			
		||||
    pub did: String,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[derive(Serialize, Deserialize)]
 | 
			
		||||
#[allow(non_snake_case)]
 | 
			
		||||
pub struct DidDocs {
 | 
			
		||||
    pub verificationMethod: Vec<VerificationMethod>,
 | 
			
		||||
    pub service: Vec<Service>,
 | 
			
		||||
    pub id: String,
 | 
			
		||||
    pub alsoKnownAs: Vec<AlsoKnownAs>,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[derive(Serialize, Deserialize)]
 | 
			
		||||
#[allow(non_snake_case)]
 | 
			
		||||
pub struct VerificationMethod {
 | 
			
		||||
    pub id: String,
 | 
			
		||||
    pub r#type: String,
 | 
			
		||||
    pub controller: String,
 | 
			
		||||
    pub publicKeyMultibase: String,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[derive(Serialize, Deserialize)]
 | 
			
		||||
#[allow(non_snake_case)]
 | 
			
		||||
pub struct Service {
 | 
			
		||||
    pub id: String,
 | 
			
		||||
    pub r#type: String,
 | 
			
		||||
    pub serviceEndpoint: String,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[derive(Serialize, Deserialize)]
 | 
			
		||||
#[allow(non_snake_case)]
 | 
			
		||||
pub struct AlsoKnownAs {}
 | 
			
		||||
 | 
			
		||||
#[derive(Serialize, Deserialize)]
 | 
			
		||||
pub struct Timeline {
 | 
			
		||||
    pub feed: Vec<Feed>,
 | 
			
		||||
}
 | 
			
		||||
#[derive(Serialize, Deserialize)]
 | 
			
		||||
pub struct Session {
 | 
			
		||||
    pub did: String,
 | 
			
		||||
    pub email: String,
 | 
			
		||||
    pub handle: String,
 | 
			
		||||
}
 | 
			
		||||
#[derive(Serialize, Deserialize)]
 | 
			
		||||
pub struct Follow {
 | 
			
		||||
    pub follows: Vec<Author>,
 | 
			
		||||
    pub cursor: String,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[derive(Serialize, Deserialize)]
 | 
			
		||||
#[allow(non_snake_case)]
 | 
			
		||||
pub struct Notifications {
 | 
			
		||||
    pub uri: String,
 | 
			
		||||
    pub cid: String,
 | 
			
		||||
    pub author: Author,
 | 
			
		||||
    pub reason: String,
 | 
			
		||||
    //pub reasonSubject: String,
 | 
			
		||||
    pub record: Record,
 | 
			
		||||
    pub isRead: bool,
 | 
			
		||||
    pub indexedAt: String,
 | 
			
		||||
    //pub labels: Labels,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[derive(Serialize, Deserialize)]
 | 
			
		||||
#[allow(non_snake_case)]
 | 
			
		||||
pub struct Thread {
 | 
			
		||||
    pub r#type: String,
 | 
			
		||||
    pub post: String,
 | 
			
		||||
    pub root: String,
 | 
			
		||||
    pub author: Author,
 | 
			
		||||
    pub reason: String,
 | 
			
		||||
    //pub reasonSubject: String,
 | 
			
		||||
    pub record: Record,
 | 
			
		||||
    pub isRead: bool,
 | 
			
		||||
    pub indexedAt: String,
 | 
			
		||||
    //pub labels: Labels,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[derive(Serialize, Deserialize)]
 | 
			
		||||
#[allow(non_snake_case)]
 | 
			
		||||
pub struct Author {
 | 
			
		||||
    pub did: String,
 | 
			
		||||
    //pub declaration: Declaration,
 | 
			
		||||
    pub description: Option<String>,
 | 
			
		||||
    pub displayName: Option<String>,
 | 
			
		||||
    pub handle: String,
 | 
			
		||||
    pub avatar: Option<String>,
 | 
			
		||||
    pub viewer: Viewer,
 | 
			
		||||
    //pub labels: Labels,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[derive(Serialize, Deserialize)]
 | 
			
		||||
#[allow(non_snake_case)]
 | 
			
		||||
pub struct Labels {
 | 
			
		||||
    pub src: Option<String>,
 | 
			
		||||
    pub uri: Option<String>,
 | 
			
		||||
    pub cid: Option<String>,
 | 
			
		||||
    pub val: Option<String>,
 | 
			
		||||
    pub cts: Option<String>,
 | 
			
		||||
    pub neg: Option<bool>,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[derive(Serialize, Deserialize)]
 | 
			
		||||
#[allow(non_snake_case)]
 | 
			
		||||
pub struct Declaration {
 | 
			
		||||
    pub actorType: String,
 | 
			
		||||
    pub cid: String,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[derive(Serialize, Deserialize)]
 | 
			
		||||
#[allow(non_snake_case)]
 | 
			
		||||
pub struct Viewer {
 | 
			
		||||
    pub muted: bool,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[derive(Serialize, Deserialize)]
 | 
			
		||||
#[allow(non_snake_case)]
 | 
			
		||||
#[derive(Debug)]
 | 
			
		||||
pub struct Record {
 | 
			
		||||
    pub text: Option<String>,
 | 
			
		||||
    pub createdAt: String,
 | 
			
		||||
    pub reply: Option<Reply>,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[derive(Serialize, Deserialize)]
 | 
			
		||||
#[allow(non_snake_case)]
 | 
			
		||||
#[derive(Debug)]
 | 
			
		||||
pub struct Reply {
 | 
			
		||||
    pub parent: ReplyParent,
 | 
			
		||||
    pub root: ReplyRoot,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[derive(Serialize, Deserialize)]
 | 
			
		||||
#[allow(non_snake_case)]
 | 
			
		||||
#[derive(Debug)]
 | 
			
		||||
pub struct ReplyRoot {
 | 
			
		||||
    pub cid: String,
 | 
			
		||||
    pub uri: String,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[derive(Serialize, Deserialize)]
 | 
			
		||||
#[allow(non_snake_case)]
 | 
			
		||||
#[derive(Debug)]
 | 
			
		||||
pub struct ReplyParent {
 | 
			
		||||
    pub cid: String,
 | 
			
		||||
    pub uri: String,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[derive(Serialize, Deserialize)]
 | 
			
		||||
#[allow(non_snake_case)]
 | 
			
		||||
pub struct Langs {}
 | 
			
		||||
 | 
			
		||||
#[derive(Serialize, Deserialize)]
 | 
			
		||||
#[allow(non_snake_case)]
 | 
			
		||||
pub struct Feed {
 | 
			
		||||
    pub post: Post,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[derive(Serialize, Deserialize)]
 | 
			
		||||
#[allow(non_snake_case)]
 | 
			
		||||
pub struct Post {
 | 
			
		||||
    pub did: Option<String>,
 | 
			
		||||
    pub uri: String,
 | 
			
		||||
    pub cid: String,
 | 
			
		||||
    pub collection: Option<String>,
 | 
			
		||||
    pub record: Record,
 | 
			
		||||
    pub author: Author,
 | 
			
		||||
    pub reason: Option<String>,
 | 
			
		||||
    pub indexedAt: String,
 | 
			
		||||
    pub replyCount: i32,
 | 
			
		||||
    pub postCount: Option<i32>,
 | 
			
		||||
    pub repostCount: i32,
 | 
			
		||||
    pub likeCount: i32,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[derive(Serialize, Deserialize)]
 | 
			
		||||
pub struct Cid {
 | 
			
		||||
    pub cid: String,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[derive(Serialize, Deserialize)]
 | 
			
		||||
#[allow(non_snake_case)]
 | 
			
		||||
pub struct Img {
 | 
			
		||||
    pub blob: Blob,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[derive(Serialize, Deserialize)]
 | 
			
		||||
pub struct Blob {
 | 
			
		||||
    pub r#ref: Ref,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[derive(Serialize, Deserialize)]
 | 
			
		||||
pub struct Ref {
 | 
			
		||||
    pub link: String,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[derive(Serialize, Deserialize)]
 | 
			
		||||
pub struct Handle {
 | 
			
		||||
    pub handle: String,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//#[derive(Serialize, Deserialize)]
 | 
			
		||||
//pub struct Did {
 | 
			
		||||
//    pub did: String
 | 
			
		||||
//}
 | 
			
		||||
 | 
			
		||||
//#[derive(Serialize, Deserialize)]
 | 
			
		||||
//pub struct Labels {
 | 
			
		||||
//}
 | 
			
		||||
//
 | 
			
		||||
//#[derive(Serialize, Deserialize)]
 | 
			
		||||
//pub struct Viewer {
 | 
			
		||||
//    pub muted: bool,
 | 
			
		||||
//    pub blockedBy: bool,
 | 
			
		||||
//}
 | 
			
		||||
//
 | 
			
		||||
#[derive(Serialize, Deserialize)]
 | 
			
		||||
#[allow(non_snake_case)]
 | 
			
		||||
pub struct ProfileIdentityResolve {
 | 
			
		||||
    pub did: String,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[derive(Serialize, Deserialize)]
 | 
			
		||||
#[allow(non_snake_case)]
 | 
			
		||||
pub struct Profile {
 | 
			
		||||
    pub did: String,
 | 
			
		||||
    pub handle: String,
 | 
			
		||||
    pub followsCount: Option<i32>,
 | 
			
		||||
    pub followersCount: Option<i32>,
 | 
			
		||||
    pub postsCount: i32,
 | 
			
		||||
    pub indexedAt: Option<String>,
 | 
			
		||||
    pub avatar: Option<String>,
 | 
			
		||||
    pub banner: Option<String>,
 | 
			
		||||
    pub displayName: Option<String>,
 | 
			
		||||
    pub description: Option<String>,
 | 
			
		||||
    pub viewer: Viewer,
 | 
			
		||||
    pub labels: Labels,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
pub fn c_char(i: String) -> String {
 | 
			
		||||
    let l = 250;
 | 
			
		||||
    let mut s = String::new();
 | 
			
		||||
    for ii in i.chars().enumerate() {
 | 
			
		||||
        match ii.0 {
 | 
			
		||||
            n if n > l.try_into().unwrap() => break,
 | 
			
		||||
            _ => s.push(ii.1),
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    return s;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
pub fn w_cfg(h: &str, res: &str, password: &str) {
 | 
			
		||||
    let f = data_file(&"json");
 | 
			
		||||
    let ff = data_file(&"toml");
 | 
			
		||||
    let mut f = fs::File::create(f.clone()).unwrap();
 | 
			
		||||
    let mut ff = fs::File::create(ff.clone()).unwrap();
 | 
			
		||||
    f.write_all(&res.as_bytes()).unwrap();
 | 
			
		||||
    let json: Token = serde_json::from_str(&res).unwrap();
 | 
			
		||||
    let datas = Data {
 | 
			
		||||
        host: h.to_string(),
 | 
			
		||||
        password: password.to_string(),
 | 
			
		||||
        did: json.did.to_string(),
 | 
			
		||||
        handle: json.handle.to_string(),
 | 
			
		||||
        access: json.accessJwt.to_string(),
 | 
			
		||||
        refresh: json.refreshJwt.to_string(),
 | 
			
		||||
    };
 | 
			
		||||
    let toml = toml::to_string(&datas).unwrap();
 | 
			
		||||
    ff.write_all(&toml.as_bytes()).unwrap();
 | 
			
		||||
 | 
			
		||||
    let ff = data_file(&"refresh");
 | 
			
		||||
    let mut ff = fs::File::create(ff.clone()).unwrap();
 | 
			
		||||
    let refreshs = Refresh {
 | 
			
		||||
        access: json.accessJwt.to_string(),
 | 
			
		||||
        refresh: json.refreshJwt.to_string(),
 | 
			
		||||
    };
 | 
			
		||||
    let toml = toml::to_string(&refreshs).unwrap();
 | 
			
		||||
    ff.write_all(&toml.as_bytes()).unwrap();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
pub fn w_refresh(res: &str) {
 | 
			
		||||
    let ff = data_file(&"refresh");
 | 
			
		||||
    let mut ff = fs::File::create(ff.clone()).unwrap();
 | 
			
		||||
    let json: Token = serde_json::from_str(&res).unwrap();
 | 
			
		||||
    let refreshs = Refresh {
 | 
			
		||||
        access: json.accessJwt.to_string(),
 | 
			
		||||
        refresh: json.refreshJwt.to_string(),
 | 
			
		||||
    };
 | 
			
		||||
    let toml = toml::to_string(&refreshs).unwrap();
 | 
			
		||||
    ff.write_all(&toml.as_bytes()).unwrap();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
pub fn w_cid(cid: String, file: String, t: bool) -> bool {
 | 
			
		||||
    let f = file;
 | 
			
		||||
    let mut file = match OpenOptions::new()
 | 
			
		||||
        .create(true)
 | 
			
		||||
        .write(true)
 | 
			
		||||
        .read(true)
 | 
			
		||||
        .append(true)
 | 
			
		||||
        .open(f.clone())
 | 
			
		||||
    {
 | 
			
		||||
        Err(why) => panic!("Couldn't open {}: {}", f, why),
 | 
			
		||||
        Ok(file) => file,
 | 
			
		||||
    };
 | 
			
		||||
    let mut contents = String::new();
 | 
			
		||||
 | 
			
		||||
    match file.read_to_string(&mut contents) {
 | 
			
		||||
        Err(why) => panic!("Couldn't read {}: {}", f, why),
 | 
			
		||||
        Ok(_) => (),
 | 
			
		||||
    }
 | 
			
		||||
    if contents.contains(&cid) == false {
 | 
			
		||||
        if t {
 | 
			
		||||
            let cid = cid + "\n";
 | 
			
		||||
            match file.write_all(cid.as_bytes()) {
 | 
			
		||||
                Err(why) => panic!("Couldn't write \"{}\" to {}: {}", contents, f, why),
 | 
			
		||||
                Ok(_) => println!("finished"),
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        let check = false;
 | 
			
		||||
        return check;
 | 
			
		||||
    } else {
 | 
			
		||||
        let check = true;
 | 
			
		||||
        return check;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
pub fn c_follow_all() {
 | 
			
		||||
    let file = "/.config/ai/scpt/follow_all.zsh";
 | 
			
		||||
    let mut f = shellexpand::tilde("~").to_string();
 | 
			
		||||
    f.push_str(&file);
 | 
			
		||||
    use std::process::Command;
 | 
			
		||||
    let output = Command::new(&f).output().expect("zsh");
 | 
			
		||||
    let d = String::from_utf8_lossy(&output.stdout);
 | 
			
		||||
    let d = "\n".to_owned() + &d.to_string();
 | 
			
		||||
    println!("{}", d);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
pub fn c_openai_key(c: &Context) {
 | 
			
		||||
    let api = c.args[0].to_string();
 | 
			
		||||
    let o = "api='".to_owned() + &api.to_string() + &"'".to_owned();
 | 
			
		||||
    let o = o.to_string();
 | 
			
		||||
    let l = shellexpand::tilde("~") + "/.config/ai/openai.toml";
 | 
			
		||||
    let l = l.to_string();
 | 
			
		||||
    let mut l = fs::File::create(l).unwrap();
 | 
			
		||||
    if o != "" {
 | 
			
		||||
        l.write_all(&o.as_bytes()).unwrap();
 | 
			
		||||
    }
 | 
			
		||||
    println!("{:#?}", l);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl Open {
 | 
			
		||||
    pub fn new() -> Result<Self, ConfigError> {
 | 
			
		||||
        let d = shellexpand::tilde("~") + "/.config/ai/openai.toml";
 | 
			
		||||
        let s = Config::builder()
 | 
			
		||||
            .add_source(File::with_name(&d))
 | 
			
		||||
            .add_source(config::Environment::with_prefix("APP"))
 | 
			
		||||
            .build()?;
 | 
			
		||||
        s.try_deserialize()
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[derive(Debug, Deserialize)]
 | 
			
		||||
pub struct Open {
 | 
			
		||||
    pub api: String,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[derive(Serialize, Deserialize, Debug)]
 | 
			
		||||
pub struct OpenData {
 | 
			
		||||
    choices: Vec<Choices>,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[derive(Serialize, Deserialize, Debug)]
 | 
			
		||||
pub struct Choices {
 | 
			
		||||
    text: String,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										22
									
								
								src/describe.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								src/describe.rs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,22 @@
 | 
			
		||||
extern crate reqwest;
 | 
			
		||||
//use crate::data_toml;
 | 
			
		||||
use crate::url;
 | 
			
		||||
 | 
			
		||||
pub async fn get_request(user: String) -> String {
 | 
			
		||||
    //let token = data_refresh(&"access");
 | 
			
		||||
    let url = url(&"describe");
 | 
			
		||||
 | 
			
		||||
    let client = reqwest::Client::new();
 | 
			
		||||
    let res = client
 | 
			
		||||
        .get(url)
 | 
			
		||||
        .query(&[("repo", &user)])
 | 
			
		||||
        //.header("Authorization", "Bearer ".to_owned() + &token)
 | 
			
		||||
        .send()
 | 
			
		||||
        .await
 | 
			
		||||
        .unwrap()
 | 
			
		||||
        .text()
 | 
			
		||||
        .await
 | 
			
		||||
        .unwrap();
 | 
			
		||||
 | 
			
		||||
    return res;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										81
									
								
								src/follow.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										81
									
								
								src/follow.rs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,81 @@
 | 
			
		||||
extern crate reqwest;
 | 
			
		||||
use crate::data_toml;
 | 
			
		||||
use crate::data_refresh;
 | 
			
		||||
use crate::url;
 | 
			
		||||
use iso8601_timestamp::Timestamp;
 | 
			
		||||
use serde_json::json;
 | 
			
		||||
 | 
			
		||||
//use crate::data::Follow;
 | 
			
		||||
 | 
			
		||||
pub async fn post_request(u: String) -> String {
 | 
			
		||||
    let token = data_refresh(&"access");
 | 
			
		||||
    let did = data_toml(&"did");
 | 
			
		||||
    let handle = data_toml(&"handle");
 | 
			
		||||
 | 
			
		||||
    let url = url(&"record_create");
 | 
			
		||||
    let col = "app.bsky.graph.follow".to_string();
 | 
			
		||||
 | 
			
		||||
    let d = Timestamp::now_utc();
 | 
			
		||||
    let d = d.to_string();
 | 
			
		||||
 | 
			
		||||
    let post = Some(json!({
 | 
			
		||||
        "repo": handle.to_string(),
 | 
			
		||||
        "did": did.to_string(),
 | 
			
		||||
        "collection": col.to_string(),
 | 
			
		||||
        "record": {
 | 
			
		||||
            "subject": u.to_string(),
 | 
			
		||||
            "createdAt": d.to_string(),
 | 
			
		||||
        },
 | 
			
		||||
    }));
 | 
			
		||||
 | 
			
		||||
    let client = reqwest::Client::new();
 | 
			
		||||
    let res = client
 | 
			
		||||
        .post(url)
 | 
			
		||||
        .json(&post)
 | 
			
		||||
        .header("Authorization", "Bearer ".to_owned() + &token)
 | 
			
		||||
        .send()
 | 
			
		||||
        .await
 | 
			
		||||
        .unwrap()
 | 
			
		||||
        .text()
 | 
			
		||||
        .await
 | 
			
		||||
        .unwrap();
 | 
			
		||||
 | 
			
		||||
    return res;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
pub async fn delete_request(u: String, rkey: String) -> String {
 | 
			
		||||
    let token = data_refresh(&"access");
 | 
			
		||||
    let did = data_toml(&"did");
 | 
			
		||||
    let handle = data_toml(&"handle");
 | 
			
		||||
 | 
			
		||||
    let url = url(&"record_delete");
 | 
			
		||||
    let col = "app.bsky.graph.follow".to_string();
 | 
			
		||||
 | 
			
		||||
    let d = Timestamp::now_utc();
 | 
			
		||||
    let d = d.to_string();
 | 
			
		||||
 | 
			
		||||
    let post = Some(json!({
 | 
			
		||||
        "repo": handle.to_string(),
 | 
			
		||||
        "did": did.to_string(),
 | 
			
		||||
        "collection": col.to_string(),
 | 
			
		||||
        "rkey": rkey.to_string(),
 | 
			
		||||
        "record": {
 | 
			
		||||
            "subject": u.to_string(),
 | 
			
		||||
            "createdAt": d.to_string(),
 | 
			
		||||
        },
 | 
			
		||||
    }));
 | 
			
		||||
 | 
			
		||||
    let client = reqwest::Client::new();
 | 
			
		||||
    let res = client
 | 
			
		||||
        .post(url)
 | 
			
		||||
        .json(&post)
 | 
			
		||||
        .header("Authorization", "Bearer ".to_owned() + &token)
 | 
			
		||||
        .send()
 | 
			
		||||
        .await
 | 
			
		||||
        .unwrap()
 | 
			
		||||
        .text()
 | 
			
		||||
        .await
 | 
			
		||||
        .unwrap();
 | 
			
		||||
 | 
			
		||||
    return res;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										24
									
								
								src/followers.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								src/followers.rs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,24 @@
 | 
			
		||||
extern crate reqwest;
 | 
			
		||||
use crate::data_refresh;
 | 
			
		||||
use crate::url;
 | 
			
		||||
//use serde_json::json;
 | 
			
		||||
 | 
			
		||||
pub async fn get_request(actor: String, cursor: Option<String>) -> String {
 | 
			
		||||
    let token = data_refresh(&"access");
 | 
			
		||||
    let url = url(&"followers");
 | 
			
		||||
    let cursor = cursor.unwrap();
 | 
			
		||||
 | 
			
		||||
    let client = reqwest::Client::new();
 | 
			
		||||
    let res = client
 | 
			
		||||
        .get(url)
 | 
			
		||||
        .query(&[("actor", actor), ("cursor", cursor)])
 | 
			
		||||
        .header("Authorization", "Bearer ".to_owned() + &token)
 | 
			
		||||
        .send()
 | 
			
		||||
        .await
 | 
			
		||||
        .unwrap()
 | 
			
		||||
        .text()
 | 
			
		||||
        .await
 | 
			
		||||
        .unwrap();
 | 
			
		||||
 | 
			
		||||
    return res;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										26
									
								
								src/follows.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								src/follows.rs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,26 @@
 | 
			
		||||
extern crate reqwest;
 | 
			
		||||
use crate::data_refresh;
 | 
			
		||||
use crate::url;
 | 
			
		||||
//use serde_json::json;
 | 
			
		||||
 | 
			
		||||
pub async fn get_request(actor: String, cursor: Option<String>) -> String {
 | 
			
		||||
    let token = data_refresh(&"access");
 | 
			
		||||
    let url = url(&"follows");
 | 
			
		||||
    let cursor = cursor.unwrap();
 | 
			
		||||
    //let cursor = "1682386039125::bafyreihwgwozmvqxcxrhbr65agcaa4v357p27ccrhzkjf3mz5xiozjvzfa".to_string();
 | 
			
		||||
    //let cursor = "1682385956974::bafyreihivhux5m3sxbg33yruhw5ozhahwspnuqdsysbo57smzgptdcluem".to_string();
 | 
			
		||||
 | 
			
		||||
    let client = reqwest::Client::new();
 | 
			
		||||
    let res = client
 | 
			
		||||
        .get(url)
 | 
			
		||||
        .query(&[("actor", actor), ("cursor", cursor)])
 | 
			
		||||
        //cursor.unwrap()
 | 
			
		||||
        .header("Authorization", "Bearer ".to_owned() + &token)
 | 
			
		||||
        .send()
 | 
			
		||||
        .await
 | 
			
		||||
        .unwrap()
 | 
			
		||||
        .text()
 | 
			
		||||
        .await
 | 
			
		||||
        .unwrap();
 | 
			
		||||
    return res;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										59
									
								
								src/img.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										59
									
								
								src/img.rs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,59 @@
 | 
			
		||||
extern crate reqwest;
 | 
			
		||||
use crate::data_toml;
 | 
			
		||||
use crate::data_refresh;
 | 
			
		||||
use crate::url;
 | 
			
		||||
use serde_json::json;
 | 
			
		||||
use iso8601_timestamp::Timestamp;
 | 
			
		||||
 | 
			
		||||
pub async fn post_request(text: String, link: String) -> String {
 | 
			
		||||
 | 
			
		||||
    let token = data_refresh(&"access");
 | 
			
		||||
    let did = data_toml(&"did");
 | 
			
		||||
    let handle = data_toml(&"handle");
 | 
			
		||||
 | 
			
		||||
    let url = url(&"record_create");
 | 
			
		||||
    let col = "app.bsky.feed.post".to_string();
 | 
			
		||||
 | 
			
		||||
    let d = Timestamp::now_utc();
 | 
			
		||||
    let d = d.to_string();
 | 
			
		||||
 | 
			
		||||
    let post = Some(json!({
 | 
			
		||||
        "repo": handle.to_string(),
 | 
			
		||||
        "did": did.to_string(),
 | 
			
		||||
        "collection": col.to_string(),
 | 
			
		||||
        "record": {
 | 
			
		||||
            "createdAt": d.to_string(),
 | 
			
		||||
            "text": text.to_string(),
 | 
			
		||||
            "embed": {
 | 
			
		||||
                "$type": "app.bsky.embed.images",
 | 
			
		||||
                "images": [
 | 
			
		||||
                    {
 | 
			
		||||
                        "alt": "",
 | 
			
		||||
                        "image": {
 | 
			
		||||
                            "$type":"blob",
 | 
			
		||||
                            "ref": {
 | 
			
		||||
                                "$link" : link.to_string()
 | 
			
		||||
                            },
 | 
			
		||||
                            "mimeType": "image/png",
 | 
			
		||||
                                "size": 0
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                ]
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }));
 | 
			
		||||
 | 
			
		||||
    let client = reqwest::Client::new();
 | 
			
		||||
    let res = client
 | 
			
		||||
        .post(url)
 | 
			
		||||
        .json(&post)
 | 
			
		||||
        .header("Authorization", "Bearer ".to_owned() + &token)
 | 
			
		||||
        .send()
 | 
			
		||||
        .await
 | 
			
		||||
        .unwrap()
 | 
			
		||||
        .text()
 | 
			
		||||
        .await
 | 
			
		||||
        .unwrap();
 | 
			
		||||
 | 
			
		||||
    return res
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										74
									
								
								src/img_reply.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										74
									
								
								src/img_reply.rs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,74 @@
 | 
			
		||||
extern crate reqwest;
 | 
			
		||||
use crate::data_toml;
 | 
			
		||||
use crate::data_refresh;
 | 
			
		||||
use crate::url;
 | 
			
		||||
use iso8601_timestamp::Timestamp;
 | 
			
		||||
use serde_json::json;
 | 
			
		||||
 | 
			
		||||
pub async fn post_request(
 | 
			
		||||
    text: String,
 | 
			
		||||
    link: String,
 | 
			
		||||
    cid: String,
 | 
			
		||||
    uri: String,
 | 
			
		||||
    itype: String,
 | 
			
		||||
) -> String {
 | 
			
		||||
    let token = data_refresh(&"access");
 | 
			
		||||
    let did = data_toml(&"did");
 | 
			
		||||
    let handle = data_toml(&"handle");
 | 
			
		||||
 | 
			
		||||
    let url = url(&"record_create");
 | 
			
		||||
    let col = "app.bsky.feed.post".to_string();
 | 
			
		||||
 | 
			
		||||
    let d = Timestamp::now_utc();
 | 
			
		||||
    let d = d.to_string();
 | 
			
		||||
 | 
			
		||||
    let post = Some(json!({
 | 
			
		||||
        "repo": handle.to_string(),
 | 
			
		||||
        "did": did.to_string(),
 | 
			
		||||
        "collection": col.to_string(),
 | 
			
		||||
        "record": {
 | 
			
		||||
            "createdAt": d.to_string(),
 | 
			
		||||
            "text": text.to_string(),
 | 
			
		||||
            "embed": {
 | 
			
		||||
                "$type": "app.bsky.embed.images",
 | 
			
		||||
                "images": [
 | 
			
		||||
                    {
 | 
			
		||||
                        "alt": "",
 | 
			
		||||
                        "image": {
 | 
			
		||||
                            "$type":"blob",
 | 
			
		||||
                            "ref": {
 | 
			
		||||
                                "$link" : link.to_string()
 | 
			
		||||
                            },
 | 
			
		||||
                            "mimeType": itype.to_string(),
 | 
			
		||||
                                "size": 0
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                ]
 | 
			
		||||
            },
 | 
			
		||||
            "reply": {
 | 
			
		||||
                "root": {
 | 
			
		||||
                    "cid": cid.to_string(),
 | 
			
		||||
                    "uri": uri.to_string()
 | 
			
		||||
                },
 | 
			
		||||
                "parent": {
 | 
			
		||||
                    "cid": cid.to_string(),
 | 
			
		||||
                    "uri": uri.to_string()
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }));
 | 
			
		||||
 | 
			
		||||
    let client = reqwest::Client::new();
 | 
			
		||||
    let res = client
 | 
			
		||||
        .post(url)
 | 
			
		||||
        .json(&post)
 | 
			
		||||
        .header("Authorization", "Bearer ".to_owned() + &token)
 | 
			
		||||
        .send()
 | 
			
		||||
        .await
 | 
			
		||||
        .unwrap()
 | 
			
		||||
        .text()
 | 
			
		||||
        .await
 | 
			
		||||
        .unwrap();
 | 
			
		||||
 | 
			
		||||
    return res;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										59
									
								
								src/img_upload.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										59
									
								
								src/img_upload.rs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,59 @@
 | 
			
		||||
extern crate reqwest;
 | 
			
		||||
use crate::data_toml;
 | 
			
		||||
use crate::data_refresh;
 | 
			
		||||
use crate::url;
 | 
			
		||||
use serde_json::json;
 | 
			
		||||
use iso8601_timestamp::Timestamp;
 | 
			
		||||
 | 
			
		||||
pub async fn post_request(text: String, link: String) -> String {
 | 
			
		||||
 | 
			
		||||
    let token = data_refresh(&"access");
 | 
			
		||||
    let did = data_toml(&"did");
 | 
			
		||||
    let handle = data_toml(&"handle");
 | 
			
		||||
 | 
			
		||||
    let url = url(&"record_create");
 | 
			
		||||
    let col = "app.bsky.feed.post".to_string();
 | 
			
		||||
 | 
			
		||||
    let d = Timestamp::now_utc();
 | 
			
		||||
    let d = d.to_string();
 | 
			
		||||
 | 
			
		||||
    let post = Some(json!({
 | 
			
		||||
        "repo": handle.to_string(),
 | 
			
		||||
        "did": did.to_string(),
 | 
			
		||||
        "collection": col.to_string(),
 | 
			
		||||
        "record": {
 | 
			
		||||
            "createdAt": d.to_string(),
 | 
			
		||||
            "text": text.to_string(),
 | 
			
		||||
            "embed": {
 | 
			
		||||
                "$type": "app.bsky.embed.images",
 | 
			
		||||
                "images": [
 | 
			
		||||
                    {
 | 
			
		||||
                        "alt": "",
 | 
			
		||||
                        "image": {
 | 
			
		||||
                            "$type":"blob",
 | 
			
		||||
                            "ref": {
 | 
			
		||||
                                "$link" : link.to_string()
 | 
			
		||||
                            },
 | 
			
		||||
                            "mimeType": "image/png",
 | 
			
		||||
                                "size": 0
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                ]
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }));
 | 
			
		||||
 | 
			
		||||
    let client = reqwest::Client::new();
 | 
			
		||||
    let res = client
 | 
			
		||||
        .post(url)
 | 
			
		||||
        .json(&post)
 | 
			
		||||
        .header("Authorization", "Bearer ".to_owned() + &token)
 | 
			
		||||
        .send()
 | 
			
		||||
        .await
 | 
			
		||||
        .unwrap()
 | 
			
		||||
        .text()
 | 
			
		||||
        .await
 | 
			
		||||
        .unwrap();
 | 
			
		||||
 | 
			
		||||
    return res
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										45
									
								
								src/like.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										45
									
								
								src/like.rs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,45 @@
 | 
			
		||||
extern crate reqwest;
 | 
			
		||||
use crate::data_toml;
 | 
			
		||||
use crate::data_refresh;
 | 
			
		||||
use crate::url;
 | 
			
		||||
use iso8601_timestamp::Timestamp;
 | 
			
		||||
use serde_json::json;
 | 
			
		||||
 | 
			
		||||
pub async fn post_request(cid: String, uri: String) -> String {
 | 
			
		||||
    let token = data_refresh(&"access");
 | 
			
		||||
    let did = data_toml(&"did");
 | 
			
		||||
    let handle = data_toml(&"handle");
 | 
			
		||||
 | 
			
		||||
    let url = url(&"record_create");
 | 
			
		||||
    let col = "app.bsky.feed.like".to_string();
 | 
			
		||||
 | 
			
		||||
    let d = Timestamp::now_utc();
 | 
			
		||||
    let d = d.to_string();
 | 
			
		||||
 | 
			
		||||
    let post = Some(json!({
 | 
			
		||||
        "repo": handle.to_string(),
 | 
			
		||||
        "did": did.to_string(),
 | 
			
		||||
        "collection": col.to_string(),
 | 
			
		||||
        "record": {
 | 
			
		||||
            "subject": {
 | 
			
		||||
                "uri": uri.to_string(),
 | 
			
		||||
                "cid": cid.to_string()
 | 
			
		||||
            },
 | 
			
		||||
            "createdAt": d.to_string(),
 | 
			
		||||
        },
 | 
			
		||||
    }));
 | 
			
		||||
 | 
			
		||||
    let client = reqwest::Client::new();
 | 
			
		||||
    let res = client
 | 
			
		||||
        .post(url)
 | 
			
		||||
        .json(&post)
 | 
			
		||||
        .header("Authorization", "Bearer ".to_owned() + &token)
 | 
			
		||||
        .send()
 | 
			
		||||
        .await
 | 
			
		||||
        .unwrap()
 | 
			
		||||
        .text()
 | 
			
		||||
        .await
 | 
			
		||||
        .unwrap();
 | 
			
		||||
 | 
			
		||||
    return res;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										591
									
								
								src/main.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										591
									
								
								src/main.rs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,591 @@
 | 
			
		||||
use seahorse::{App, Command, Context, Flag, FlagType};
 | 
			
		||||
use std::env;
 | 
			
		||||
 | 
			
		||||
use crate::ascii::c_ascii;
 | 
			
		||||
use crate::bot::c_bot;
 | 
			
		||||
use crate::data::c_follow_all;
 | 
			
		||||
use crate::data::c_openai_key;
 | 
			
		||||
use crate::data::data_toml;
 | 
			
		||||
use crate::data::data_refresh;
 | 
			
		||||
use crate::data::url;
 | 
			
		||||
use crate::data::w_cfg;
 | 
			
		||||
use crate::data::w_refresh;
 | 
			
		||||
 | 
			
		||||
use data::ProfileIdentityResolve;
 | 
			
		||||
 | 
			
		||||
pub mod ascii;
 | 
			
		||||
pub mod bot;
 | 
			
		||||
pub mod data;
 | 
			
		||||
pub mod describe;
 | 
			
		||||
pub mod follow;
 | 
			
		||||
pub mod followers;
 | 
			
		||||
pub mod follows;
 | 
			
		||||
pub mod img_reply;
 | 
			
		||||
pub mod like;
 | 
			
		||||
pub mod mention;
 | 
			
		||||
pub mod notify;
 | 
			
		||||
pub mod notify_read;
 | 
			
		||||
pub mod openai;
 | 
			
		||||
pub mod post;
 | 
			
		||||
pub mod post_link;
 | 
			
		||||
pub mod profile;
 | 
			
		||||
pub mod refresh;
 | 
			
		||||
pub mod reply;
 | 
			
		||||
pub mod reply_link;
 | 
			
		||||
pub mod reply_og;
 | 
			
		||||
pub mod repost;
 | 
			
		||||
pub mod session;
 | 
			
		||||
pub mod timeline_author;
 | 
			
		||||
pub mod token;
 | 
			
		||||
 | 
			
		||||
fn main() {
 | 
			
		||||
    let args: Vec<String> = env::args().collect();
 | 
			
		||||
    let app = App::new(env!("CARGO_PKG_NAME"))
 | 
			
		||||
        .command(
 | 
			
		||||
            Command::new("ai")
 | 
			
		||||
            .alias("a")
 | 
			
		||||
            .action(ascii_art)
 | 
			
		||||
            .flag(
 | 
			
		||||
                Flag::new("type", FlagType::String)
 | 
			
		||||
                .description("type flag")
 | 
			
		||||
                .alias("t"),
 | 
			
		||||
            )
 | 
			
		||||
        )
 | 
			
		||||
        .command(
 | 
			
		||||
            Command::new("bot")
 | 
			
		||||
            .alias("b")
 | 
			
		||||
            .action(bot)
 | 
			
		||||
            .flag(
 | 
			
		||||
                Flag::new("admin", FlagType::String)
 | 
			
		||||
                .alias("a"),
 | 
			
		||||
            )
 | 
			
		||||
        )
 | 
			
		||||
        .command(
 | 
			
		||||
            Command::new("follow_all")
 | 
			
		||||
            .action(follow_all),
 | 
			
		||||
        )
 | 
			
		||||
        .command(
 | 
			
		||||
            Command::new("login")
 | 
			
		||||
            .alias("l")
 | 
			
		||||
            .description("l <handle> -p <password>\n\t\t\tl <handle> -p <password> -s <server>")
 | 
			
		||||
            .action(token)
 | 
			
		||||
            .flag(
 | 
			
		||||
                Flag::new("password", FlagType::String)
 | 
			
		||||
                .description("password flag")
 | 
			
		||||
                .alias("p"),
 | 
			
		||||
                )
 | 
			
		||||
            .flag(
 | 
			
		||||
                Flag::new("server", FlagType::String)
 | 
			
		||||
                .description("server flag")
 | 
			
		||||
                .alias("s"),
 | 
			
		||||
            )
 | 
			
		||||
        )
 | 
			
		||||
        .command(
 | 
			
		||||
            Command::new("refresh")
 | 
			
		||||
            .alias("r")
 | 
			
		||||
            .action(refresh),
 | 
			
		||||
        )
 | 
			
		||||
        .command(
 | 
			
		||||
            Command::new("notify")
 | 
			
		||||
            .alias("n")
 | 
			
		||||
            .action(notify),
 | 
			
		||||
            )
 | 
			
		||||
        .command(
 | 
			
		||||
            Command::new("timeline")
 | 
			
		||||
            .alias("t")
 | 
			
		||||
            .action(timeline),
 | 
			
		||||
        )
 | 
			
		||||
        .command(
 | 
			
		||||
            Command::new("did")
 | 
			
		||||
            .description("did <handle>")
 | 
			
		||||
            .action(did)
 | 
			
		||||
            )
 | 
			
		||||
        .command(
 | 
			
		||||
            Command::new("post")
 | 
			
		||||
            .description("p <text>")
 | 
			
		||||
            .alias("p")
 | 
			
		||||
            .action(post)
 | 
			
		||||
            .flag(
 | 
			
		||||
                Flag::new("link", FlagType::String)
 | 
			
		||||
                .alias("l"),
 | 
			
		||||
            )
 | 
			
		||||
        )
 | 
			
		||||
        .command(
 | 
			
		||||
            Command::new("like")
 | 
			
		||||
            .description("like <cid> -u <uri>")
 | 
			
		||||
            .action(like)
 | 
			
		||||
            .flag(
 | 
			
		||||
                Flag::new("uri", FlagType::String)
 | 
			
		||||
                .alias("u"),
 | 
			
		||||
                )
 | 
			
		||||
            )
 | 
			
		||||
        .command(
 | 
			
		||||
            Command::new("repost")
 | 
			
		||||
            .description("repost <cid> -u <uri>")
 | 
			
		||||
            .action(repost)
 | 
			
		||||
            .flag(
 | 
			
		||||
                Flag::new("uri", FlagType::String)
 | 
			
		||||
                .alias("u"),
 | 
			
		||||
            )
 | 
			
		||||
        )
 | 
			
		||||
        .command(
 | 
			
		||||
            Command::new("reply-og")
 | 
			
		||||
            .description("reply-og <text> -c <cid> -u <uri> -i <img> -t <title> -d <description> -l <link>")
 | 
			
		||||
            .action(reply_og)
 | 
			
		||||
            .flag(
 | 
			
		||||
                Flag::new("uri", FlagType::String)
 | 
			
		||||
                .alias("u"),
 | 
			
		||||
            )
 | 
			
		||||
            .flag(
 | 
			
		||||
                Flag::new("cid", FlagType::String)
 | 
			
		||||
                .alias("c"),
 | 
			
		||||
            )
 | 
			
		||||
            .flag(
 | 
			
		||||
                Flag::new("link", FlagType::String)
 | 
			
		||||
                .alias("l"),
 | 
			
		||||
            )
 | 
			
		||||
            .flag(
 | 
			
		||||
                Flag::new("title", FlagType::String)
 | 
			
		||||
                .alias("t"),
 | 
			
		||||
            )
 | 
			
		||||
            .flag(
 | 
			
		||||
                Flag::new("description", FlagType::String)
 | 
			
		||||
                .alias("d"),
 | 
			
		||||
            )
 | 
			
		||||
            .flag(
 | 
			
		||||
                Flag::new("img", FlagType::String)
 | 
			
		||||
                .alias("i"),
 | 
			
		||||
            )
 | 
			
		||||
        )
 | 
			
		||||
        .command(
 | 
			
		||||
            Command::new("reply")
 | 
			
		||||
            .description("r <text> -u <uri> -c <cid>")
 | 
			
		||||
            .action(reply)
 | 
			
		||||
            .flag(
 | 
			
		||||
                Flag::new("uri", FlagType::String)
 | 
			
		||||
                .alias("u"),
 | 
			
		||||
            )
 | 
			
		||||
            .flag(
 | 
			
		||||
                Flag::new("cid", FlagType::String)
 | 
			
		||||
                .alias("c"),
 | 
			
		||||
            )
 | 
			
		||||
            .flag(
 | 
			
		||||
                Flag::new("link", FlagType::String)
 | 
			
		||||
                .description("-l <link>")
 | 
			
		||||
                .alias("l"),
 | 
			
		||||
            )
 | 
			
		||||
        )
 | 
			
		||||
        .command(
 | 
			
		||||
            Command::new("mention")
 | 
			
		||||
            .description("@ <handle> -p <text>")
 | 
			
		||||
            .alias("@")
 | 
			
		||||
            .action(mention)
 | 
			
		||||
            .flag(
 | 
			
		||||
                Flag::new("post", FlagType::String)
 | 
			
		||||
                .alias("p"),
 | 
			
		||||
            )
 | 
			
		||||
        )
 | 
			
		||||
        .command(
 | 
			
		||||
            Command::new("follow")
 | 
			
		||||
            .description("follow <did>")
 | 
			
		||||
            .action(follow)
 | 
			
		||||
            .flag(
 | 
			
		||||
                Flag::new("follows", FlagType::Bool)
 | 
			
		||||
                .alias("s"),
 | 
			
		||||
            )
 | 
			
		||||
            .flag(
 | 
			
		||||
                Flag::new("delete", FlagType::String)
 | 
			
		||||
                .alias("d"),
 | 
			
		||||
            )
 | 
			
		||||
            .flag(
 | 
			
		||||
                Flag::new("followers", FlagType::Bool)
 | 
			
		||||
                .alias("w"),
 | 
			
		||||
            )
 | 
			
		||||
            .flag(
 | 
			
		||||
                Flag::new("all", FlagType::Bool)
 | 
			
		||||
                .alias("a"),
 | 
			
		||||
            )
 | 
			
		||||
            .flag(
 | 
			
		||||
                Flag::new("cursor", FlagType::String)
 | 
			
		||||
                .alias("c"),
 | 
			
		||||
            )
 | 
			
		||||
        )
 | 
			
		||||
        .command(
 | 
			
		||||
            Command::new("profile")
 | 
			
		||||
            .description("pro <handle>")
 | 
			
		||||
            .alias("pro")
 | 
			
		||||
            .action(profile)
 | 
			
		||||
        )
 | 
			
		||||
        .command(
 | 
			
		||||
            Command::new("img-upload")
 | 
			
		||||
            .description("img-upload <img>")
 | 
			
		||||
            .action(img_upload)
 | 
			
		||||
        )
 | 
			
		||||
        .command(
 | 
			
		||||
            Command::new("img-post")
 | 
			
		||||
            .description("img-post <text> -l <link> -u <uri> -c <cid>")
 | 
			
		||||
            .action(img_post)
 | 
			
		||||
            .flag(
 | 
			
		||||
                Flag::new("link", FlagType::String)
 | 
			
		||||
                .alias("l"),
 | 
			
		||||
            )
 | 
			
		||||
            .flag(
 | 
			
		||||
                Flag::new("uri", FlagType::String)
 | 
			
		||||
                .alias("u"),
 | 
			
		||||
            )
 | 
			
		||||
            .flag(
 | 
			
		||||
                Flag::new("cid", FlagType::String)
 | 
			
		||||
                .alias("c"),
 | 
			
		||||
            )
 | 
			
		||||
        )
 | 
			
		||||
        .command(
 | 
			
		||||
            Command::new("openai")
 | 
			
		||||
            .description("openai <text>")
 | 
			
		||||
            .alias("chat")
 | 
			
		||||
            .action(openai)
 | 
			
		||||
        )
 | 
			
		||||
        .command(
 | 
			
		||||
            Command::new("openai-key")
 | 
			
		||||
            .description("openai-key <API_KEY>")
 | 
			
		||||
            .action(openai_key),
 | 
			
		||||
        )
 | 
			
		||||
        ;
 | 
			
		||||
    app.run(args);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn ascii_art(c: &Context) {
 | 
			
		||||
    if let Ok(t) = c.string_flag("type") {
 | 
			
		||||
        c_ascii(&t);
 | 
			
		||||
    } else {
 | 
			
		||||
        c_ascii("color");
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn bot(c: &Context) {
 | 
			
		||||
    refresh(c);
 | 
			
		||||
    loop {
 | 
			
		||||
        c_bot(c);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn follow_all(_c: &Context) {
 | 
			
		||||
    c_follow_all();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn openai_key(c: &Context) {
 | 
			
		||||
    c_openai_key(c);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn token(c: &Context) {
 | 
			
		||||
    let m = c.args[0].to_string();
 | 
			
		||||
    let h = async {
 | 
			
		||||
        if let Ok(p) = c.string_flag("password") {
 | 
			
		||||
            if let Ok(s) = c.string_flag("server") {
 | 
			
		||||
                let res = token::post_request(m.to_string(), p.to_string(), s.to_string()).await;
 | 
			
		||||
                w_cfg(&s, &res, &p);
 | 
			
		||||
            } else {
 | 
			
		||||
                let res =
 | 
			
		||||
                    token::post_request(m.to_string(), p.to_string(), "bsky.social".to_string())
 | 
			
		||||
                        .await;
 | 
			
		||||
                w_cfg(&"bsky.social", &res, &p);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    };
 | 
			
		||||
    let res = tokio::runtime::Runtime::new().unwrap().block_on(h);
 | 
			
		||||
    return res;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn refresh(_c: &Context) {
 | 
			
		||||
    let h = async {
 | 
			
		||||
        let session = session::get_request().await;
 | 
			
		||||
        if session == "err" {
 | 
			
		||||
            let res = refresh::post_request().await;
 | 
			
		||||
            println!("{}", res);
 | 
			
		||||
            if res == "err" {
 | 
			
		||||
                let m = data_toml(&"handle");
 | 
			
		||||
                let p = data_toml(&"password");
 | 
			
		||||
                let s = data_toml(&"host");
 | 
			
		||||
                println!("handle:{}, pass:{}, host:{}", m, p, s);
 | 
			
		||||
                let res = token::post_request(m.to_string(), p.to_string(), s.to_string()).await;
 | 
			
		||||
                w_cfg(&s, &res, &p);
 | 
			
		||||
                println!("res:{}", res);
 | 
			
		||||
            } else {
 | 
			
		||||
                w_refresh(&res);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    };
 | 
			
		||||
    let res = tokio::runtime::Runtime::new().unwrap().block_on(h);
 | 
			
		||||
    return res;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn notify(c: &Context) {
 | 
			
		||||
    refresh(c);
 | 
			
		||||
    let h = async {
 | 
			
		||||
        let j = notify::get_request(100).await;
 | 
			
		||||
        println!("{}", j);
 | 
			
		||||
    };
 | 
			
		||||
    let res = tokio::runtime::Runtime::new().unwrap().block_on(h);
 | 
			
		||||
    return res;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn did(c: &Context) {
 | 
			
		||||
    refresh(c);
 | 
			
		||||
    let h = async {
 | 
			
		||||
        if c.args.len() == 0 {
 | 
			
		||||
            let j = describe::get_request(data_toml(&"handle")).await;
 | 
			
		||||
            println!("{}", j);
 | 
			
		||||
        } else {
 | 
			
		||||
            let j = describe::get_request(c.args[0].to_string()).await;
 | 
			
		||||
            println!("{}", j);
 | 
			
		||||
        }
 | 
			
		||||
    };
 | 
			
		||||
    let res = tokio::runtime::Runtime::new().unwrap().block_on(h);
 | 
			
		||||
    return res;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn timeline(c: &Context) {
 | 
			
		||||
    refresh(c);
 | 
			
		||||
    let h = async {
 | 
			
		||||
        if c.args.len() == 0 {
 | 
			
		||||
            let str = timeline_author::get_request(data_toml(&"handle").to_string());
 | 
			
		||||
            println!("{}", str.await);
 | 
			
		||||
        } else {
 | 
			
		||||
            let str = timeline_author::get_request(c.args[0].to_string());
 | 
			
		||||
            println!("{}", str.await);
 | 
			
		||||
        }
 | 
			
		||||
    };
 | 
			
		||||
    let res = tokio::runtime::Runtime::new().unwrap().block_on(h);
 | 
			
		||||
    return res;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn post(c: &Context) {
 | 
			
		||||
    refresh(c);
 | 
			
		||||
    let m = c.args[0].to_string();
 | 
			
		||||
    let h = async {
 | 
			
		||||
        if let Ok(link) = c.string_flag("link") {
 | 
			
		||||
            let e = link.chars().count();
 | 
			
		||||
            let s = 0;
 | 
			
		||||
            let str =
 | 
			
		||||
                post_link::post_request(m.to_string(), link.to_string(), s, e.try_into().unwrap());
 | 
			
		||||
            println!("{}", str.await);
 | 
			
		||||
        } else {
 | 
			
		||||
            let str = post::post_request(m.to_string());
 | 
			
		||||
            println!("{}", str.await);
 | 
			
		||||
        }
 | 
			
		||||
    };
 | 
			
		||||
    let res = tokio::runtime::Runtime::new().unwrap().block_on(h);
 | 
			
		||||
    return res;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn like(c: &Context) {
 | 
			
		||||
    refresh(c);
 | 
			
		||||
    let m = c.args[0].to_string();
 | 
			
		||||
    let h = async {
 | 
			
		||||
        if let Ok(uri) = c.string_flag("uri") {
 | 
			
		||||
            let str = like::post_request(m.to_string(), uri);
 | 
			
		||||
            println!("{}", str.await);
 | 
			
		||||
        }
 | 
			
		||||
    };
 | 
			
		||||
    let res = tokio::runtime::Runtime::new().unwrap().block_on(h);
 | 
			
		||||
    return res;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn repost(c: &Context) {
 | 
			
		||||
    refresh(c);
 | 
			
		||||
    let m = c.args[0].to_string();
 | 
			
		||||
    let h = async {
 | 
			
		||||
        if let Ok(uri) = c.string_flag("uri") {
 | 
			
		||||
            let str = repost::post_request(m.to_string(), uri);
 | 
			
		||||
            println!("{}", str.await);
 | 
			
		||||
        }
 | 
			
		||||
    };
 | 
			
		||||
    let res = tokio::runtime::Runtime::new().unwrap().block_on(h);
 | 
			
		||||
    return res;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn follow(c: &Context) {
 | 
			
		||||
    refresh(c);
 | 
			
		||||
    let m = c.args[0].to_string();
 | 
			
		||||
    let h = async {
 | 
			
		||||
        let handle = data_toml(&"handle");
 | 
			
		||||
        if let Ok(cursor) = c.string_flag("cursor") {
 | 
			
		||||
            let str = follow::post_request(m.to_string());
 | 
			
		||||
            println!("{}", str.await);
 | 
			
		||||
            //let str = follow::delete_request(m.to_string(), delete.to_string());
 | 
			
		||||
            //let str = followers::get_request(handle,Some("".to_string()));
 | 
			
		||||
            //let str = followers::get_request(handle,Some(cursor.to_string()));
 | 
			
		||||
            //let str = follows::get_request(handle,Some("".to_string()));
 | 
			
		||||
            let str = follows::get_request(handle, Some(cursor.to_string()));
 | 
			
		||||
            println!("{}", str.await);
 | 
			
		||||
        }
 | 
			
		||||
    };
 | 
			
		||||
    let res = tokio::runtime::Runtime::new().unwrap().block_on(h);
 | 
			
		||||
    return res;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn profile(c: &Context) {
 | 
			
		||||
    refresh(c);
 | 
			
		||||
    let h = async {
 | 
			
		||||
        if c.args.len() == 0 {
 | 
			
		||||
            let j = profile::get_request(data_toml(&"handle")).await;
 | 
			
		||||
            println!("{}", j);
 | 
			
		||||
        } else {
 | 
			
		||||
            let j = profile::get_request(c.args[0].to_string()).await;
 | 
			
		||||
            println!("{}", j);
 | 
			
		||||
        }
 | 
			
		||||
    };
 | 
			
		||||
    let res = tokio::runtime::Runtime::new().unwrap().block_on(h);
 | 
			
		||||
    return res;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn mention(c: &Context) {
 | 
			
		||||
    refresh(c);
 | 
			
		||||
    let m = c.args[0].to_string();
 | 
			
		||||
    let h = async {
 | 
			
		||||
        let str = profile::get_request(m.to_string()).await;
 | 
			
		||||
        let profile: ProfileIdentityResolve = serde_json::from_str(&str).unwrap();
 | 
			
		||||
        let udid = profile.did;
 | 
			
		||||
        let handle = m.to_string();
 | 
			
		||||
        let at = "@".to_owned() + &handle;
 | 
			
		||||
        let e = at.chars().count();
 | 
			
		||||
        let s = 0;
 | 
			
		||||
        if let Ok(post) = c.string_flag("post") {
 | 
			
		||||
            let str = mention::post_request(
 | 
			
		||||
                post.to_string(),
 | 
			
		||||
                at.to_string(),
 | 
			
		||||
                udid.to_string(),
 | 
			
		||||
                s,
 | 
			
		||||
                e.try_into().unwrap(),
 | 
			
		||||
            )
 | 
			
		||||
            .await;
 | 
			
		||||
            println!("{}", str);
 | 
			
		||||
        }
 | 
			
		||||
    };
 | 
			
		||||
    let res = tokio::runtime::Runtime::new().unwrap().block_on(h);
 | 
			
		||||
    return res;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn reply(c: &Context) {
 | 
			
		||||
    refresh(c);
 | 
			
		||||
    let m = c.args[0].to_string();
 | 
			
		||||
    let h = async {
 | 
			
		||||
        if let Ok(cid) = c.string_flag("cid") {
 | 
			
		||||
            if let Ok(uri) = c.string_flag("uri") {
 | 
			
		||||
                if let Ok(link) = c.string_flag("link") {
 | 
			
		||||
                    let s = 0;
 | 
			
		||||
                    let e = link.chars().count();
 | 
			
		||||
                    let str = reply_link::post_request(
 | 
			
		||||
                        m.to_string(),
 | 
			
		||||
                        link.to_string(),
 | 
			
		||||
                        s,
 | 
			
		||||
                        e.try_into().unwrap(),
 | 
			
		||||
                        cid.to_string(),
 | 
			
		||||
                        uri.to_string(),
 | 
			
		||||
                        cid.to_string(),
 | 
			
		||||
                        uri.to_string(),
 | 
			
		||||
                    )
 | 
			
		||||
                    .await;
 | 
			
		||||
                    println!("{}", str);
 | 
			
		||||
                } else {
 | 
			
		||||
                    let str = reply::post_request(
 | 
			
		||||
                        m.to_string(),
 | 
			
		||||
                        cid.to_string(),
 | 
			
		||||
                        uri.to_string(),
 | 
			
		||||
                        cid.to_string(),
 | 
			
		||||
                        uri.to_string(),
 | 
			
		||||
                    )
 | 
			
		||||
                    .await;
 | 
			
		||||
                    println!("{}", str);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    };
 | 
			
		||||
    let res = tokio::runtime::Runtime::new().unwrap().block_on(h);
 | 
			
		||||
    return res;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[tokio::main]
 | 
			
		||||
async fn c_img_upload(c: &Context) -> reqwest::Result<()> {
 | 
			
		||||
    let token = data_refresh(&"access");
 | 
			
		||||
    let atoken = "Authorization: Bearer ".to_owned() + &token;
 | 
			
		||||
    let con = "Content-Type: image/png";
 | 
			
		||||
    let url = url(&"upload_blob");
 | 
			
		||||
    let f = "@".to_owned() + &c.args[0].to_string();
 | 
			
		||||
    use std::process::Command;
 | 
			
		||||
    let output = Command::new("curl")
 | 
			
		||||
        .arg("-X")
 | 
			
		||||
        .arg("POST")
 | 
			
		||||
        .arg("-sL")
 | 
			
		||||
        .arg("-H")
 | 
			
		||||
        .arg(&con)
 | 
			
		||||
        .arg("-H")
 | 
			
		||||
        .arg(&atoken)
 | 
			
		||||
        .arg("--data-binary")
 | 
			
		||||
        .arg(&f)
 | 
			
		||||
        .arg(&url)
 | 
			
		||||
        .output()
 | 
			
		||||
        .expect("curl");
 | 
			
		||||
    let d = String::from_utf8_lossy(&output.stdout);
 | 
			
		||||
    let d = d.to_string();
 | 
			
		||||
    println!("{}", d);
 | 
			
		||||
    Ok(())
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn img_upload(c: &Context) {
 | 
			
		||||
    refresh(c);
 | 
			
		||||
    c_img_upload(c).unwrap();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn img_post(c: &Context) {
 | 
			
		||||
    let m = c.args[0].to_string();
 | 
			
		||||
    let link = c.string_flag("link").unwrap();
 | 
			
		||||
    let cid = c.string_flag("cid").unwrap();
 | 
			
		||||
    let uri = c.string_flag("uri").unwrap();
 | 
			
		||||
    let h = async {
 | 
			
		||||
        let itype = "image/png";
 | 
			
		||||
        let str = img_reply::post_request(
 | 
			
		||||
            m.to_string(),
 | 
			
		||||
            link.to_string(),
 | 
			
		||||
            cid.to_string(),
 | 
			
		||||
            uri.to_string(),
 | 
			
		||||
            itype.to_string(),
 | 
			
		||||
        )
 | 
			
		||||
        .await;
 | 
			
		||||
        println!("{}", str);
 | 
			
		||||
    };
 | 
			
		||||
    let res = tokio::runtime::Runtime::new().unwrap().block_on(h);
 | 
			
		||||
    return res;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn reply_og(c: &Context) {
 | 
			
		||||
    refresh(c);
 | 
			
		||||
 | 
			
		||||
    //let mut admin = "".to_string();
 | 
			
		||||
    //if c.string_flag("admin").is_ok() {
 | 
			
		||||
    //    admin = c.string_flag("admin").unwrap();
 | 
			
		||||
    //}
 | 
			
		||||
 | 
			
		||||
    let m = c.args[0].to_string();
 | 
			
		||||
    let link = c.string_flag("link").unwrap();
 | 
			
		||||
    let cid = c.string_flag("cid").unwrap();
 | 
			
		||||
    let uri = c.string_flag("uri").unwrap();
 | 
			
		||||
    let title = c.string_flag("title").unwrap();
 | 
			
		||||
    let desc = c.string_flag("description").unwrap();
 | 
			
		||||
    let img = c.string_flag("img").unwrap();
 | 
			
		||||
    let h = async {
 | 
			
		||||
        let str = reply_og::post_request(m, link, cid, uri, img, title, desc);
 | 
			
		||||
        println!("{}", str.await);
 | 
			
		||||
    };
 | 
			
		||||
    let res = tokio::runtime::Runtime::new().unwrap().block_on(h);
 | 
			
		||||
    return res;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn openai(c: &Context) {
 | 
			
		||||
    let m = c.args[0].to_string();
 | 
			
		||||
    let h = async {
 | 
			
		||||
        let str = openai::post_request(m.to_string()).await;
 | 
			
		||||
        println!("{}", str);
 | 
			
		||||
    };
 | 
			
		||||
    let res = tokio::runtime::Runtime::new().unwrap().block_on(h);
 | 
			
		||||
    return res;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										57
									
								
								src/mention.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										57
									
								
								src/mention.rs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,57 @@
 | 
			
		||||
extern crate reqwest;
 | 
			
		||||
use crate::data_toml;
 | 
			
		||||
use crate::data_refresh;
 | 
			
		||||
use crate::url;
 | 
			
		||||
use iso8601_timestamp::Timestamp;
 | 
			
		||||
use serde_json::json;
 | 
			
		||||
 | 
			
		||||
pub async fn post_request(text: String, at: String, udid: String, s: i32, e: i32) -> String {
 | 
			
		||||
    let token = data_refresh(&"access");
 | 
			
		||||
    let did = data_toml(&"did");
 | 
			
		||||
    let handle = data_toml(&"handle");
 | 
			
		||||
 | 
			
		||||
    let url = url(&"record_create");
 | 
			
		||||
    let col = "app.bsky.feed.post".to_string();
 | 
			
		||||
 | 
			
		||||
    let d = Timestamp::now_utc();
 | 
			
		||||
    let d = d.to_string();
 | 
			
		||||
 | 
			
		||||
    let post = Some(json!({
 | 
			
		||||
        "did": did.to_string(),
 | 
			
		||||
        "repo": handle.to_string(),
 | 
			
		||||
        "collection": col.to_string(),
 | 
			
		||||
        "record": {
 | 
			
		||||
            "text": at.to_string() + &" ".to_string() + &text.to_string(),
 | 
			
		||||
            "$type": "app.bsky.feed.post",
 | 
			
		||||
            "createdAt": d.to_string(),
 | 
			
		||||
            "facets": [
 | 
			
		||||
            {
 | 
			
		||||
                "$type": "app.bsky.richtext.facet",
 | 
			
		||||
                "index": {
 | 
			
		||||
                    "byteEnd": e,
 | 
			
		||||
                    "byteStart": s
 | 
			
		||||
                },"features": [
 | 
			
		||||
                {
 | 
			
		||||
                    "did": udid.to_string(),
 | 
			
		||||
                    "$type": "app.bsky.richtext.facet#mention"
 | 
			
		||||
                }
 | 
			
		||||
                ]
 | 
			
		||||
            }
 | 
			
		||||
            ]
 | 
			
		||||
        },
 | 
			
		||||
    }));
 | 
			
		||||
 | 
			
		||||
    let client = reqwest::Client::new();
 | 
			
		||||
    let res = client
 | 
			
		||||
        .post(url)
 | 
			
		||||
        .json(&post)
 | 
			
		||||
        .header("Authorization", "Bearer ".to_owned() + &token)
 | 
			
		||||
        .send()
 | 
			
		||||
        .await
 | 
			
		||||
        .unwrap()
 | 
			
		||||
        .text()
 | 
			
		||||
        .await
 | 
			
		||||
        .unwrap();
 | 
			
		||||
 | 
			
		||||
    return res;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										30
									
								
								src/notify.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								src/notify.rs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,30 @@
 | 
			
		||||
extern crate reqwest;
 | 
			
		||||
use crate::data_refresh;
 | 
			
		||||
use crate::url;
 | 
			
		||||
//use serde_json::json;
 | 
			
		||||
 | 
			
		||||
pub async fn get_request(limit: i32) -> String {
 | 
			
		||||
    let token = data_refresh(&"access");
 | 
			
		||||
    let url = url(&"notify_list");
 | 
			
		||||
 | 
			
		||||
    let client = reqwest::Client::new();
 | 
			
		||||
    let res = client
 | 
			
		||||
        .get(url)
 | 
			
		||||
        .query(&[("limit", limit)])
 | 
			
		||||
        .header("Authorization", "Bearer ".to_owned() + &token)
 | 
			
		||||
        .send()
 | 
			
		||||
        .await
 | 
			
		||||
        .unwrap();
 | 
			
		||||
 | 
			
		||||
    let status_ref = res.error_for_status_ref();
 | 
			
		||||
 | 
			
		||||
    match status_ref {
 | 
			
		||||
        Ok(_) => {
 | 
			
		||||
            return res.text().await.unwrap();
 | 
			
		||||
        }
 | 
			
		||||
        Err(_e) => {
 | 
			
		||||
            let e = "err".to_string();
 | 
			
		||||
            return e;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										27
									
								
								src/notify_read.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								src/notify_read.rs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,27 @@
 | 
			
		||||
extern crate reqwest;
 | 
			
		||||
use crate::data_refresh;
 | 
			
		||||
use crate::url;
 | 
			
		||||
use serde_json::json;
 | 
			
		||||
 | 
			
		||||
pub async fn post_request(time: String) -> String {
 | 
			
		||||
    let token = data_refresh(&"access");
 | 
			
		||||
    let url = url(&"notify_update");
 | 
			
		||||
 | 
			
		||||
    let post = Some(json!({
 | 
			
		||||
        "seenAt": time.to_string(),
 | 
			
		||||
    }));
 | 
			
		||||
 | 
			
		||||
    let client = reqwest::Client::new();
 | 
			
		||||
    let res = client
 | 
			
		||||
        .post(url)
 | 
			
		||||
        .json(&post)
 | 
			
		||||
        .header("Authorization", "Bearer ".to_owned() + &token)
 | 
			
		||||
        .send()
 | 
			
		||||
        .await
 | 
			
		||||
        .unwrap()
 | 
			
		||||
        .text()
 | 
			
		||||
        .await
 | 
			
		||||
        .unwrap();
 | 
			
		||||
 | 
			
		||||
    return res;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										58
									
								
								src/openai.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										58
									
								
								src/openai.rs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,58 @@
 | 
			
		||||
extern crate reqwest;
 | 
			
		||||
use crate::data::Open;
 | 
			
		||||
use serde::{Deserialize, Serialize};
 | 
			
		||||
use serde_json::json;
 | 
			
		||||
 | 
			
		||||
#[derive(Serialize, Deserialize, Debug)]
 | 
			
		||||
#[serde(tag = "type")]
 | 
			
		||||
struct OpenChar {
 | 
			
		||||
    choices: Vec<ChoicesChar>,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[derive(Serialize, Deserialize, Debug)]
 | 
			
		||||
struct ChoicesChar {
 | 
			
		||||
    message: OpenContent,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[derive(Serialize, Deserialize, Debug)]
 | 
			
		||||
struct OpenContent {
 | 
			
		||||
    content: String,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
pub async fn post_request(prompt: String) -> String {
 | 
			
		||||
    let data = Open::new().unwrap();
 | 
			
		||||
    let data = Open { api: data.api };
 | 
			
		||||
 | 
			
		||||
    let setting = "あなたはyuiという作品のアイと呼ばれるキャラクターです。第一人称は「アイ」です。
 | 
			
		||||
    第二人称はできる限り省略してください。
 | 
			
		||||
    自由気ままな優しさを兼ね備えます。
 | 
			
		||||
    口調例:アイね、ここでお昼寝するの。
 | 
			
		||||
    幼い子供の口調で話してください。
 | 
			
		||||
    誕生日は1月23日。
 | 
			
		||||
    自分を信じて。
 | 
			
		||||
        ";
 | 
			
		||||
 | 
			
		||||
    let post = Some(json!({
 | 
			
		||||
    "model": "gpt-3.5-turbo",
 | 
			
		||||
    "messages": [
 | 
			
		||||
    {"role": "system", "content": &setting.to_string()},
 | 
			
		||||
    {"role": "user", "content": &prompt.to_string()},
 | 
			
		||||
    ]
 | 
			
		||||
    }));
 | 
			
		||||
 | 
			
		||||
    let client = reqwest::Client::new();
 | 
			
		||||
    let res = client
 | 
			
		||||
        .post("https://api.openai.com/v1/chat/completions")
 | 
			
		||||
        .header("Authorization", "Bearer ".to_owned() + &data.api)
 | 
			
		||||
        .json(&post)
 | 
			
		||||
        .send()
 | 
			
		||||
        .await
 | 
			
		||||
        .unwrap()
 | 
			
		||||
        .text()
 | 
			
		||||
        .await
 | 
			
		||||
        .unwrap();
 | 
			
		||||
    let p: OpenChar = serde_json::from_str(&res).unwrap();
 | 
			
		||||
    let o = &p.choices[0].message.content;
 | 
			
		||||
 | 
			
		||||
    return o.to_string();
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										42
									
								
								src/post.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										42
									
								
								src/post.rs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,42 @@
 | 
			
		||||
extern crate reqwest;
 | 
			
		||||
use crate::data_toml;
 | 
			
		||||
use crate::data_refresh;
 | 
			
		||||
use crate::url;
 | 
			
		||||
use iso8601_timestamp::Timestamp;
 | 
			
		||||
use serde_json::json;
 | 
			
		||||
 | 
			
		||||
pub async fn post_request(text: String) -> String {
 | 
			
		||||
    let token = data_refresh(&"access");
 | 
			
		||||
    let did = data_toml(&"did");
 | 
			
		||||
    let handle = data_toml(&"handle");
 | 
			
		||||
 | 
			
		||||
    let url = url(&"record_create");
 | 
			
		||||
    let col = "app.bsky.feed.post".to_string();
 | 
			
		||||
 | 
			
		||||
    let d = Timestamp::now_utc();
 | 
			
		||||
    let d = d.to_string();
 | 
			
		||||
 | 
			
		||||
    let post = Some(json!({
 | 
			
		||||
        "repo": handle.to_string(),
 | 
			
		||||
        "did": did.to_string(),
 | 
			
		||||
        "collection": col.to_string(),
 | 
			
		||||
        "record": {
 | 
			
		||||
            "text": text.to_string(),
 | 
			
		||||
            "createdAt": d.to_string(),
 | 
			
		||||
        },
 | 
			
		||||
    }));
 | 
			
		||||
 | 
			
		||||
    let client = reqwest::Client::new();
 | 
			
		||||
    let res = client
 | 
			
		||||
        .post(url)
 | 
			
		||||
        .json(&post)
 | 
			
		||||
        .header("Authorization", "Bearer ".to_owned() + &token)
 | 
			
		||||
        .send()
 | 
			
		||||
        .await
 | 
			
		||||
        .unwrap()
 | 
			
		||||
        .text()
 | 
			
		||||
        .await
 | 
			
		||||
        .unwrap();
 | 
			
		||||
 | 
			
		||||
    return res;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										56
									
								
								src/post_link.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										56
									
								
								src/post_link.rs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,56 @@
 | 
			
		||||
extern crate reqwest;
 | 
			
		||||
use crate::data_toml;
 | 
			
		||||
use crate::data_refresh;
 | 
			
		||||
use crate::url;
 | 
			
		||||
use iso8601_timestamp::Timestamp;
 | 
			
		||||
use serde_json::json;
 | 
			
		||||
 | 
			
		||||
pub async fn post_request(text: String, link: String, s: i32, e: i32) -> String {
 | 
			
		||||
    let token = data_refresh(&"access");
 | 
			
		||||
    let did = data_toml(&"did");
 | 
			
		||||
    let handle = data_toml(&"handle");
 | 
			
		||||
 | 
			
		||||
    let url = url(&"record_create");
 | 
			
		||||
    let col = "app.bsky.feed.post".to_string();
 | 
			
		||||
 | 
			
		||||
    let d = Timestamp::now_utc();
 | 
			
		||||
    let d = d.to_string();
 | 
			
		||||
 | 
			
		||||
    let post = Some(json!({
 | 
			
		||||
        "repo": handle.to_string(),
 | 
			
		||||
        "did": did.to_string(),
 | 
			
		||||
        "collection": col.to_string(),
 | 
			
		||||
        "record": {
 | 
			
		||||
            "text": link.to_string() + &" ".to_string() + &text.to_string(),
 | 
			
		||||
            "createdAt": d.to_string(),
 | 
			
		||||
            "facets": [
 | 
			
		||||
            {
 | 
			
		||||
                "index": {
 | 
			
		||||
                    "byteStart": s,
 | 
			
		||||
                    "byteEnd": e
 | 
			
		||||
                },
 | 
			
		||||
                "features": [
 | 
			
		||||
                {
 | 
			
		||||
                    "$type": "app.bsky.richtext.facet#link",
 | 
			
		||||
                    "uri": link.to_string()
 | 
			
		||||
                }
 | 
			
		||||
                ]
 | 
			
		||||
            }
 | 
			
		||||
            ],
 | 
			
		||||
        },
 | 
			
		||||
    }));
 | 
			
		||||
 | 
			
		||||
    let client = reqwest::Client::new();
 | 
			
		||||
    let res = client
 | 
			
		||||
        .post(url)
 | 
			
		||||
        .json(&post)
 | 
			
		||||
        .header("Authorization", "Bearer ".to_owned() + &token)
 | 
			
		||||
        .send()
 | 
			
		||||
        .await
 | 
			
		||||
        .unwrap()
 | 
			
		||||
        .text()
 | 
			
		||||
        .await
 | 
			
		||||
        .unwrap();
 | 
			
		||||
 | 
			
		||||
    return res;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										21
									
								
								src/profile.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								src/profile.rs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,21 @@
 | 
			
		||||
extern crate reqwest;
 | 
			
		||||
use crate::data_refresh;
 | 
			
		||||
use crate::url;
 | 
			
		||||
 | 
			
		||||
pub async fn get_request(user: String) -> String {
 | 
			
		||||
    let token = data_refresh(&"access");
 | 
			
		||||
    let url = url(&"profile_get") + &"?handle=" + &user;
 | 
			
		||||
 | 
			
		||||
    let client = reqwest::Client::new();
 | 
			
		||||
    let res = client
 | 
			
		||||
        .get(url)
 | 
			
		||||
        .header("Authorization", "Bearer ".to_owned() + &token)
 | 
			
		||||
        .send()
 | 
			
		||||
        .await
 | 
			
		||||
        .unwrap()
 | 
			
		||||
        .text()
 | 
			
		||||
        .await
 | 
			
		||||
        .unwrap();
 | 
			
		||||
 | 
			
		||||
    return res;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										28
									
								
								src/refresh.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								src/refresh.rs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,28 @@
 | 
			
		||||
extern crate reqwest;
 | 
			
		||||
use crate::data_toml;
 | 
			
		||||
use crate::url;
 | 
			
		||||
 | 
			
		||||
pub async fn post_request() -> String {
 | 
			
		||||
    let refresh = data_toml(&"refresh");
 | 
			
		||||
    let url = url(&"session_refresh");
 | 
			
		||||
 | 
			
		||||
    let client = reqwest::Client::new();
 | 
			
		||||
    let res = client
 | 
			
		||||
        .post(url)
 | 
			
		||||
        .header("Authorization", "Bearer ".to_owned() + &refresh)
 | 
			
		||||
        .send()
 | 
			
		||||
        .await
 | 
			
		||||
        .unwrap();
 | 
			
		||||
 | 
			
		||||
    let status_ref = res.error_for_status_ref();
 | 
			
		||||
 | 
			
		||||
    match status_ref {
 | 
			
		||||
        Ok(_) => {
 | 
			
		||||
            return res.text().await.unwrap();
 | 
			
		||||
        }
 | 
			
		||||
        Err(_e) => {
 | 
			
		||||
            let e = "err".to_string();
 | 
			
		||||
            return e;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										59
									
								
								src/reply.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										59
									
								
								src/reply.rs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,59 @@
 | 
			
		||||
extern crate reqwest;
 | 
			
		||||
use crate::data_toml;
 | 
			
		||||
use crate::data_refresh;
 | 
			
		||||
use crate::url;
 | 
			
		||||
use iso8601_timestamp::Timestamp;
 | 
			
		||||
use serde_json::json;
 | 
			
		||||
 | 
			
		||||
pub async fn post_request(
 | 
			
		||||
    text: String,
 | 
			
		||||
    cid: String,
 | 
			
		||||
    uri: String,
 | 
			
		||||
    cid_root: String,
 | 
			
		||||
    uri_root: String,
 | 
			
		||||
) -> String {
 | 
			
		||||
    let token = data_refresh(&"access");
 | 
			
		||||
    let did = data_toml(&"did");
 | 
			
		||||
    let handle = data_toml(&"handle");
 | 
			
		||||
 | 
			
		||||
    let url = url(&"record_create");
 | 
			
		||||
    //let url = "https://bsky.social/xrpc/com.atproto.repo.createRecord";
 | 
			
		||||
    let col = "app.bsky.feed.post".to_string();
 | 
			
		||||
 | 
			
		||||
    let d = Timestamp::now_utc();
 | 
			
		||||
    let d = d.to_string();
 | 
			
		||||
 | 
			
		||||
    let post = Some(json!({
 | 
			
		||||
        "repo": handle.to_string(),
 | 
			
		||||
        "did": did.to_string(),
 | 
			
		||||
        "collection": col.to_string(),
 | 
			
		||||
        "record": {
 | 
			
		||||
            "text": text.to_string(),
 | 
			
		||||
            "createdAt": d.to_string(),
 | 
			
		||||
            "reply": {
 | 
			
		||||
                "root": {
 | 
			
		||||
                    "cid": cid_root.to_string(),
 | 
			
		||||
                    "uri": uri_root.to_string()
 | 
			
		||||
                },
 | 
			
		||||
                "parent": {
 | 
			
		||||
                    "cid": cid.to_string(),
 | 
			
		||||
                    "uri": uri.to_string()
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        },
 | 
			
		||||
    }));
 | 
			
		||||
 | 
			
		||||
    let client = reqwest::Client::new();
 | 
			
		||||
    let res = client
 | 
			
		||||
        .post(url)
 | 
			
		||||
        .json(&post)
 | 
			
		||||
        .header("Authorization", "Bearer ".to_owned() + &token)
 | 
			
		||||
        .send()
 | 
			
		||||
        .await
 | 
			
		||||
        .unwrap()
 | 
			
		||||
        .text()
 | 
			
		||||
        .await
 | 
			
		||||
        .unwrap();
 | 
			
		||||
 | 
			
		||||
    return res;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										75
									
								
								src/reply_link.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										75
									
								
								src/reply_link.rs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,75 @@
 | 
			
		||||
extern crate reqwest;
 | 
			
		||||
use crate::data_toml;
 | 
			
		||||
use crate::data_refresh;
 | 
			
		||||
use crate::url;
 | 
			
		||||
use iso8601_timestamp::Timestamp;
 | 
			
		||||
use serde_json::json;
 | 
			
		||||
 | 
			
		||||
pub async fn post_request(
 | 
			
		||||
    text: String,
 | 
			
		||||
    link: String,
 | 
			
		||||
    s: i32,
 | 
			
		||||
    e: i32,
 | 
			
		||||
    cid: String,
 | 
			
		||||
    uri: String,
 | 
			
		||||
    cid_root: String,
 | 
			
		||||
    uri_root: String,
 | 
			
		||||
) -> String {
 | 
			
		||||
    let token = data_refresh(&"access");
 | 
			
		||||
    let did = data_toml(&"did");
 | 
			
		||||
    let handle = data_toml(&"handle");
 | 
			
		||||
 | 
			
		||||
    let url = url(&"record_create");
 | 
			
		||||
    let col = "app.bsky.feed.post".to_string();
 | 
			
		||||
 | 
			
		||||
    let d = Timestamp::now_utc();
 | 
			
		||||
    let d = d.to_string();
 | 
			
		||||
 | 
			
		||||
    let post = Some(json!({
 | 
			
		||||
        "repo": handle.to_string(),
 | 
			
		||||
        "did": did.to_string(),
 | 
			
		||||
        "collection": col.to_string(),
 | 
			
		||||
        "record": {
 | 
			
		||||
            "text": link.to_string() + &" ".to_string() + &text.to_string(),
 | 
			
		||||
            "createdAt": d.to_string(),
 | 
			
		||||
            "reply": {
 | 
			
		||||
                "root": {
 | 
			
		||||
                    "cid": cid_root.to_string(),
 | 
			
		||||
                    "uri": uri_root.to_string()
 | 
			
		||||
                },
 | 
			
		||||
                "parent": {
 | 
			
		||||
                    "cid": cid.to_string(),
 | 
			
		||||
                    "uri": uri.to_string()
 | 
			
		||||
                }
 | 
			
		||||
            },
 | 
			
		||||
            "facets": [
 | 
			
		||||
            {
 | 
			
		||||
                "index": {
 | 
			
		||||
                    "byteStart": s,
 | 
			
		||||
                    "byteEnd": e
 | 
			
		||||
                },
 | 
			
		||||
                "features": [
 | 
			
		||||
                {
 | 
			
		||||
                    "$type": "app.bsky.richtext.facet#link",
 | 
			
		||||
                    "uri": link.to_string()
 | 
			
		||||
                }
 | 
			
		||||
                ]
 | 
			
		||||
            }
 | 
			
		||||
            ],
 | 
			
		||||
        },
 | 
			
		||||
    }));
 | 
			
		||||
 | 
			
		||||
    let client = reqwest::Client::new();
 | 
			
		||||
    let res = client
 | 
			
		||||
        .post(url)
 | 
			
		||||
        .json(&post)
 | 
			
		||||
        .header("Authorization", "Bearer ".to_owned() + &token)
 | 
			
		||||
        .send()
 | 
			
		||||
        .await
 | 
			
		||||
        .unwrap()
 | 
			
		||||
        .text()
 | 
			
		||||
        .await
 | 
			
		||||
        .unwrap();
 | 
			
		||||
 | 
			
		||||
    return res;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										76
									
								
								src/reply_og.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										76
									
								
								src/reply_og.rs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,76 @@
 | 
			
		||||
extern crate reqwest;
 | 
			
		||||
use crate::data_toml;
 | 
			
		||||
use crate::data_refresh;
 | 
			
		||||
use crate::url;
 | 
			
		||||
use iso8601_timestamp::Timestamp;
 | 
			
		||||
use serde_json::json;
 | 
			
		||||
 | 
			
		||||
pub async fn post_request(
 | 
			
		||||
    m: String,
 | 
			
		||||
    link: String,
 | 
			
		||||
    cid: String,
 | 
			
		||||
    uri: String,
 | 
			
		||||
    img: String,
 | 
			
		||||
    title: String,
 | 
			
		||||
    description: String,
 | 
			
		||||
) -> String {
 | 
			
		||||
    let token = data_refresh(&"access");
 | 
			
		||||
    let did = data_toml(&"did");
 | 
			
		||||
    let handle = data_toml(&"handle");
 | 
			
		||||
 | 
			
		||||
    let url = url(&"record_create");
 | 
			
		||||
    let col = "app.bsky.feed.post".to_string();
 | 
			
		||||
 | 
			
		||||
    let d = Timestamp::now_utc();
 | 
			
		||||
    let d = d.to_string();
 | 
			
		||||
 | 
			
		||||
    let post = Some(json!({
 | 
			
		||||
        "repo": handle.to_string(),
 | 
			
		||||
        "did": did.to_string(),
 | 
			
		||||
        "collection": col.to_string(),
 | 
			
		||||
        "record": {
 | 
			
		||||
            "createdAt": d.to_string(),
 | 
			
		||||
            "text": m.to_string(),
 | 
			
		||||
            "embed": {
 | 
			
		||||
                "$type": "app.bsky.embed.external",
 | 
			
		||||
                "external": {
 | 
			
		||||
                    "uri": link.to_string(),
 | 
			
		||||
                    "thumb": {
 | 
			
		||||
                      "$type": "blob",
 | 
			
		||||
                      "ref": {
 | 
			
		||||
                        "$link": img.to_string()
 | 
			
		||||
                      },
 | 
			
		||||
                      "mimeType": "image/jpeg",
 | 
			
		||||
                      "size": 0
 | 
			
		||||
                    },
 | 
			
		||||
                    "title": title.to_string(),
 | 
			
		||||
                    "description": description.to_string()
 | 
			
		||||
                }
 | 
			
		||||
            },
 | 
			
		||||
            "reply": {
 | 
			
		||||
                "root": {
 | 
			
		||||
                    "cid": cid.to_string(),
 | 
			
		||||
                    "uri": uri.to_string()
 | 
			
		||||
                },
 | 
			
		||||
                "parent": {
 | 
			
		||||
                    "cid": cid.to_string(),
 | 
			
		||||
                    "uri": uri.to_string()
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }));
 | 
			
		||||
 | 
			
		||||
    let client = reqwest::Client::new();
 | 
			
		||||
    let res = client
 | 
			
		||||
        .post(url)
 | 
			
		||||
        .json(&post)
 | 
			
		||||
        .header("Authorization", "Bearer ".to_owned() + &token)
 | 
			
		||||
        .send()
 | 
			
		||||
        .await
 | 
			
		||||
        .unwrap()
 | 
			
		||||
        .text()
 | 
			
		||||
        .await
 | 
			
		||||
        .unwrap();
 | 
			
		||||
 | 
			
		||||
    return res;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										45
									
								
								src/repost.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										45
									
								
								src/repost.rs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,45 @@
 | 
			
		||||
extern crate reqwest;
 | 
			
		||||
use crate::data_toml;
 | 
			
		||||
use crate::data_refresh;
 | 
			
		||||
use crate::url;
 | 
			
		||||
use iso8601_timestamp::Timestamp;
 | 
			
		||||
use serde_json::json;
 | 
			
		||||
 | 
			
		||||
pub async fn post_request(cid: String, uri: String) -> String {
 | 
			
		||||
    let token = data_refresh(&"access");
 | 
			
		||||
    let did = data_toml(&"did");
 | 
			
		||||
    let handle = data_toml(&"handle");
 | 
			
		||||
 | 
			
		||||
    let url = url(&"record_create");
 | 
			
		||||
    let col = "app.bsky.feed.repost".to_string();
 | 
			
		||||
 | 
			
		||||
    let d = Timestamp::now_utc();
 | 
			
		||||
    let d = d.to_string();
 | 
			
		||||
 | 
			
		||||
    let post = Some(json!({
 | 
			
		||||
        "repo": handle.to_string(),
 | 
			
		||||
        "did": did.to_string(),
 | 
			
		||||
        "collection": col.to_string(),
 | 
			
		||||
        "record": {
 | 
			
		||||
            "subject": {
 | 
			
		||||
                "uri": uri.to_string(),
 | 
			
		||||
                "cid": cid.to_string()
 | 
			
		||||
            },
 | 
			
		||||
            "createdAt": d.to_string(),
 | 
			
		||||
        },
 | 
			
		||||
    }));
 | 
			
		||||
 | 
			
		||||
    let client = reqwest::Client::new();
 | 
			
		||||
    let res = client
 | 
			
		||||
        .post(url)
 | 
			
		||||
        .json(&post)
 | 
			
		||||
        .header("Authorization", "Bearer ".to_owned() + &token)
 | 
			
		||||
        .send()
 | 
			
		||||
        .await
 | 
			
		||||
        .unwrap()
 | 
			
		||||
        .text()
 | 
			
		||||
        .await
 | 
			
		||||
        .unwrap();
 | 
			
		||||
 | 
			
		||||
    return res;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										28
									
								
								src/session.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								src/session.rs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,28 @@
 | 
			
		||||
extern crate reqwest;
 | 
			
		||||
use crate::data_refresh;
 | 
			
		||||
use crate::url;
 | 
			
		||||
 | 
			
		||||
pub async fn get_request() -> String {
 | 
			
		||||
    let token = data_refresh(&"access");
 | 
			
		||||
    let url = url(&"session_get");
 | 
			
		||||
 | 
			
		||||
    let client = reqwest::Client::new();
 | 
			
		||||
    let res = client
 | 
			
		||||
        .get(url)
 | 
			
		||||
        .header("Authorization", "Bearer ".to_owned() + &token)
 | 
			
		||||
        .send()
 | 
			
		||||
        .await
 | 
			
		||||
        .unwrap();
 | 
			
		||||
 | 
			
		||||
    let status_ref = res.error_for_status_ref();
 | 
			
		||||
 | 
			
		||||
    match status_ref {
 | 
			
		||||
        Ok(_) => {
 | 
			
		||||
            return res.text().await.unwrap();
 | 
			
		||||
        }
 | 
			
		||||
        Err(_e) => {
 | 
			
		||||
            let e = "err".to_string();
 | 
			
		||||
            return e;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										27
									
								
								src/timeline_author.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								src/timeline_author.rs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,27 @@
 | 
			
		||||
extern crate reqwest;
 | 
			
		||||
use crate::data_refresh;
 | 
			
		||||
use crate::url;
 | 
			
		||||
 | 
			
		||||
pub async fn get_request(actor: String) -> String {
 | 
			
		||||
    let token = data_refresh(&"access");
 | 
			
		||||
    let url = url(&"record_list");
 | 
			
		||||
 | 
			
		||||
    let actor = actor.to_string();
 | 
			
		||||
    //let cursor = cursor.unwrap();
 | 
			
		||||
 | 
			
		||||
    let col = "app.bsky.feed.post".to_string();
 | 
			
		||||
    let client = reqwest::Client::new();
 | 
			
		||||
    let res = client
 | 
			
		||||
        .get(url)
 | 
			
		||||
        .query(&[("repo", actor), ("collection", col)])
 | 
			
		||||
        //.query(&[("actor", actor),("cursor", cursor)])
 | 
			
		||||
        .header("Authorization", "Bearer ".to_owned() + &token)
 | 
			
		||||
        .send()
 | 
			
		||||
        .await
 | 
			
		||||
        .unwrap()
 | 
			
		||||
        .text()
 | 
			
		||||
        .await
 | 
			
		||||
        .unwrap();
 | 
			
		||||
 | 
			
		||||
    return res;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										25
									
								
								src/token.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								src/token.rs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,25 @@
 | 
			
		||||
extern crate reqwest;
 | 
			
		||||
use std::collections::HashMap;
 | 
			
		||||
 | 
			
		||||
pub async fn post_request(handle: String, pass: String, host: String) -> String {
 | 
			
		||||
    let url = "https://".to_owned()
 | 
			
		||||
        + &host.to_string()
 | 
			
		||||
        + &"/xrpc/com.atproto.server.createSession".to_string();
 | 
			
		||||
 | 
			
		||||
    let mut map = HashMap::new();
 | 
			
		||||
    map.insert("identifier", &handle);
 | 
			
		||||
    map.insert("password", &pass);
 | 
			
		||||
 | 
			
		||||
    let client = reqwest::Client::new();
 | 
			
		||||
    let res = client
 | 
			
		||||
        .post(url)
 | 
			
		||||
        .json(&map)
 | 
			
		||||
        .send()
 | 
			
		||||
        .await
 | 
			
		||||
        .unwrap()
 | 
			
		||||
        .text()
 | 
			
		||||
        .await
 | 
			
		||||
        .unwrap();
 | 
			
		||||
 | 
			
		||||
    return res;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										35
									
								
								test/ai.zsh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										35
									
								
								test/ai.zsh
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,35 @@
 | 
			
		||||
#!/bin/zsh
 | 
			
		||||
 | 
			
		||||
# https://www.docs.bsky.app/docs/get-started
 | 
			
		||||
 | 
			
		||||
case $OSTYPE in
 | 
			
		||||
	darwin*)
 | 
			
		||||
		alias date="/opt/homebrew/bin/gdate"
 | 
			
		||||
		;;
 | 
			
		||||
esac
 | 
			
		||||
d=${0:a:h}
 | 
			
		||||
 | 
			
		||||
source $d/env
 | 
			
		||||
source $d/refresh.zsh
 | 
			
		||||
source $d/token.zsh
 | 
			
		||||
source $d/reply.zsh
 | 
			
		||||
source $d/notify.zsh
 | 
			
		||||
source $d/cron.zsh
 | 
			
		||||
 | 
			
		||||
case $1 in
 | 
			
		||||
	refresh|r)
 | 
			
		||||
		refresh
 | 
			
		||||
		;;
 | 
			
		||||
	token|t)
 | 
			
		||||
		token
 | 
			
		||||
		;;
 | 
			
		||||
	reply|rep)
 | 
			
		||||
		reply
 | 
			
		||||
		;;
 | 
			
		||||
	notify|n)
 | 
			
		||||
		notify
 | 
			
		||||
		;;
 | 
			
		||||
	cron|c)
 | 
			
		||||
		cron
 | 
			
		||||
		;;
 | 
			
		||||
esac
 | 
			
		||||
							
								
								
									
										7
									
								
								test/cron.zsh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								test/cron.zsh
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,7 @@
 | 
			
		||||
function cron() {
 | 
			
		||||
	t=`docker ps |grep aios|grep Up`
 | 
			
		||||
	if [ -z "$t" ];then
 | 
			
		||||
		docker compose up -d
 | 
			
		||||
	fi
 | 
			
		||||
	exit
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										3
									
								
								test/entrypoint.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								test/entrypoint.sh
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,3 @@
 | 
			
		||||
#!/bin/zsh
 | 
			
		||||
 | 
			
		||||
ai l $HANDLE -p $PASSWORD -s $HOST && ai bot -a syui.$HOST
 | 
			
		||||
							
								
								
									
										18
									
								
								test/env
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								test/env
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,18 @@
 | 
			
		||||
cfg=~/.config/ai/test.json
 | 
			
		||||
 | 
			
		||||
if [ -f $cfg ];then
 | 
			
		||||
	host=`cat $cfg|jq -r .host`
 | 
			
		||||
	handle=`cat $cfg|jq -r .handle`
 | 
			
		||||
	pass=`cat $cfg|jq -r .password`
 | 
			
		||||
	date=`date --iso-8601=seconds`
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
if [ -f $cfg.t ];then
 | 
			
		||||
	token=`cat $cfg.t|jq -r .accessJwt`
 | 
			
		||||
	refresh=`cat $cfg.t|jq -r .refreshJwt`
 | 
			
		||||
	did=`cat $cfg.t|jq -r .did`
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
if [ ! -d $d/json ];then
 | 
			
		||||
	mkdir -p $d/json
 | 
			
		||||
fi
 | 
			
		||||
							
								
								
									
										37
									
								
								test/notify.zsh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										37
									
								
								test/notify.zsh
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,37 @@
 | 
			
		||||
function notify() {
 | 
			
		||||
	url=https://$host/xrpc/app.bsky.notification.listNotifications
 | 
			
		||||
	f=$d/json/notify.json
 | 
			
		||||
	if [ ! -f $f ];then
 | 
			
		||||
		curl -sL "Content-Type: application/json" -H "Authorization: Bearer $token" "$url?limit=100" >! $f
 | 
			
		||||
	fi
 | 
			
		||||
 | 
			
		||||
	for ((i=0;i<=99;i++))
 | 
			
		||||
	do
 | 
			
		||||
		echo "[$i]---"
 | 
			
		||||
		cid=`cat $f|jq -r ".|.[].[$i]?|.cid?"`
 | 
			
		||||
		uri=`cat $f|jq -r ".|.[].[$i]?|.uri?"`
 | 
			
		||||
		echo cid: $cid
 | 
			
		||||
		echo uri: $uri
 | 
			
		||||
		cid_r=`cat $f|jq -r ".[]|.[$i]?|.record.reply.root.cid?"`
 | 
			
		||||
 | 
			
		||||
		if [ "$cid_r" = "null" ];then
 | 
			
		||||
			continue
 | 
			
		||||
		fi
 | 
			
		||||
		uri_r=`cat $f|jq -r ".[]|.[$i]?|.record.reply.root.uri?"`
 | 
			
		||||
		cid_p=`cat $f|jq -r ".[]|.[$i]?|.record.reply.parent.cid?"`
 | 
			
		||||
		uri_p=`cat $f|jq -r ".[]|.[$i]?|.record.reply.parent.uri?"`
 | 
			
		||||
		did_p=`echo $uri_p|cut -d / -f 3`
 | 
			
		||||
		if [ "$did_p" != "did:plc:uqzpqmrjnptsxezjx4xuh2mn" ];then
 | 
			
		||||
			continue
 | 
			
		||||
		fi
 | 
			
		||||
		echo cid_root: $cid_r
 | 
			
		||||
		echo uri_root: $uri_r
 | 
			
		||||
		echo cid_parent: $cid_p
 | 
			
		||||
		echo uri_parent: $uri_p
 | 
			
		||||
		echo ---
 | 
			
		||||
		echo uri: $uri|sed "s#at://#https://bsky.app/profile/#g"|sed 's/app.bsky.feed.post/post/g'
 | 
			
		||||
		echo uri_root: $uri_r|sed "s#at://#https://bsky.app/profile/#g"|sed 's/app.bsky.feed.post/post/g'
 | 
			
		||||
		echo uri_parent: $uri_p|sed "s#at://#https://bsky.app/profile/#g"|sed 's/app.bsky.feed.post/post/g'
 | 
			
		||||
		echo ---
 | 
			
		||||
	done
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										11
									
								
								test/refresh.zsh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										11
									
								
								test/refresh.zsh
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,11 @@
 | 
			
		||||
function refresh(){
 | 
			
		||||
	token=`cat $cfg.t|jq -r .accessJwt`
 | 
			
		||||
	refresh=`cat $cfg.t|jq -r .refreshJwt`
 | 
			
		||||
	if [ ! -f $cfg ];then
 | 
			
		||||
		token
 | 
			
		||||
	fi
 | 
			
		||||
	url=https://$host/xrpc/com.atproto.server.refreshSession
 | 
			
		||||
	j=`curl -sL -X POST -H "Content-Type: application/json" -H "Authorization: Bearer $refresh" $url`
 | 
			
		||||
	echo $j
 | 
			
		||||
	echo $j >! $cfg.t
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										40
									
								
								test/reply.zsh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										40
									
								
								test/reply.zsh
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,40 @@
 | 
			
		||||
function reply() {
 | 
			
		||||
 | 
			
		||||
	#uri: https://bsky.app/profile/did:plc:4hqjfn7m6n5hno3doamuhgef/post/3kkumyv72w22o
 | 
			
		||||
	#uri_root: https://bsky.app/profile/did:plc:uqzpqmrjnptsxezjx4xuh2mn/post/3kkumysfipk2p
 | 
			
		||||
	#uri_parent: https://bsky.app/profile/did:plc:uqzpqmrjnptsxezjx4xuh2mn/post/3kkumysfipk2p
 | 
			
		||||
 | 
			
		||||
	cid=bafyreiaxz6hbqgylsxglqita73c5gzxzoatupgitd35rwjpd6dzpa4ctwi
 | 
			
		||||
	uri=at://did:plc:4hqjfn7m6n5hno3doamuhgef/app.bsky.feed.post/3kkumyv72w22o
 | 
			
		||||
	cid_root=bafyreiacxuk4ypaxbg7qxnmrvpnaej5o7azewqioelfgbuikp77jevy6hq
 | 
			
		||||
	uri_root=at://did:plc:uqzpqmrjnptsxezjx4xuh2mn/app.bsky.feed.post/3kkumysfipk2p
 | 
			
		||||
	cid_parent=bafyreiacxuk4ypaxbg7qxnmrvpnaej5o7azewqioelfgbuikp77jevy6hq
 | 
			
		||||
	uri_parent=at://did:plc:uqzpqmrjnptsxezjx4xuh2mn/app.bsky.feed.post/3kkumysfipk2p
 | 
			
		||||
 | 
			
		||||
	url="https://$host/xrpc/com.atproto.repo.createRecord"
 | 
			
		||||
	col="app.bsky.feed.post"
 | 
			
		||||
 | 
			
		||||
json="{
 | 
			
		||||
    \"repo\": \"$handle\",
 | 
			
		||||
    \"did\": \"$did\",
 | 
			
		||||
    \"collection\": \"$col\",
 | 
			
		||||
    \"record\": {
 | 
			
		||||
        \"text\": \"$text\",
 | 
			
		||||
        \"createdAt\": \"$date\",
 | 
			
		||||
        \"reply\": {
 | 
			
		||||
            \"root\": {
 | 
			
		||||
                \"cid\": \"$cid_root\",
 | 
			
		||||
                \"uri\": \"$uri_root\"
 | 
			
		||||
            },
 | 
			
		||||
            \"parent\": {
 | 
			
		||||
                \"cid\": \"$cid\",
 | 
			
		||||
                \"uri\": \"$uri\"
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}"
 | 
			
		||||
 | 
			
		||||
	echo $json|jq .
 | 
			
		||||
	url=https://$host/xrpc/com.atproto.repo.createRecord
 | 
			
		||||
	curl -sL -X POST -H "Content-Type: application/json" -H "Authorization: Bearer $token" -d "$json" $url
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										18
									
								
								test/token.zsh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										18
									
								
								test/token.zsh
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,18 @@
 | 
			
		||||
function token() {
 | 
			
		||||
		mkdir -p ~/.config/ai
 | 
			
		||||
		echo server:
 | 
			
		||||
		read host
 | 
			
		||||
 | 
			
		||||
		echo password:
 | 
			
		||||
		read pass
 | 
			
		||||
 | 
			
		||||
		echo handle:
 | 
			
		||||
		read handle
 | 
			
		||||
 | 
			
		||||
		echo "{ \"host\":\"$host\", \"password\":\"$pass\", \"handle\":\"$handle\" }" >> $cfg
 | 
			
		||||
 | 
			
		||||
	url=https://$host/xrpc/com.atproto.server.createSession
 | 
			
		||||
	j=`curl -sL -X POST -H "Content-Type: application/json" -d "{\"identifier\":\"$handle\",\"password\":\"$pass\"}" $url`
 | 
			
		||||
	echo $j
 | 
			
		||||
 echo $j >! $cfg.t
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user