fantastic

Posted on:January 15, 2024 at 03:03 PM
预计阅读时长:13 min read 字数:2501

目录

p5 art

flow field

flow field密度 30
import type p5 from "p5";
import Basic from "@components/react/p5/index.tsx";
import { Slider } from "@shadcn/ui/slider";
import { cn } from "@utils/utils";
import { useDebounce } from "@uidotdev/usehooks";
import { useCallback, useState } from "react";

export default () => {
  let [density, setDensity] = useState(30);
  let debounceDensity = useDebounce(density, 200);
  const sketch = useCallback(
    (p: p5) => {
      let points: p5.Vector[];
      let mult: number;
      const setup = () => {
        points = [];
        mult = 0.005;
        p.createCanvas(p.windowHeight / 2, p.windowHeight / 2);
        p.noiseDetail(1, 0.5);
        // p.angleMode(p.DEGREES);
        p.frameRate(120);
        p.pixelDensity(3);
        p.background(0);
        let density = debounceDensity || 200;
        let space = p.width / density;

        for (let i = 0; i < p.width; i += space) {
          for (let j = 0; j < p.height; j += space) {
            let point = p.createVector(i, j);
            points.push(point);
          }
        }
      };
      const draw = () => {
        if (p.frameCount > 1200) {
          p.noLoop();
          return;
        } else {
          p.noStroke();
          p.fill(255);
          for (let i = 0; i < points.length; i++) {
            let r = p.map(points[i].x, 0, p.width, 50, 255);
            let g = p.map(points[i].y, 0, p.height, 255, 50);
            let b = p.map(points[i].x, 0, p.width, 255, 50);
            p.fill(r, g, b);
            let noiseX = points[i].x * mult;
            let noiseY = points[i].y * mult;
            let angle = p.map(p.noise(noiseX, noiseY), 0, 1, 0, 720);
            let walk = p.createVector(p.cos(angle) * 1, p.sin(angle) * 1);
            points[i].add(walk);
            p.ellipse(points[i].x, points[i].y, 1, 1);
          }
        }
      };
      const resize = setup;
      p.setup = setup;
      p.draw = draw;
      p.windowResized = resize;
    },
    [debounceDensity]
  );
  return (
    <>
      密度{density}
      <Slider
        defaultValue={[30]}
        max={40}
        min={20}
        step={1}
        className={cn("w-[100%] m-4")}
        onValueChange={value => {
          setDensity(value[0]);
        }}
        value={[density]}
      />
      <Basic sketch={sketch}></Basic>
    </>
  );
};
  • after i changed walker angle

error

质数螺旋

prime spiral points数量5
import type p5 from "p5";
import Basic from "@components/react/p5/index.tsx";
import { useCallback, useState } from "react";
import { useDebounce } from "@uidotdev/usehooks";
import { Slider } from "@shadcn/ui/slider";
import { cn } from "@utils/utils";

export default () => {
  let [Num, setNum] = useState(5);
  let debounceNum = useDebounce(Num, 200);

  const sketch = useCallback(
    (p: p5) => {
      let points: p5.Vector[] = [];

      const setup = () => {
        p.createCanvas(p.windowWidth / 2, p.windowWidth / 2);
        for (let i = 0; i < (p.windowWidth * debounceNum) / p.PI; i++) {
          let vector = p.createVector(i, i);
          points.push(vector);
        }
        p.background(255);
        p.translate(p.windowWidth / 4, p.windowWidth / 4);
        p.stroke(0);
        p.fill(0);
        p.line(0, p.height / 2, p.width, p.height / 2);
        p.line(p.width / 2, 0, p.width / 2, p.height);
        p.noStroke();
        for (let i = 0; i < points.length; i++) {
          let len = points[i].x;
          let x1 = p.cos(len) * len;
          let y1 = p.sin(len) * len;
          x1 = Number(x1.toFixed(2));
          y1 = Number(y1.toFixed(2));
          p.ellipse(
            x1 / debounceNum,
            y1 / debounceNum,
            debounceNum,
            debounceNum
          );
        }
      };
      const draw = () => {};
      const resize = () => {
        p.resizeCanvas(p.windowWidth / 2, 240);
      };
      p.setup = setup;
      p.draw = draw;
      p.windowResized = resize;
    },
    [debounceNum]
  );
  return (
    <>
      数量{Num}
      <Slider
        defaultValue={[5]}
        max={10}
        min={1}
        step={0.1}
        className={cn("w-[100%] m-4")}
        onValueChange={value => {
          setNum(value[0]);
        }}
        value={[Num]}
      />
      <Basic sketch={sketch}></Basic>
    </>
  );
};
prime spiral curve半径5,半径越小数量越多帧率60
prime spiral step

结合tone

tone demo

可视化三角函数(todo)

可参考

mathsisfun

Trigonometry(三角函数)

图形融合

Click to expand

核心算法是基于**签名距离函数(SDF)**构建的。这种方法常用于生成 3D 图形对象的体积效果,使用了形状组合、平滑并集、以及不同的形状距离函数。我们会从以下几个方面深入解释:

  1. Signed Distance Function (SDF)
  2. Octahedron 和 Sphere 的距离函数
  3. opSmoothUnion 函数的平滑并集
  4. 颜色计算和渲染

1. Signed Distance Function (SDF)

签名距离函数 (SDF) 是一种描述空间中任意点到特定形状距离的函数。对于每个点,SDF 返回到达该形状表面的最短距离,同时还会保留符号来区分点是否在形状内部。例如,返回正值表示点在形状外部,负值表示点在形状内部,零值表示点在形状表面。

SDF(vec3 p) 函数中,我们根据时间动态地移动两个形状并计算它们的平滑并集,得到一个包含多种形状组合的图形。

2. Octahedron 和 Sphere 的距离函数

Octahedron 距离函数:sdOctahedron

八面体的距离计算基于其几何特性。这个函数接收一个 3D 点 p 和边长 s,然后执行以下步骤:

  1. 使用 p = abs(p);p 转换为其绝对值,因为八面体具有对称性,所以我们只需要计算一个象限的距离。
  2. 计算该点到八面体边界的距离。
  3. 基于不同轴对称性调整距离,使得八面体形状可以被正确定义。
float sdOctahedron(vec3 p, float s) {
    p = abs(p);
    float m = p.x + p.y + p.z - s;
    vec3 q;
    if (3.0 * p.x < m) q = p.xyz;
    else if (3.0 * p.y < m) q = p.yzx;
    else if (3.0 * p.z < m) q = p.zxy;
    else return m * 0.57735027;

    float k = clamp(0.5 * (q.z - q.y + s), 0.0, s);
    return length(vec3(q.x, q.y - s + k, q.z - k));
}

这个算法的关键点在于通过abs和平移操作来简化八面体的计算,同时通过 q 的比较确保仅需要计算最小距离。最终的结果就是 p 点到八面体表面的距离。

Sphere 距离函数:sdSphere

球体的距离函数要简单得多,只需计算点 p 到球体中心的距离减去球体半径:

float sdSphere(vec3 p, float s) {
    return length(p) - s;
}

3. 平滑并集操作: opSmoothUnion

当我们希望将多个形状组合在一起,同时使得它们的边界具有平滑的过渡效果时,可以使用平滑并集。在 opSmoothUnion 中,我们实现了一个平滑距离合并算法,使得八面体和球体之间的过渡更自然。

float opSmoothUnion(float d1, float d2, float k) {
    float h = clamp(0.5 + 0.5 * (d2 - d1) / k, 0.0, 1.0);
    return mix(d2, d1, h) - k * h * (1.0 - h);
}

其中:

  • d1d2 是两种形状的距离值。
  • k 控制平滑过渡的程度(k 越大,边界越平滑)。

平滑并集的基本思路是利用 clamp 限制混合值 h 的范围,然后通过 mix 函数平滑地插值两种形状的距离。mix(d2, d1, h) 表示在 d1d2 之间插值,k * h * (1.0 - h) 调整平滑的边缘效果。

4. 颜色计算与渲染

main 函数中,我们基于到形状的距离来计算颜色。此方法模拟一种距离衰减效果,将不同距离的点绘制成不同颜色:

void main(void) {
    float minSide = min(res.x, res.y);
    vec2 crd = (gl_FragCoord.xy - res * 0.5) / minSide;

    // 计算每个像素到形状的距离
    float d = SDF(vec3(crd, 0.0));
    vec3 color = vec3(d);

    // 使用 smoothstep 函数调整颜色,使形状边缘更平滑
    color = mix(color, vec3(1.0, 1.0, 0.0), 1.0 - smoothstep(0.0, 1.0 / minSide, abs(d)));

    gl_FragColor = vec4(color, 1.0);
}
  • gl_FragCoord:当前像素的位置,通过 res 归一化以使着色与分辨率无关。
  • SDF(vec3(crd, 0.0)):计算当前像素到形状的距离。
  • mix:根据距离值 d 混合不同颜色。离形状越近,颜色越接近黄色;越远则越暗。

总结

这个 GLSL 代码使用 SDF 技术来绘制八面体和平滑组合的球体。借助 SDF、平滑并集和基于距离的颜色计算,可以渲染出具有体积感、光滑边缘的 3D 图形。

换座位

Fisher–Yates shuffle 算法,当时要是知道这个算法,就有机会和 crush相邻了

curl

查看天气

curl wttr.in
Weather report: Beijing, China

      \   /     Sunny
       .-.      29 °C
 (   ) ―   ↓ 4 km/h
       `-’      7 km
      /   \     0.0 mm
                                                       ┌─────────────┐
┌──────────────────────────────┬───────────────────────┤  Thu 11 Jul ├───────────────────────┬──────────────────────────────┐
            Morning           │             Noon      └──────┬──────┘     Evening           │             Night            │
├──────────────────────────────┼──────────────────────────────┼──────────────────────────────┼──────────────────────────────┤
     \   /     Sunny          │     \   /     Sunny          │  _`/"".-.     Patchy rain ne…│  _`/"".-.     Patchy rain ne…│
      .-.      +29(33) °C     │      .-.      +37(38) °C     │   ,\_(   ).   36 °C          │   ,\_(   ).   +27(29) °C     │
   ― (   ) ―   ↓ 4-11 km/h    │    (   ) ―   ↑ 7-8 km/h     │    /(___(__)  ↗ 9-12 km/h    │    /(___(__)  ↙ 13-17 km/h   │
      `-’      7 km      `-’      10 km          │      ‘ ‘ ‘ ‘  10 km          │      ‘ ‘ ‘ ‘  10 km          │
     /   \     0.0 mm | 0%    │     /   \     0.0 mm | 0%    │     ‘ ‘ ‘ ‘   0.1 mm | 100%  │     ‘ ‘ ‘ ‘   0.0 mm | 70%
└──────────────────────────────┴──────────────────────────────┴──────────────────────────────┴──────────────────────────────┘
                                                       ┌─────────────┐
┌──────────────────────────────┬───────────────────────┤  Fri 12 Jul ├───────────────────────┬──────────────────────────────┐
            Morning           │             Noon      └──────┬──────┘     Evening           │             Night            │
├──────────────────────────────┼──────────────────────────────┼──────────────────────────────┼──────────────────────────────┤
  _`/"".-.     Patchy rain ne…│    \  /       Partly Cloudy     \   /     Sunny  _`/"".-.     Patchy rain ne…│
   ,\_(   ).   +29(30) °C     │  _ /"".-.     +33(35) °C     │      .-.      +34(35) °C     │   ,\_(   ).   +29(31) °C     │
    /(___(__)  ↙ 6-8 km/h     │    \_(   ).   ↖ 6-7 km/h     │   ― (   ) ―   ↗ 14-17 km/h   │    /(___(__)  ↗ 7-11 km/h    │
      ‘ ‘ ‘ ‘  9 km           │    /(___(__)  10 km          │      `-’      10 km  9 km
   0.2 mm | 100%               0.0 mm | 0%     /   \     0.0 mm | 0%   0.6 mm | 100%
└──────────────────────────────┴──────────────────────────────┴──────────────────────────────┴──────────────────────────────┘
                                                       ┌─────────────┐
┌──────────────────────────────┬───────────────────────┤  Sat 13 Jul ├───────────────────────┬──────────────────────────────┐
            Morning             Noon      └──────┬──────┘     Evening             Night
├──────────────────────────────┼──────────────────────────────┼──────────────────────────────┼──────────────────────────────┤
  _`/"".-.     Light rain sho…│      .-.      Light drizzle  │  _`/"".-.     Light rain sho…│  _`/"".-.     Moderate or he…│
   ,\_(   ).   +23(25) °C     │     (   ).    +26(28) °C     │   ,\_(   ).   +27(29) °C     │   ,\_(   ).   +23(26) °C     │
    /(___(__)  ← 7-9 km/h     │    (___(__)   ← 8-9 km/h     │    /(___(__)  ← 13-16 km/h   │    /(___(__)  ← 7-10 km/h    │
      ‘ ‘ ‘ ‘  10 km          │     ‘ ‘ ‘ ‘   2 km           │      ‘ ‘ ‘ ‘  10 km          │    ‚‘‚‘‚‘‚‘   7 km           │
     ‘ ‘ ‘ ‘   0.5 mm | 100%  │    ‘ ‘ ‘ ‘    0.7 mm | 100%  │     ‘ ‘ ‘ ‘   0.5 mm | 100%  │    ‚’‚’‚’‚’   2.7 mm | 100%
└──────────────────────────────┴──────────────────────────────┴──────────────────────────────┴──────────────────────────────┘

Follow @igor_chubin for wttr.in updates

查看新闻

curl rate.sx
                                                                      _
                                                             _ _ __ _| |_ ___  ____ __
                                                            | '_/ _` |  _/ -_)(_-< \ /
__................................................__________|_| \__,_|\__\___()__/_\_\_____
 '           '           '           '           '

Market Cap: $2,146,156,882,064 =
24h Vol: $62,100,878,588 =
BTC Dominance: 53.5% =
┌──────┬──────┬─────────────┬──────────────┬─────────────┬──────────────────┬──────────────┐
│ Rank │ Coin │ Price (USD) │ Change (24H) │ Change (1H) │ Market Cap (USD) │ Spark (1H)   │
├──────┼──────┼─────────────┼──────────────┼─────────────┼──────────────────┼──────────────┤
│ 1    │ BTC  │ 57635.1     │ -0.54%       │ -2.36%      │ 1.137T           │ ▁▁▁▁▁▁▁▁▁▁▁▇ │
├──────┼──────┼─────────────┼──────────────┼─────────────┼──────────────────┼──────────────┤
│ 2    │ ETH  │ 3099.46     │ 1.29%        │ 0.03%       │ 372.577B         │ ▇▂▃▂▁▃▂▃▁▅▂▁ │
├──────┼──────┼─────────────┼──────────────┼─────────────┼──────────────────┼──────────────┤
│ 3    │ USDT │ 0.999982    │ -0.02%       │ -0.02%      │ 112.258B         │ ▃▁▅▇▃▃▅▇▂▁▅▇ │
├──────┼──────┼─────────────┼──────────────┼─────────────┼──────────────────┼──────────────┤
│ 4    │ BNB  │ 523.338     │ 1.35%        │ 0.08%       │ 77.236B          │ ▁▅▂▁▂▇▇▃▃▅▂▂ │
├──────┼──────┼─────────────┼──────────────┼─────────────┼──────────────────┼──────────────┤
│ 5    │ SOL  │ 141.416     │ -0.20%       │ -1.75%      │ 65.570B          │ ▁▁▁▁▁▂▁▂▁▁▁▇ │
├──────┼──────┼─────────────┼──────────────┼─────────────┼──────────────────┼──────────────┤
│ 6    │ USDC │ 0.999959    │ -0.02%       │ -0.01%      │ 34.121B          │ ▃▅▇▃▅▅▂▃▂▇▇▃ │
├──────┼──────┼─────────────┼──────────────┼─────────────┼──────────────────┼──────────────┤
│ 7    │ XRP  │ 0.438181    │ 0.49%        │ -0.22%      │ 24.417B          │ ▁▅▅▅▁▂▃▁▇▃▃▇ │
├──────┼──────┼─────────────┼──────────────┼─────────────┼──────────────────┼──────────────┤
│ 8    │ TON  │ 7.24703     │ 562.76%      │ 551.74%     │ 18.167B          │ ▇▇▇▇▇▇▇▇▇▇▇▇ │
├──────┼──────┼─────────────┼──────────────┼─────────────┼──────────────────┼──────────────┤
│ 9    │ DOGE │ 0.107522    │ -0.00%       │ -1.95%      │ 15.598B          │ ▁▁▁▁▁▂▁▁▁▁▁▇ │
├──────┼──────┼─────────────┼──────────────┼─────────────┼──────────────────┼──────────────┤
│ 10   │ ADA  │ 0.385592    │ 2.77%        │ 0.49%       │ 13.832B          │ ▁▂▁▇▁▂▃▂▃▂▂▇ │
└──────┴──────┴─────────────┴──────────────┴─────────────┴──────────────────┴──────────────┘
2024-07-11 02:52:06.761841 UTC

NEW FEATURE: to see cryptocurrency exchange rate, do curl rate.sx/eth (or any other coin instead of ETH)
[Follow @igor_chubin for rate.sx updates] [github.com/chubin/rate.sx]

map

npx mapscii
npx: installed 26 in 3.145s
Welcome to MapSCII! Use your cursors to navigate, a/z to zoom, q to quit.

                                                                         ⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠿⠛⠛⠻⠿⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿
⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠿⠻⠟⠛⠛⠿⠿⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠟⠛⠃⠀⠀⠀⠀⠀⠀⠹⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿
⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⢻⡟⠀⠀⠀⠀⠀⠀⠀⠀⠀⢹⣿⣿⣿⣿⣿⣿⣿⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢈⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿
⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠛⠁⠀⠁⠀⠀⠀⠀⠀⠀⠀⢀⣠⣿⠿⠛⠛⢿⠏⠈⠻⡄⠀⠀⠀⠀⠀⠀⠶⠖⠺⡿⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿
⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣧⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠐⣿⣿⡇⠀⠀⠀⠀⠀⠀⠀⠈⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣸⠟⠋⠁⠈⢻⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿
⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡟⠈⠿⣧⣀⣀⠀⠀⠀⠀⠀⠀⢀⣾⡿⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠁⠀⠀⢀⣴⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⢟⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠏⠁⢻⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿
⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡀⠀⠀⠈⣿⠛⠏⠀⠀⠀⠀⠀⣼⣿⡁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠐⢺⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⢿⣍⡀⠁⠈⢻⣿⣿⣿⣿⣿⣿⣿⣿⣿⣴⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡆⠀⠀⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿
⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⡄⠀⠀⢙⡄⠀⠀⠀⠤⣤⣿⣿⣿⡿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠀⠉⠀⠹⣷⣤⣴⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡀⠀⢸⡿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿
⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣟⣿⣿⣿⣂⠹⣿⡽⣿⣧⣀⣰⠛⠁⠀⠀⠀⢘⣿⡿⠟⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣆⠀⠀⢠⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣶⣿⠃⢈⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿
⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⣿⣿⣩⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡻⡄⠀⠀⣠⣿⣿⣷⣤⣀⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠸⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡦⠀⣿⣿⣨⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣾⡿⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿
⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠃⢀⣿⣿⣿⡿⣿⣿⣿⣿⣿⣿⡙⠿⢿⣟⠁⢀⣀⠈⣻⣿⣿⣿⣿⠉⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣰⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣴⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡟⠀⠚⡿⠿⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿
⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣧⣾⣿⠃⠉⢿⣷⠟⣿⣿⣉⠀⣿⣿⣷⠘⣿⣿⡿⠿⣿⣿⣿⣿⣿⣿⣷⣾⣿⣶⣤⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠹⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠟⢉⣠⣶⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠟⠛⠟⠀⠀⠀⠀⠀⠀⠀⢻⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠛⠛⠻⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿
⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣶⣟⣡⣤⣶⣿⣿⣿⣶⣿⣍⣿⣄⣀⣀⣀⣀⣼⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣧⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠸⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡯⠀⣰⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡟⠋⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣤⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣦⣤⣤⣾⣷⣭⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿
⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠀⠉⠉⣻⣿⣿⣿⣿⠿⣿⡿⠻⢿⡏⠉⣻⡿⢟⣿⡿⡿⠿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣧⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⣹⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠀⣼⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠛⠛⠃⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠉⠛⡿⠿⢿⣿⣿⡿⠿⣿⣿⣿⣿⣿⣿⣟⣻⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿
⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠇⠀⢠⡞⠁⠛⠻⠹⡇⢰⣿⡛⠀⢻⣇⣾⣿⡇⠘⠏⠀⣹⠖⠾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠰⣽⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠁⣼⣿⣿⣿⣿⣿⣿⠉⢻⣿⣿⠿⣇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠉⠉⠁⠀⢸⣿⣿⣿⣿⣿⠛⠻⠿⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿
⣿⣿⣿⣿⡟⢻⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣶⣤⣿⡶⢂⡀⠀⠀⠁⠀⢿⣿⣷⣾⠋⢹⣿⡧⠀⠀⠀⠀⠀⠀⠘⠻⣿⣿⣿⣿⣿⣿⣿⣿⣦⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣦⢹⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠿⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣧⣄⣻⣿⣿⣿⣿⣿⠃⠀⢺⡝⠇⠀⠈⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⢿⠋⠛⠙⠉⠃⠀⠀⠀⠈⠻⣿⡿⠿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣟⣻⣿⣿⣿⣿⣿
⣿⣿⠉⠀⠀⠀⠀⠈⠉⠙⠛⠛⡿⣿⣿⡿⡿⠟⠏⢿⣿⠿⢿⣿⣛⠉⠁⠀⠀⡀⢀⣽⡿⢻⡄⠠⢿⣿⣷⡶⢦⣤⣦⣄⠀⠀⠀⠹⣿⣿⣿⣿⣿⣿⣇⣽⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠐⣛⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⢟⠛⠀⡔⣴⡻⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⢿⣿⣿⡀⠀⢸⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠸⡿⠿⣿⣿⣿⡻⠿⠿⣿⣿⣿⣿⣿⣿⣿⣿
⣉⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡇⠀⠉⠀⠀⠀⠀⠀⠀⠀⠀⠈⢙⣿⣶⣶⡛⠹⣷⣿⣿⠓⠿⠀⠘⢹⣿⠃⢠⣿⣿⡿⣦⡄⠀⠚⠿⣿⣿⣿⣿⣿⣿⠟⠀⠀⠀⠀⠀⠀⠀⠀⢀⣤⣶⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⢟⡦⠗⢍⠊⠀⢇⠀⠀⠈⠙⢿⣿⣿⠿⣿⡿⠟⠽⠿⠛⠟⠁⠈⠙⠻⠀⢈⣏⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠛⠁⠀⠀⠀⠉⢻⣿⣿⣿⣿⣿
⣿⣷⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡇⠀⠀⠀⠀⠀⠀⠀⣀⣤⣶⡤⠀⠀⠀⠈⠀⠀⠀⠉⠀⠀⠀⠀⠀⠈⠃⣄⣴⣿⣿⣷⣿⠁⠀⢀⡀⠙⢻⣿⣿⣿⣧⠀⠀⠀⠀⠀⠀⠀⠀⣠⣾⣿⣿⣿⣿⣿⣿⣿⡿⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⢃⠎⠀⠀⠘⡄⠀⠸⡀⢠⣄⡀⢀⡿⢿⠾⠟⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣾⠏⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡀⠹⡟⢻⣿⣿
⣀⣀⡤⠀⠀⠀⠀⠀⠀⠀⠀⠀⡇⠀⠀⠀⠀⠀⠀⠀⠠⠿⠟⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣼⠛⠿⣿⣿⢛⡛⠀⠀⠈⢿⣦⣿⣿⣿⣿⣿⡆⠀⠀⠀⠀⢠⣶⣿⣿⣿⣿⣿⣿⣿⣶⠈⠈⠀⣻⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠃⡎⠀⠀⢠⣿⡷⠀⠰⡁⠀⣿⡿⣿⠅⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⣼⣷⣆⠀⣶⣿⣿
⡿⠿⠛⠀⠀⠀⠀⠀⠀⠀⠀⠀⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⠀⣀⣄⠀⠀⠀⠀⠀⠀⠀⠀⣰⣿⣿⣶⣷⣿⣿⣿⣿⣷⣄⢢⣌⣿⣿⣿⣿⣿⣿⣿⡀⠀⠀⢀⣼⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⣶⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠟⠁⡜⠁⠀⣠⣿⠋⠀⠀⠀⢣⠀⠀⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⠀⠀⠀⠀⠀⢀⡘⣿⣿⣿⣿⣿⣿⣿
⣧⠀⠀⠀⠀⠀⠀⣠⢀⣀⠀⠀⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠦⣼⠿⠋⠁⠀⠀⠀⠀⠀⠀⢀⣼⣿⣿⣿⣿⣿⣿⣿⡀⠉⠛⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⣀⡀⢸⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠀⠀⠀⢣⠀⠰⣿⣿⠀⠀⢀⡰⣧⡄⢿⠆⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣤⣶⣤⡿⠀⠀⡀⢠⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿
⣿⣿⣦⣄⣀⠀⣴⣷⣾⣿⣿⣿⣿⣵⡠⠢⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠴⠦⠄⠀⠀⠀⠀⠸⣿⣿⣿⣿⣿⣿⣿⣿⠃⠀⠀⠈⣿⣿⢻⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡇⠀⣴⣣⡄⢀⣼⣿⣷⠞⢛⠏⠙⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣤⣤⣤⣴⣶⣠⣾⣿⣿⠏⣴⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿
⣿⣿⣿⡿⣷⣿⣽⣿⣿⣿⣿⣿⣿⣿⣿⣿⣧⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢰⠇⠀⠀⠀⠹⠿⢿⣿⣿⣿⣿⣿⣧⠀⠀⠀⠈⠁⠀⢻⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠑⣻⣿⣿⣿⣿⣿⢿⣇⢀⣼⣿⣿⢻⣏⠺⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣰⣿⣿⣿⣿⣿⣿⣿⣿⠉⠁⠈⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿
⣿⣿⣷⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡜⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⡀⠀⠀⠀⠀⠈⠛⢻⣿⡟⠁⠀⠀⠀⠀⠀⠀⠀⠙⢻⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⢿⣻⣧⡹⣿⣿⣿⣿⣷⢾⣿⣾⣿⠿⠿⣥⣠⠋⠈⢆⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⠤⠤⠒⢲⢄⣀⢤⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⡞⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠠⢾⣿⣿⣿⣿⣿⣿⣿⣿⣿⠀⠀⣼⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿
⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣧⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠋⢧⠀⠀⠀⠀⠀⠀⠘⣿⡟⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣼⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣣⣾⣏⠁⠘⣿⣟⣻⠁⠀⠀⢫⠀⠀⠀⢠⡣⠤⣀⡴⠥⡀⠀⠀⠀⠀⠀⠀⢀⣀⡀⠀⠀⠼⡂⠀⠀⠀⠀⠈⠀⠀⢣⡀⠀⠀⠀⠀⠀⠀⠀⠀⣄⡀⢀⡤⠞⠁⠀⠀⠀⠀⢰⠉⠑⢆⠀⠀⠀⠀⠀⠁⢹⣻⣿⣿⣿⣿⣿⣿⣦⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿
⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣗⣤⣀⣀⣀⣀⣀⣀⣀⣀⣀⣀⣀⣀⣀⣠⡀⠀⢀⣀⠀⠀⠈⠀⠀⠀⠀⠀⣠⣶⣶⣶⣾⡟⠺⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⣿⠿⠋⠢⢇⡀⠀⠲⣉⣓⡢⣠⣔⠁⠀⠀⠀⠀⠑⠲⢤⠀⠀⢀⠦⠇⠀⠈⠉⠉⠋⠁⠀⠀⠀⠀⠀⠀⠀⠀⠉⠉⠢⢤⡔⠊⠉⠒⠬⠂⠘⠒⠒⠢⣀⡠⠔⢤⠔⠃⠀⠀⠈⠦⢄⠀⠀⠀⠀⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿
⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠽⠿⣿⣦⣀⠀⠀⠀⠀⠀⢼⢫⠀⣿⣿⣿⣷⣶⣮⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⣦⠀⠀⠀⣔⣓⠶⠾⡤⡮⣊⣡⠋⠒⠙⣵⣤⣀⣠⣴⠚⠀⠀⠈⠲⣠⣤⡄⠀⢀⣀⠀⠀⠀⠀⠀⠀⡠⠤⡤⠀⡰⠺⠁⠑⡆⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠓⡾⠄⠀⠀⠀⠀⠘⢒⠏⠀⣰⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿
⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡟⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠐⣿⠣⣿⣛⣤⡴⠒⠒⣡⣼⣿⣥⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠿⢿⣿⣀⠀⣀⣈⣶⣄⠻⣿⣯⣺⣑⢦⠤⢤⣿⣿⣷⣿⣿⣤⣀⠀⠀⣾⣿⣏⠁⢰⠺⠻⢄⡠⡀⠀⠀⠀⣀⣀⣀⣲⠁⠀⠀⠀⠉⠒⠤⡀⠀⠀⠀⠀⢀⣀⠮⠒⠉⠀⠀⠀⠀⠀⠀⣰⣉⣀⣼⣿⣿⠛⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿
⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡇⠀⠀⠀⠀⠐⠆⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠋⠀⠛⠋⠀⠀⢠⣴⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡞⡆⠀⠀⢨⣭⣿⣿⣿⣿⣧⣝⣻⣷⡻⣵⣶⣾⡿⠿⠟⠛⠻⠿⠟⢭⣗⠾⣿⣿⡿⠜⠊⠣⢄⡀⠳⢤⣾⡭⢁⣠⠔⠁⠀⠀⠀⠀⠀⠀⠀⠉⠉⠉⠒⠊⠁⠀⠀⠀⠀⠀⢀⣄⣀⠔⣪⣿⣿⣿⣿⣿⡿⣶⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿
⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣎⡆⣀⣠⣽⣿⣿⣿⣿⣿⣿⣛⣿⣿⣧⢸⣿⣧⠀⣀⠀⣀⣀⣀⣠⠼⡝⠙⠿⣿⣿⠔⠢⢄⡀⢈⠦⡽⠝⣯⣳⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠺⡿⣿⣿⣥⠽⣿⣿⣿⣿⠟⢰⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿
⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣤⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣠⣼⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠏⠙⢟⠉⠀⠀⠀⡎⢼⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠄⣀⠇⠀⡜⠀⠀⠀⠀⠀⠀⢰⠑⠁⠀⠀⡬⠂⡤⠵⢢⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢺⣿⣿⣷⣶⣿⡿⣻⣣⣴⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿
⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡏⣯⡒⠒⠒⢢⢀⠀⠀⠀⠀⣀⠀⣀⣀⣀⡀⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠁⣀⡰⠊⠀⠀⠀⠀⠸⡖⠁⠉⠻⢿⠏⠉⡟⠻⠿⠻⠿⡟⢻⠑⠢⣀⠈⣱⣀⠀⠀⠀⠀⢘⣆⠀⢠⠜⠂⢀⠏⠀⠙⢄⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿
⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⣄⠀⠀⠉⠉⢆⣴⣿⣿⣿⣿⣿⣿⣿⢹⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⢻⣥⣏⡀⠀⠀⠀⠀⠀⠀⠀⡇⠀⠀⠀⠀⠀⠀⡇⠀⠀⠀⠰⣯⡁⠀⠀⠀⠉⠙⢿⣧⣄⣤⡀⠀⣑⡍⠁⠀⡔⠊⠀⠀⠀⠑⠪⢕⣒⣖⠶⠊⣉⠗⡄⠀⠀⠀⠀⠀⠀⠀⠀⠀⢠⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿
⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣯⣻⣦⡀⠀⠀⠀⣼⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡣⡿⠀⠀⡏⠑⠢⡀⠀⠀⠀⠀⣓⠤⣀⠤⣀⠀⠀⢱⠀⠀⠀⠀⢹⣷⡄⠀⠀⠀⠀⠈⢟⣛⡝⠻⣿⣿⣿⣿⣶⡚⠀⠀⠀⠀⠀⠀⠀⠀⢏⣩⣷⠇⠸⣆⢀⡠⢄⡀⠀⠀⢀⣀⣴⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿
⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣯⣀⠀⠀⠹⣿⣿⡿⢉⣽⣿⣿⣿⣷⣯⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣯⠉⠁⠀⠀⢱⠀⠀⠈⠑⣤⠔⠊⠀⠀⢈⠆⠀⠉⠒⡼⠉⠉⠉⠉⠉⢻⣷⡄⠀⠀⠀⣀⣀⡠⢇⣾⣿⣿⣿⣿⣿⣷⣿⡀⠀⠀⠀⠀⣠⣾⣿⣿⣧⡀⢀⠜⡍⣳⣄⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿
⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣶⣤⣾⣅⠯⡻⠿⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠿⠢⢤⠤⠤⠼⠀⣀⣀⠤⠜⠀⠀⠀⠀⡜⠀⠀⠀⢠⠇⠀⠀⠀⠀⠀⣖⡻⣿⣏⠒⠊⢀⣸⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⡇⠀⠀⣴⣾⣿⣿⣿⣿⣿⣧⣦⠃⠉⣀⣻⡝⣿⣿⣿⣿⣿⣿⣼⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿
⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣯⣡⣿⣿⣿⣿⣿⣿⡿⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡻⠺⠤⣄⣠⠋⣀⣀⠷⡜⠉⠒⠊⠉⣻⠀⠀⠀⣣⢀⠀⢀⠀⣔⡰⠉⠈⢹⡿⣶⣿⡿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡄⢀⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣦⣨⣃⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿
⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠋⠀⠻⣁⣀⠀⠁⠈⡿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣎⠗⡜⠀⢉⠇⠘⣿⣀⠀⢀⣀⡰⢹⠤⠔⠊⠘⢎⡉⠉⠉⠼⡀⠀⠀⠀⠈⠒⡴⣹⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣾⣟⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿
⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠇⠀⠀⠀⢸⠀⣖⠬⢳⠸⣉⣏⠿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣾⣾⣿⣶⣿⣿⣿⣷⣾⣄⣀⠘⡤⡔⠒⠒⠒⠉⠒⣤⠲⡚⠢⠤⡢⠔⢊⣰⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣯⠻⣧⣿⣿⣿⣿⣿⠟⡗⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿
⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡟⠉⢒⢤⠀⢸⠃⠑⠁⠀⠈⠉⠁⠀⠀⠛⠿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡉⢈⡏⣁⠇⠀⠀⠀⠀⢠⣧⣶⢅⡀⠀⣧⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⣄⠹⣿⣿⣿⠓⠉⢀⣿⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿
⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠎⠁⠀⡝⠻⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠉⠉⠙⠻⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣯⣤⡃⠀⠀⠀⠀⠀⢸⠋⠉⠀⠘⣼⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣦⣸⣿⣿⣿⣷⣾⣿⣾⣿⣿⣿⣿⣿⣿⣿⣍⡀⢹⠙⠻⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿
⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣆⠀⠰⣁⡀⠀⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣸⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡀⠑⠒⠉⡇⠀⠀⡬⠷⢄⠀⠀⢽⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣾⣴⣶⣮⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿
⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣆⠀⠀⠙⡍⠘⠤⣀⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢠⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠃⠀⠀⠀⡭⠏⠒⠷⠀⣜⣷⠒⠉⣿⣿⣿⣿⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠟⠛⣿⣿⣿⢻⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿
⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣶⣤⣘⠆⠀⠀⠀⠓⢆⠀⠀⠀⠀⠀⠀⠀⠀⢸⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡧⠤⠤⢄⣀⣣⣀⣠⠒⠫⡄⠟⢀⣤⣿⣿⡛⠋⢸⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠟⠀⠈⠁⠀⠀⠙⠻⡿⠀⠹⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿
⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⢇⣀⣀⡔⠉⢺⠀⠀⠀⠀⠀⠀⠀⢀⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡄⠀⠀⣸⠀⠀⠱⣀⣠⠃⢾⣿⣿⣿⡿⠁⢀⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠿⠛⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠉⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿
⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡇⡜⠁⠁⠈⠢⢄⠙⡆⠀⠀⣤⣶⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣧⠀⠀⡇⢀⣀⠔⠁⢘⣤⣼⣿⣿⣿⣷⣠⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣏⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠻⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿
⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⢡⠊⠀⠀⠀⠀⠚⡲⠋⠀⣰⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡤⣀⠏⠁⠀⠀⣀⢑⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿
⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡇⠀⠀⠀⠀⠀⡸⠒⢤⣰⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡄⠀⠀⠀⢘⣡⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⠀⠀⠀⢀⣤⣴⣶⣤⡀⠀⡀⠀⠀⠀⠀⠀⠀⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿
⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡏⡸⠀⠀⠀⠀⠀⢳⣶⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣧⣤⣿⣿⣿⣿⣿⣿⣿⣿⣾⣅⠀⠀⠀⠀⠀⣼⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿
⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣥⠇⠀⠀⠀⣤⣤⣶⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⣤⣶⣴⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠙⣻⣿⣿⣿⣿⣿⣿⣿
center: 52.512, 13.42   zoom: 0.44

生成随机commit message

git commit -m "$(curl -sk whatthecommit.com/index.txt)"

neofetch

curl -sL https://raw.githubusercontent.com/dylanaraps/neofetch/master/neofetch | bash

生成二维码

printf "ajn404 love from china" \ | curl -F-=\<- qrenco.de

cool thing outside

codepen 2023

  • 神奇的悬浮特效

  • 10.zembzev

  • wvxewXO

  • theme button

  • QWzeQOK

  • qByGqOm

  • scroll text

  • ghost

  • puppy

canvas

  • AGgarW