diff --git a/_config.yml b/_config.yml index 95c40ca3e7..001646d56f 100644 --- a/_config.yml +++ b/_config.yml @@ -53,6 +53,10 @@ distribution_version: "2.7" compose_switch_version: "1.0.4" buildkit_version: "0.10.5" +# Strings for use in doc examples, e.g. runtime versions. +example_go_version: "1.20" +example_golangci_lint_version: "v1.52" + # Options for displaying minimum API version requirements in the reference pages. # # The reference pages show badges for commands and options (flags) that require diff --git a/_data/toc.yaml b/_data/toc.yaml index 047c730789..8eb4a36466 100644 --- a/_data/toc.yaml +++ b/_data/toc.yaml @@ -155,6 +155,30 @@ guides: title: Security best practices - path: /develop/remote-development/ title: Remote development + +- sectiontitle: Build with Docker + section: + - path: /build/guide/ + title: Overview + - path: /build/guide/intro/ + title: 1. Introduction + - path: /build/guide/layers/ + title: 2. Layers + - path: /build/guide/multi-stage/ + title: 3. Multi-stage + - path: /build/guide/mounts/ + title: 4. Mounts + - path: /build/guide/build-args/ + title: 5. Build arguments + - path: /build/guide/export/ + title: 6. Export binaries + - path: /build/guide/test/ + title: 7. Test + - path: /build/guide/multi-platform/ + title: 8. Multi-platform + - path: /build/guide/next-steps/ + title: Next steps + - sectiontitle: Deploy your app to the cloud section: - path: /cloud/aci-integration/ diff --git a/build/guide/build-args.md b/build/guide/build-args.md new file mode 100644 index 0000000000..284362f3fd --- /dev/null +++ b/build/guide/build-args.md @@ -0,0 +1,156 @@ +--- +title: Build arguments +description: Introduction to configurable builds, using build args +keywords: > + build, buildkit, buildx, guide, tutorial, build arguments, arg +--- + +{% include_relative nav.html selected="5" %} + +Build arguments is a great way to add flexibility to your builds. You can pass +build arguments at build-time, and you can set a default value that the builder +uses as a fallback. + +## Change runtime versions + +A practical use case for build arguments is to specify runtime versions for +build stages. Your image uses the `golang:{{site.example_go_version}}-alpine` +image as a base image. +But what if someone wanted to use a different version of Go for building the +application? They could update the version number inside the Dockerfile, but +that’s inconvenient, it makes switching between versions more tedious than it +has to be. Build arguments make life easier: + +```diff + # syntax=docker/dockerfile:1 +- FROM golang:{{site.example_go_version}}-alpine AS base ++ ARG GO_VERSION={{site.example_go_version}} ++ FROM golang:${GO_VERSION}-alpine AS base + WORKDIR /src + RUN --mount=type=cache,target=/go/pkg/mod/ \ + --mount=type=bind,source=go.sum,target=go.sum \ + --mount=type=bind,source=go.mod,target=go.mod \ + go mod download -x + + FROM base AS build-client + RUN --mount=type=cache,target=/go/pkg/mod/ \ + --mount=type=bind,target=. \ + go build -o /bin/client ./cmd/client + + FROM base AS build-server + RUN --mount=type=cache,target=/go/pkg/mod/ \ + --mount=type=bind,target=. \ + go build -o /bin/server ./cmd/server + + FROM scratch AS client + COPY --from=build /bin/client /bin/ + ENTRYPOINT [ "/bin/client" ] + + FROM scratch AS server + COPY --from=build /bin/server /bin/ + ENTRYPOINT [ "/bin/server" ] +``` + +The `ARG` keyword is interpolated in the image name in the `FROM` instruction. +The default value of the `GO_VERSION` build argument is set to `{{site.example_go_version}}`. +If the build doesn't receive a `GO_VERSION` build argument, the `FROM` instruction +resolves to `golang:{{site.example_go_version}}-alpine`. + +Try setting a different version of Go to use for building, using the +`--build-arg` flag for the build command: + +```console +$ docker build --build-arg="GO_VERSION=1.19" . +``` + +Running this command results in a build using the `golang:1.19-alpine` image. + +## Inject values + +You can also make use of build arguments to modify values in the source code of +your program, at build time. This is useful for dynamically injecting +information, avoiding hard-coded values. With Go, consuming external values at +build time is done using linker flags, or `-ldflags`. + +The server part of the application contains a conditional statement to print the +app version, if a version is specified: + +```go +// cmd/server/main.go +var version string + +func main() { + if version != "" { + log.Printf("Version: %s", version) + } +``` + +You could declare the version string value directly in the code. But, updating +the version to line up with the release version of the application would require +updating the code ahead of every release. That would be both tedious and +error-prone. A better solution is to pass the version string as a build +argument, and inject the build argument into the code. + +The following example adds an `APP_VERSION` build argument to the `build-server` +stage. The Go compiler uses the value of the build argument to set the value of +a variable in the code. + +```diff + # syntax=docker/dockerfile:1 + ARG GO_VERSION={{site.example_go_version}} + FROM golang:${GO_VERSION}-alpine AS base + WORKDIR /src + RUN --mount=type=cache,target=/go/pkg/mod/ \ + --mount=type=bind,source=go.sum,target=go.sum \ + --mount=type=bind,source=go.mod,target=go.mod \ + go mod download -x + + FROM base AS build-client + RUN --mount=type=cache,target=/go/pkg/mod/ \ + --mount=type=bind,target=. \ + go build -o /bin/client ./cmd/client + + FROM base AS build-server ++ ARG APP_VERSION="v0.0.0+unknown" + RUN --mount=type=cache,target=/go/pkg/mod/ \ + --mount=type=bind,target=. \ +- go build -o /bin/server ./cmd/server ++ go build -ldflags "-X main.version=$APP_VERSION" -o /bin/server ./cmd/server + + FROM scratch AS client + COPY --from=build-client /bin/client /bin/ + ENTRYPOINT [ "/bin/client" ] + + FROM scratch AS server + COPY --from=build-server /bin/server /bin/ + ENTRYPOINT [ "/bin/server" ] +``` + +Now the version of the server when building the binary, without having to update +the source code. To verify this, you can the `server` target and start a +container with `docker run`. The server outputs `v0.0.1` as the version on +startup. + +```console +$ docker build --target=server --build-arg="APP_VERSION=v0.0.1" --tag=buildme-server . +$ docker run buildme-server +2023/04/06 08:54:27 Version: v0.0.1 +2023/04/06 08:54:27 Starting server... +2023/04/06 08:54:27 Listening on HTTP port 3000 +``` + +## Summary + +This section showed how you can use build arguments to make builds more +configurable, and inject values at build-time. + +Related information: + +- [`ARG` Dockerfile reference](../../engine/reference/builder.md#arg) + +## Next steps + +The next section of this guide shows how you can use Docker builds to create not +only container images, but executable binaries as well. + +[Export binaries](export.md){: .button .primary-btn } diff --git a/build/guide/export.md b/build/guide/export.md new file mode 100644 index 0000000000..fa2839befd --- /dev/null +++ b/build/guide/export.md @@ -0,0 +1,117 @@ +--- +title: Export binaries +description: Using Docker builds to create and export executable binaries +keywords: > + build, buildkit, buildx, guide, tutorial, build arguments, arg +--- + +{% include_relative nav.html selected="6" %} + +Did you know that you can use Docker to build your application to standalone +binaries? Sometimes, you don’t want to package and distribute your application +as a Docker image. Use Docker to build your application, and use exporters to +save the output to disk. + +The default output format for `docker build` is a container image. That image is +automatically loaded to your local image store, where you can run a container +from that image, or push it to a registry. Under the hood, this uses the default +exporter, called the `docker` exporter. + +To export your build results as files instead, you can use the `local` exporter. +The `local` exporter saves the filesystem of the build container to the +specified directory on the host machine. + +## Export binaries + +To use the `local` exporter, pass the `--output` option to the `docker build` +command. The `--output` flag takes one argument: the destination on the host +machine where you want to save the files. + +The following commands exports the files from of the `server` target to the +current working directory on the host filesystem: + +```console +$ docker build --output=. --target=server . +``` + +Running this command creates a binary at `./bin/server`. It’s created under the +`bin/` directory because that’s where the file was located inside the build +container. + +```console +$ ls -l ./bin +total 14576 +-rwxr-xr-x 1 user user 7459368 Apr 6 09:27 server +``` + +If you want to create a build that exports both binaries, you can create another +build stage in the Dockerfile that copies both of the binaries from each build +stage: + +```diff + # syntax=docker/dockerfile:1 + ARG GO_VERSION={{site.example_go_version}} + FROM golang:${GO_VERSION}-alpine AS base + WORKDIR /src + RUN --mount=type=cache,target=/go/pkg/mod/ \ + --mount=type=bind,source=go.sum,target=go.sum \ + --mount=type=bind,source=go.mod,target=go.mod \ + go mod download -x + + FROM base as build-client + RUN --mount=type=cache,target=/go/pkg/mod/ \ + --mount=type=bind,target=. \ + go build -o /bin/client ./cmd/client + + FROM base as build-server + ARG APP_VERSION="0.0.0+unknown" + RUN --mount=type=cache,target=/go/pkg/mod/ \ + --mount=type=bind,target=. \ + go build -ldflags "-X main.version=$APP_VERSION" -o /bin/server ./cmd/server + + FROM scratch AS client + COPY --from=build-client /bin/client /bin/ + ENTRYPOINT [ "/bin/client" ] + + FROM scratch AS server + COPY --from=build-server /bin/server /bin/ + ENTRYPOINT [ "/bin/server" ] ++ ++ FROM scratch AS binaries ++ COPY --from=build-client /bin/client / ++ COPY --from=build-server /bin/server / +``` + +Now you can build the `binaries` target using the `--output` option to export +both the client and server binaries. + +```console +$ docker build --output=bin --target=binaries . +$ ls -l ./bin +total 29392 +-rwxr-xr-x 1 user user 7581933 Apr 6 09:33 client +-rwxr-xr-x 1 user user 7459368 Apr 6 09:33 server +``` + +## Summary + +This section has demonstrated how you can use Docker to build and export +standalone binaries. These binaries can be distributed freely, and don’t require +a container runtime like the Docker daemon. + +The binaries you've generated so far are Linux binaries. That's because the +build environment is Linux. If your host OS is Linux, you can run these files. +Building binaries that work on Mac or Windows machines requires cross-compilation. +This is explored later on in this guide. + +Related information: + +- [`docker build --output` CLI reference](../../engine/reference/commandline/build.md#output) +- [Build exporters](../exporters/index.md) + +## Next steps + +The next topic of this guide is testing: how you can use Docker to run +application tests. + +[Test](test.md){: .button .primary-btn } diff --git a/build/guide/images/cache-bust.png b/build/guide/images/cache-bust.png new file mode 100644 index 0000000000..dd01b0a8ab Binary files /dev/null and b/build/guide/images/cache-bust.png differ diff --git a/build/guide/images/cross-compilation.png b/build/guide/images/cross-compilation.png new file mode 100644 index 0000000000..1430efefbd Binary files /dev/null and b/build/guide/images/cross-compilation.png differ diff --git a/build/guide/images/emulation.png b/build/guide/images/emulation.png new file mode 100644 index 0000000000..a229d4baf1 Binary files /dev/null and b/build/guide/images/emulation.png differ diff --git a/build/guide/images/layers.excalidraw b/build/guide/images/layers.excalidraw new file mode 100644 index 0000000000..3352120c8d --- /dev/null +++ b/build/guide/images/layers.excalidraw @@ -0,0 +1,8710 @@ +{ + "type": "excalidraw", + "version": 2, + "source": "https://excalidraw.com", + "elements": [ + { + "type": "rectangle", + "version": 874, + "versionNonce": 1648337864, + "isDeleted": false, + "id": "SJuco6Tvlth0RFO1KAae_", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 1336.35724505092, + "y": -304.62422857500223, + "strokeColor": "#000000", + "backgroundColor": "#fafafa", + "width": 1351.2261781596187, + "height": 482.97445654574926, + "seed": 1556945673, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1682078796133, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 804, + "versionNonce": 500391096, + "isDeleted": false, + "id": "9Lj_jJySWw10J7QNA4UOe", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 1336.35724505092, + "y": 341.49079497443427, + "strokeColor": "#000000", + "backgroundColor": "#fafafa", + "width": 1351.2261781596187, + "height": 540.2911118606187, + "seed": 828812489, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1682078796133, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 308, + "versionNonce": 1630005960, + "isDeleted": false, + "id": "RAd1vQNAtmHG0CGO4LMBb", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": -235.23335355604308, + "y": -380.6527397288745, + "strokeColor": "#000", + "backgroundColor": "#fafafa", + "width": 1468.7317047431893, + "height": 568.8992575621592, + "seed": 1515977735, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1682078796133, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 191, + "versionNonce": 364316088, + "isDeleted": false, + "id": "SFHQUuuicOlq9vRfI773_", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 391.72633443982016, + "y": -125.97596198171215, + "strokeColor": "#000", + "backgroundColor": "#fff", + "width": 144.65533699199153, + "height": 144.65533699199153, + "seed": 1939286566, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "Vklii2X9cGfeFVv0CZWns", + "type": "arrow" + }, + { + "id": "7gZ80nQ7dwzbsKC9GQPR9", + "type": "arrow" + } + ], + "updated": 1682078796133, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 232, + "versionNonce": 158290376, + "isDeleted": false, + "id": "zOuEHckaFcXNVkBt39gKb", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 613.8254872098515, + "y": -311.17706159581184, + "strokeColor": "#000000", + "backgroundColor": "#fafafa", + "width": 566.4711039265125, + "height": 448.39007520482613, + "seed": 1730195112, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "7gZ80nQ7dwzbsKC9GQPR9", + "type": "arrow" + } + ], + "updated": 1682078796133, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 540, + "versionNonce": 87920312, + "isDeleted": false, + "id": "r3dGopHAqfsjBUj9UUVST", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 635.7077167094105, + "y": -213.42747194940455, + "strokeColor": "#000000", + "backgroundColor": "#e3e3e3", + "width": 508, + "height": 37, + "seed": 1084855855, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "type": "text", + "id": "S03PAm2nMGKghAMo31vRD" + } + ], + "updated": 1682078796133, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 429, + "versionNonce": 573692104, + "isDeleted": false, + "id": "S03PAm2nMGKghAMo31vRD", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 640.7077167094105, + "y": -206.92747194940455, + "strokeColor": "#000000", + "backgroundColor": "#e3e3e3", + "width": 281.6000061035156, + "height": 24, + "seed": 1445772529, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1682078796133, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": " FROM golang:1.20-alpine", + "textAlign": "left", + "verticalAlign": "middle", + "containerId": "r3dGopHAqfsjBUj9UUVST", + "originalText": " FROM golang:1.20-alpine", + "lineHeight": 1.2, + "baseline": 19 + }, + { + "type": "rectangle", + "version": 598, + "versionNonce": 889911224, + "isDeleted": false, + "id": "jWtY8BCMNEQNYB3lSEtPB", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 637.9382641768877, + "y": -164.7198228311139, + "strokeColor": "#000000", + "backgroundColor": "#e3e3e3", + "width": 508, + "height": 35, + "seed": 1084855855, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "type": "text", + "id": "W43F6xW6gErdWTJK5oxpt" + } + ], + "updated": 1682078796134, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 508, + "versionNonce": 789282760, + "isDeleted": false, + "id": "W43F6xW6gErdWTJK5oxpt", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 642.9382641768877, + "y": -159.2198228311139, + "strokeColor": "#000000", + "backgroundColor": "#e3e3e3", + "width": 152.53334045410156, + "height": 24, + "seed": 1445772529, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1682078796134, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": " WORKDIR /src", + "textAlign": "left", + "verticalAlign": "middle", + "containerId": "jWtY8BCMNEQNYB3lSEtPB", + "originalText": " WORKDIR /src", + "lineHeight": 1.2, + "baseline": 19 + }, + { + "type": "rectangle", + "version": 615, + "versionNonce": 960708792, + "isDeleted": false, + "id": "OuAJaakqomZtYKSFzLhPl", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 638.0455461582435, + "y": -118.42669660768183, + "strokeColor": "#000000", + "backgroundColor": "#e3e3e3", + "width": 508, + "height": 35, + "seed": 1084855855, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "type": "text", + "id": "jJfqzPB2mwFm3YjyyEcXh" + } + ], + "updated": 1682078796134, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 545, + "versionNonce": 1612203720, + "isDeleted": false, + "id": "jJfqzPB2mwFm3YjyyEcXh", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 643.0455461582435, + "y": -112.92669660768183, + "strokeColor": "#000000", + "backgroundColor": "#e3e3e3", + "width": 105.5999984741211, + "height": 24, + "seed": 1445772529, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1682078796134, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": " COPY . .", + "textAlign": "left", + "verticalAlign": "middle", + "containerId": "OuAJaakqomZtYKSFzLhPl", + "originalText": " COPY . .", + "lineHeight": 1.2, + "baseline": 19 + }, + { + "type": "rectangle", + "version": 644, + "versionNonce": 25848248, + "isDeleted": false, + "id": "NStsDITem68wcwXL9zRzc", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 639.6167059254451, + "y": -69.6457410358633, + "strokeColor": "#000000", + "backgroundColor": "#e3e3e3", + "width": 508, + "height": 37, + "seed": 1084855855, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "type": "text", + "id": "bH7QVuGj1Su851B2uMZsz" + } + ], + "updated": 1682078796134, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 592, + "versionNonce": 32779720, + "isDeleted": false, + "id": "bH7QVuGj1Su851B2uMZsz", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 644.6167059254451, + "y": -63.145741035863296, + "strokeColor": "#000000", + "backgroundColor": "#e3e3e3", + "width": 234.6666717529297, + "height": 24, + "seed": 1445772529, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1682078796134, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": " RUN go mod download", + "textAlign": "left", + "verticalAlign": "middle", + "containerId": "NStsDITem68wcwXL9zRzc", + "originalText": " RUN go mod download", + "lineHeight": 1.2, + "baseline": 19 + }, + { + "type": "rectangle", + "version": 722, + "versionNonce": 1761899192, + "isDeleted": false, + "id": "MzXUOSe7n-Dnrx40FWxiB", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 639.6970296657794, + "y": -21.64032029894264, + "strokeColor": "#000000", + "backgroundColor": "#e3e3e3", + "width": 509, + "height": 40, + "seed": 1084855855, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "type": "text", + "id": "8jD0rc-bo4saT0v8KGn5G" + } + ], + "updated": 1682078796134, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 842, + "versionNonce": 1840985288, + "isDeleted": false, + "id": "8jD0rc-bo4saT0v8KGn5G", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 644.6970296657794, + "y": -13.64032029894264, + "strokeColor": "#000000", + "backgroundColor": "#e3e3e3", + "width": 481.0666809082031, + "height": 24, + "seed": 1445772529, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1682078796134, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": " RUN go build -o /bin/client ./cmd/client", + "textAlign": "left", + "verticalAlign": "middle", + "containerId": "MzXUOSe7n-Dnrx40FWxiB", + "originalText": " RUN go build -o /bin/client ./cmd/client", + "lineHeight": 1.2, + "baseline": 19 + }, + { + "type": "rectangle", + "version": 781, + "versionNonce": 1179999160, + "isDeleted": false, + "id": "eG5b42zBfDjm3K3TqK5X3", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 639.6970296657794, + "y": 30.7653720119244, + "strokeColor": "#000000", + "backgroundColor": "#e3e3e3", + "width": 510, + "height": 39, + "seed": 1084855855, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "type": "text", + "id": "OBgGgMTk4tGQ5TXekocyI" + } + ], + "updated": 1682078796134, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 853, + "versionNonce": 2030656456, + "isDeleted": false, + "id": "OBgGgMTk4tGQ5TXekocyI", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 644.6970296657794, + "y": 38.2653720119244, + "strokeColor": "#000000", + "backgroundColor": "#e3e3e3", + "width": 481.0666809082031, + "height": 24, + "seed": 1445772529, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1682078796134, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": " RUN go build -o /bin/server ./cmd/server", + "textAlign": "left", + "verticalAlign": "middle", + "containerId": "eG5b42zBfDjm3K3TqK5X3", + "originalText": " RUN go build -o /bin/server ./cmd/server", + "lineHeight": 1.2, + "baseline": 19 + }, + { + "type": "rectangle", + "version": 759, + "versionNonce": 2074158264, + "isDeleted": false, + "id": "0bNlsybeHdPhGdNNqZCJg", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 639.6462291528617, + "y": 83.10563461579335, + "strokeColor": "#000000", + "backgroundColor": "#e3e3e3", + "width": 510, + "height": 37, + "seed": 1084855855, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "type": "text", + "id": "lPMjmu9YmlT5CjT3G2rtF" + } + ], + "updated": 1682078796134, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 776, + "versionNonce": 1710924488, + "isDeleted": false, + "id": "lPMjmu9YmlT5CjT3G2rtF", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 644.6462291528617, + "y": 89.60563461579335, + "strokeColor": "#000000", + "backgroundColor": "#e3e3e3", + "width": 340.26666259765625, + "height": 24, + "seed": 1445772529, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1682078796134, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": " ENTRYPOINT [ \"/bin/server\" ]", + "textAlign": "left", + "verticalAlign": "middle", + "containerId": "0bNlsybeHdPhGdNNqZCJg", + "originalText": " ENTRYPOINT [ \"/bin/server\" ]", + "lineHeight": 1.2, + "baseline": 19 + }, + { + "type": "diamond", + "version": 1469, + "versionNonce": 109825464, + "isDeleted": false, + "id": "RYuFPI5RgKZHJpvulxoM9", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 642.2513588086606, + "y": -265.2153046148932, + "strokeColor": "#fff", + "backgroundColor": "#228be6", + "width": 71.95742348303496, + "height": 23.490318597290813, + "seed": 1187947486, + "groupIds": [ + "0xB-qCYuzErKGWb6FoSqN" + ], + "roundness": null, + "boundElements": [], + "updated": 1682078796134, + "link": null, + "locked": false + }, + { + "type": "diamond", + "version": 1512, + "versionNonce": 1395329480, + "isDeleted": false, + "id": "DBuZVAVAiy_DU4AparvEa", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 642.2513588086606, + "y": -270.88246268745, + "strokeColor": "#fff", + "backgroundColor": "#228be6", + "width": 71.95742348303496, + "height": 23.490318597290813, + "seed": 1263171614, + "groupIds": [ + "0xB-qCYuzErKGWb6FoSqN" + ], + "roundness": null, + "boundElements": [], + "updated": 1682078796134, + "link": null, + "locked": false + }, + { + "type": "diamond", + "version": 1590, + "versionNonce": 272193208, + "isDeleted": false, + "id": "br1kwSQBrPOnLthtJFnEi", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 642.2513588086606, + "y": -278.9506720374235, + "strokeColor": "#fff", + "backgroundColor": "#228be6", + "width": 71.95742348303496, + "height": 23.490318597290813, + "seed": 834782302, + "groupIds": [ + "0xB-qCYuzErKGWb6FoSqN" + ], + "roundness": null, + "boundElements": [], + "updated": 1682078796134, + "link": null, + "locked": false + }, + { + "type": "diamond", + "version": 1634, + "versionNonce": 733384904, + "isDeleted": false, + "id": "884dhkxts0N-mxCxyPRua", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 642.2513588086606, + "y": -286.9557136859493, + "strokeColor": "#fff", + "backgroundColor": "#228be6", + "width": 71.95742348303496, + "height": 23.490318597290813, + "seed": 470124702, + "groupIds": [ + "0xB-qCYuzErKGWb6FoSqN" + ], + "roundness": null, + "boundElements": [], + "updated": 1682078796134, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 831, + "versionNonce": 2102247352, + "isDeleted": false, + "id": "qaqSzlQ3zytAjxanVlKVN", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 727.1411505374489, + "y": -273.65702285137274, + "strokeColor": "#000000", + "backgroundColor": "#e3e3e3", + "width": 60.06666564941406, + "height": 23, + "seed": 836726576, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1682078796134, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 2, + "text": "Layers", + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Layers", + "lineHeight": 1.15, + "baseline": 17 + }, + { + "type": "rectangle", + "version": 493, + "versionNonce": 389625800, + "isDeleted": false, + "id": "Mo1Won5FznvrT2zA9rQ_8", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -178.29508608686155, + "y": -223.91532480201147, + "strokeColor": "#000", + "backgroundColor": "#fafafa", + "width": 502, + "height": 355, + "seed": 125281584, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "type": "text", + "id": "IG4X1TpF-yHcpQF3ErR7K" + }, + { + "id": "Vklii2X9cGfeFVv0CZWns", + "type": "arrow" + } + ], + "updated": 1682078796134, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 534, + "versionNonce": 2112686264, + "isDeleted": false, + "id": "IG4X1TpF-yHcpQF3ErR7K", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": -173.29508608686155, + "y": -202.41532480201147, + "strokeColor": "#000", + "backgroundColor": "#fff", + "width": 481.0666809082031, + "height": 312, + "seed": 867716912, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1682078796134, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": " FROM golang:1.20-alpine\n\n WORKDIR /src\n\n COPY . .\n\n RUN go mod download\n\n RUN go build -o /bin/client ./cmd/client\n\n RUN go build -o /bin/server ./cmd/server\n\n ENTRYPOINT [ \"/bin/server\" ]", + "textAlign": "left", + "verticalAlign": "middle", + "containerId": "Mo1Won5FznvrT2zA9rQ_8", + "originalText": " FROM golang:1.20-alpine\n\n WORKDIR /src\n\n COPY . .\n\n RUN go mod download\n\n RUN go build -o /bin/client ./cmd/client\n\n RUN go build -o /bin/server ./cmd/server\n\n ENTRYPOINT [ \"/bin/server\" ]", + "lineHeight": 1.2, + "baseline": 307 + }, + { + "type": "text", + "version": 292, + "versionNonce": 1775173320, + "isDeleted": false, + "id": "IuwMf4sJq84GYwXbTsRFy", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 424.07232327539066, + "y": 35.199364134050626, + "strokeColor": "#000000", + "backgroundColor": "#228be6", + "width": 87.16666412353516, + "height": 32.199999999999996, + "seed": 508140968, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1682078796134, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 2, + "text": "Builder", + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Builder", + "lineHeight": 1.15, + "baseline": 24 + }, + { + "type": "arrow", + "version": 187, + "versionNonce": 498807224, + "isDeleted": false, + "id": "Vklii2X9cGfeFVv0CZWns", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 338.9949266453093, + "y": -50.46499028057189, + "strokeColor": "#000000", + "backgroundColor": "#228be6", + "width": 44.78782285428963, + "height": 0.11172158519753594, + "seed": 1195893416, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1682078796134, + "link": null, + "locked": false, + "startBinding": { + "elementId": "Mo1Won5FznvrT2zA9rQ_8", + "focus": -0.019005718926385175, + "gap": 15.290012732170851 + }, + "endBinding": { + "elementId": "SFHQUuuicOlq9vRfI773_", + "focus": -0.039699039691007174, + "gap": 8.002330519747844 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "triangle", + "points": [ + [ + 0, + 0 + ], + [ + 44.78782285428963, + -0.11172158519753594 + ] + ] + }, + { + "type": "arrow", + "version": 243, + "versionNonce": 336848328, + "isDeleted": false, + "id": "7gZ80nQ7dwzbsKC9GQPR9", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 545.2691446701172, + "y": -53.222128967849784, + "strokeColor": "#000000", + "backgroundColor": "#228be6", + "width": 53.55295397590396, + "height": 0.11172158519753594, + "seed": 1195893416, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1682078796134, + "link": null, + "locked": false, + "startBinding": { + "elementId": "SFHQUuuicOlq9vRfI773_", + "focus": 0.00823465448392911, + "gap": 8.888591348440116 + }, + "endBinding": { + "elementId": "zOuEHckaFcXNVkBt39gKb", + "focus": -0.1469219716240139, + "gap": 15.003388563830356 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "triangle", + "points": [ + [ + 0, + 0 + ], + [ + 53.55295397590396, + -0.11172158519753594 + ] + ] + }, + { + "type": "rectangle", + "version": 330, + "versionNonce": 1406941880, + "isDeleted": false, + "id": "fZiPdWxYRF1JmSPLrKm-N", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 969.109534739559, + "y": -336.31718435661895, + "strokeColor": "transparent", + "backgroundColor": "#fafafa", + "width": 192.00145157378094, + "height": 50.39845439352683, + "seed": 202539942, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1682078796134, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 846, + "versionNonce": 321121480, + "isDeleted": false, + "id": "jPOEjVwyG_7mxaKc9_35g", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1079.8905864478502, + "y": -327.2917573437282, + "strokeColor": "#000000", + "backgroundColor": "#e3e3e3", + "width": 77.80000305175781, + "height": 32.199999999999996, + "seed": 836726576, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1682078796134, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 2, + "text": "Image", + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Image", + "lineHeight": 1.15, + "baseline": 24 + }, + { + "type": "line", + "version": 1061, + "versionNonce": 317989816, + "isDeleted": false, + "id": "LZY0RpUb0UiYIjjhy_65G", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 1062.836906556075, + "y": -336.56731729893613, + "strokeColor": "transparent", + "backgroundColor": "#228be6", + "width": 39.71886934685627, + "height": 60.0161496692391, + "seed": 422064194, + "groupIds": [ + "NspMiZPeL1JyT8ShEapSZ", + "q94k0uHoCUwzB3UXMYxmp" + ], + "roundness": null, + "boundElements": [], + "updated": 1682078796134, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 1.1414896649978488, + 46.48385494386502 + ], + [ + -37.64693276499203, + 60.0161496692391 + ], + [ + -38.577379681858424, + 7.457963665157539 + ], + [ + 0, + 0 + ] + ] + }, + { + "type": "line", + "version": 1237, + "versionNonce": 1620775880, + "isDeleted": false, + "id": "f9apehVxfO9P1-oWq_gAV", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 1023.0964682281352, + "y": -329.35403016186393, + "strokeColor": "transparent", + "backgroundColor": "#228be6", + "width": 53.83782482642408, + "height": 60.92139870620726, + "seed": 422064194, + "groupIds": [ + "NspMiZPeL1JyT8ShEapSZ", + "q94k0uHoCUwzB3UXMYxmp" + ], + "roundness": null, + "boundElements": [], + "updated": 1682078796134, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 0.9304469168664, + 53.035474261383364 + ], + [ + -50.56753600826789, + 23.772145077173093 + ], + [ + -52.90737790955768, + -7.8859244448239 + ], + [ + 0, + 0 + ] + ] + }, + { + "type": "line", + "version": 1660, + "versionNonce": 1495723192, + "isDeleted": false, + "id": "qc0Wtq3p102iaKvkaMoQV", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 1062.7937685939055, + "y": -338.30112077751807, + "strokeColor": "transparent", + "backgroundColor": "#228be6", + "width": 93.31623807210383, + "height": 12.045486352474217, + "seed": 422064194, + "groupIds": [ + "NspMiZPeL1JyT8ShEapSZ", + "q94k0uHoCUwzB3UXMYxmp" + ], + "roundness": null, + "boundElements": [], + "updated": 1682078796134, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + -38.99946517812237, + 8.249255428004421 + ], + [ + -93.31623807210383, + -0.10646734496071986 + ], + [ + -68.75089216930576, + -3.7962309244697963 + ], + [ + 0, + 0 + ] + ] + }, + { + "type": "rectangle", + "version": 285, + "versionNonce": 1653955272, + "isDeleted": false, + "id": "-j9W4Lw3Ibn0zOEcfkjiI", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 1028.9234638059147, + "y": -324.79542689176446, + "strokeColor": "transparent", + "backgroundColor": "#fff", + "width": 4.329051917865443, + "height": 49.062588402474084, + "seed": 599508674, + "groupIds": [ + "J196_FysPi2aIpi9XXkxb", + "q94k0uHoCUwzB3UXMYxmp" + ], + "roundness": null, + "boundElements": [], + "updated": 1682078796134, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 326, + "versionNonce": 1075353016, + "isDeleted": false, + "id": "l5EMxcqSW3rHbX3QMgbn1", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 1035.056287356224, + "y": -326.59919852420836, + "strokeColor": "transparent", + "backgroundColor": "#fff", + "width": 4.329051917865443, + "height": 49.062588402474084, + "seed": 599508674, + "groupIds": [ + "J196_FysPi2aIpi9XXkxb", + "q94k0uHoCUwzB3UXMYxmp" + ], + "roundness": null, + "boundElements": [], + "updated": 1682078796134, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 313, + "versionNonce": 1538179528, + "isDeleted": false, + "id": "ZuFrzI4vBwOoh063lRSv0", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 1041.549865233022, + "y": -328.7637244831409, + "strokeColor": "transparent", + "backgroundColor": "#fff", + "width": 4.329051917865443, + "height": 49.062588402474084, + "seed": 599508674, + "groupIds": [ + "J196_FysPi2aIpi9XXkxb", + "q94k0uHoCUwzB3UXMYxmp" + ], + "roundness": null, + "boundElements": [], + "updated": 1682078796134, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 297, + "versionNonce": 216866488, + "isDeleted": false, + "id": "ZQp9LHDeHrCPRmE4Migxn", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 1047.6826887833308, + "y": -330.56749611558473, + "strokeColor": "transparent", + "backgroundColor": "#fff", + "width": 4.329051917865443, + "height": 49.062588402474084, + "seed": 599508674, + "groupIds": [ + "J196_FysPi2aIpi9XXkxb", + "q94k0uHoCUwzB3UXMYxmp" + ], + "roundness": null, + "boundElements": [], + "updated": 1682078796134, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 301, + "versionNonce": 1526941896, + "isDeleted": false, + "id": "mey_THTYSEAj_9D8T485B", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 1053.4547580071512, + "y": -331.89740316018225, + "strokeColor": "transparent", + "backgroundColor": "#fff", + "width": 4.329051917865443, + "height": 49.062588402474084, + "seed": 599508674, + "groupIds": [ + "J196_FysPi2aIpi9XXkxb", + "q94k0uHoCUwzB3UXMYxmp" + ], + "roundness": null, + "boundElements": [], + "updated": 1682078796134, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 1678, + "versionNonce": 1078495160, + "isDeleted": false, + "id": "vKJG1yqojdR4rDscvT83Q", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 422.22605897267306, + "y": -52.53061774917594, + "strokeColor": "#000", + "backgroundColor": "#228be6", + "width": 48.462479197464376, + "height": 48.00727078788957, + "seed": 669731308, + "groupIds": [ + "52nhzbrnEWdcgp_ra2vVl" + ], + "roundness": null, + "boundElements": [], + "updated": 1682078796134, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 3.232350920222781, + -5.268712379608585 + ], + [ + 1.351727601895389, + -9.735192760635055 + ], + [ + 7.228675471667403, + -13.96659522687024 + ], + [ + 10.803172589834595, + -11.413107445744108 + ], + [ + 16.515894122589973, + -13.122940360317552 + ], + [ + 18.064782733515074, + -17.824498656134946 + ], + [ + 24.160388020957896, + -17.146081821325136 + ], + [ + 24.868903798698604, + -12.965838732654833 + ], + [ + 30.39532686507639, + -9.635814577273443 + ], + [ + 35.49664046480918, + -11.336252443851281 + ], + [ + 39.18092250906128, + -6.801751466310624 + ], + [ + 36.55941413142096, + -2.692359955414607 + ], + [ + 38.33070357577272, + 3.400875733155674 + ], + [ + 42.794352975538736, + 5.597274644151715 + ], + [ + 42.0149856200241, + 11.761361910495921 + ], + [ + 37.55133622025737, + 12.61158084378484 + ], + [ + 34.221312064876344, + 18.56311337680691 + ], + [ + 36.06345308700204, + 22.53080173215471 + ], + [ + 31.45810053168745, + 26.498490087502876 + ], + [ + 27.702966909661427, + 23.947833287636122 + ], + [ + 21.397176487769006, + 25.506567998665744 + ], + [ + 19.20077757677296, + 30.182772131754618 + ], + [ + 12.894987154880544, + 29.190850042917486 + ], + [ + 12.115619799365913, + 24.372942754280764 + ], + [ + 6.518345155214198, + 22.10569226551043 + ], + [ + 2.408953644318542, + 23.451872243217554 + ], + [ + -1.2753283999335585, + 19.200777576773326 + ], + [ + 0.7793673555146309, + 14.807979754780883 + ], + [ + -0.921070511063206, + 8.927298799533101 + ], + [ + -5.6681262219256405, + 6.376641999666707 + ], + [ + -4.676204133089232, + 1.0627736666110577 + ], + [ + 0, + 0 + ] + ] + }, + { + "type": "ellipse", + "version": 1000, + "versionNonce": 741273544, + "isDeleted": false, + "id": "-WXPvXmngRlalHmEY6k4K", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 425.9623492027681, + "y": -61.24184593691885, + "strokeColor": "transparent", + "backgroundColor": "#fff", + "width": 29.349481925706176, + "height": 29.349481925706176, + "seed": 865367148, + "groupIds": [ + "52nhzbrnEWdcgp_ra2vVl" + ], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1682078796134, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 1838, + "versionNonce": 642699448, + "isDeleted": false, + "id": "gEBaExnSr52zH3I4F8WUW", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 487.60771711946484, + "y": -51.64516541863682, + "strokeColor": "#000", + "backgroundColor": "#228be6", + "width": 18.07788101926878, + "height": 17.90807535510263, + "seed": 1706844116, + "groupIds": [ + "52nhzbrnEWdcgp_ra2vVl" + ], + "roundness": null, + "boundElements": [], + "updated": 1682078796134, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 1.2057586882878402, + -1.9653793429597384 + ], + [ + 0.5042327830146355, + -3.631503367983193 + ], + [ + 2.6965012369929946, + -5.209936654847365 + ], + [ + 4.02989017367221, + -4.257413196374152 + ], + [ + 6.160897540104465, + -4.895229430796297 + ], + [ + 6.738676978632851, + -6.649044193978904 + ], + [ + 9.012510859021344, + -6.395975448337794 + ], + [ + 9.276807365151004, + -4.836626062172748 + ], + [ + 11.338320112962455, + -3.5944324833633208 + ], + [ + 13.241254957095896, + -4.228744098074555 + ], + [ + 14.615596788970292, + -2.5372464588446797 + ], + [ + 13.637699716290658, + -1.004326723292682 + ], + [ + 14.29844098161481, + 1.2686232294224735 + ], + [ + 15.963508970231503, + 2.087942398424365 + ], + [ + 15.672782813488928, + 4.387322001752433 + ], + [ + 14.007714824871965, + 4.704477809108051 + ], + [ + 12.765521246062674, + 6.924568460597247 + ], + [ + 13.452692161999734, + 8.404628894923288 + ], + [ + 11.734764872156946, + 9.884689329249461 + ], + [ + 10.333993389669644, + 8.93322190718261 + ], + [ + 7.981754485115617, + 9.514674220667887 + ], + [ + 7.162435316113725, + 11.259031161123724 + ], + [ + 4.810196411559699, + 10.889016052542143 + ], + [ + 4.519470254817128, + 9.091799810860483 + ], + [ + 2.4315278563927616, + 8.246050991245545 + ], + [ + 0.8986081208408969, + 8.74821435289182 + ], + [ + -0.4757337110334955, + 7.16243531611386 + ], + [ + 0.2907261567425713, + 5.523796978109942 + ], + [ + -0.3435854579686661, + 3.3301359772337933 + ], + [ + -2.1143720490372777, + 2.3786685551670725 + ], + [ + -1.7443569404559698, + 0.3964447591944887 + ], + [ + 0, + 0 + ] + ] + }, + { + "type": "ellipse", + "version": 863, + "versionNonce": 1196275400, + "isDeleted": false, + "id": "wzaOwitMrmggg7jSv-UNd", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 50, + "angle": 0, + "x": 489.6397443130158, + "y": -54.32600274541321, + "strokeColor": "transparent", + "backgroundColor": "#fff", + "width": 9.838274710293614, + "height": 9.838274710293614, + "seed": 1346979156, + "groupIds": [ + "52nhzbrnEWdcgp_ra2vVl" + ], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1682078796134, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 1951, + "versionNonce": 1722022328, + "isDeleted": false, + "id": "gwX8bwPiUdvS-gKh8MDlX", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 451.75601869198056, + "y": -82.25977319554316, + "strokeColor": "#000", + "backgroundColor": "#228be6", + "width": 26.592110509330666, + "height": 26.342330627396294, + "seed": 2121165140, + "groupIds": [ + "52nhzbrnEWdcgp_ra2vVl" + ], + "roundness": null, + "boundElements": [], + "updated": 1682078796134, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 1.7736408516219317, + -2.8910238221523064 + ], + [ + 0.7417138034076349, + -5.341850561660664 + ], + [ + 3.9664858290767158, + -7.663686420142039 + ], + [ + 5.927867581633842, + -6.262548253370651 + ], + [ + 9.062526080822058, + -7.2007599703479155 + ], + [ + 9.912425173696347, + -9.78057759088306 + ], + [ + 13.257177900119409, + -9.408319800084842 + ], + [ + 13.64595144557746, + -7.114555881882269 + ], + [ + 16.6783851001504, + -5.2873202182293975 + ], + [ + 19.4775546274482, + -6.220376727328793 + ], + [ + 21.4991770638303, + -3.732226036397196 + ], + [ + 20.060714945635674, + -1.4773394727405513 + ], + [ + 21.0326488092808, + 1.8661130181987946 + ], + [ + 23.48192214566627, + 3.07131100911867 + ], + [ + 23.05427124566249, + 6.453640854603741 + ], + [ + 20.60499790927662, + 6.920169109153439 + ], + [ + 18.77776224562395, + 10.185866891001135 + ], + [ + 19.7885734638148, + 12.362998745566134 + ], + [ + 17.26154541833748, + 14.540130600131329 + ], + [ + 15.201045627409659, + 13.140545836482236 + ], + [ + 11.740961072832937, + 13.995847636489982 + ], + [ + 10.53576308191306, + 16.56175303651323 + ], + [ + 7.0756785273363425, + 16.017470072871877 + ], + [ + 6.648027627332568, + 13.37380996375718 + ], + [ + 3.5767166182138967, + 12.129734618291383 + ], + [ + 1.3218300545574475, + 12.86840435466156 + ], + [ + -0.699792381824648, + 10.535763081913261 + ], + [ + 0.4276509000037744, + 8.125367100073314 + ], + [ + -0.5054056090956239, + 4.898546672771543 + ], + [ + -3.110188363664396, + 3.498961909122644 + ], + [ + -2.565905400023444, + 0.5831603181870729 + ], + [ + 0, + 0 + ] + ] + }, + { + "type": "ellipse", + "version": 974, + "versionNonce": 1090231752, + "isDeleted": false, + "id": "m6Fx8ZqwCtaYCkkn8hZWu", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 50, + "angle": 0, + "x": 454.7450798342281, + "y": -86.20321780474154, + "strokeColor": "transparent", + "backgroundColor": "#fff", + "width": 14.471855857355514, + "height": 14.471855857355514, + "seed": 1761484500, + "groupIds": [ + "52nhzbrnEWdcgp_ra2vVl" + ], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1682078796134, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 1314, + "versionNonce": 342622904, + "isDeleted": false, + "id": "s6xnyEL9P14KTQYPjlDAF", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 461.31290845778085, + "y": -52.41541508051079, + "strokeColor": "#000", + "backgroundColor": "#ced4da", + "width": 64.82480153660623, + "height": 27.150152172978316, + "seed": 1182034516, + "groupIds": [ + "52nhzbrnEWdcgp_ra2vVl" + ], + "roundness": null, + "boundElements": [], + "updated": 1682078796134, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 9.698769110680917, + 4.228444879073213 + ], + [ + 9.904237349153744, + 8.049813005593023 + ], + [ + 7.868421773176677, + 11.549834229089711 + ], + [ + -2.961133307055898, + 9.109371112417243 + ], + [ + -2.808604362263954, + 13.532710511385893 + ], + [ + 3.7501402637923684, + 18.566165689522318 + ], + [ + 12.901876951313557, + 17.19340518639437 + ], + [ + 16.562571626322036, + 13.38018156659395 + ], + [ + 59.72826300246312, + 22.83697614369857 + ], + [ + 61.863668229550335, + 16.735818352018082 + ], + [ + 17.630274239865642, + 7.279023774913457 + ], + [ + 15.64739795756946, + 0.2626923144808493 + ], + [ + 6.49566127004918, + -4.313176029279745 + ], + [ + 0, + 0 + ] + ] + }, + { + "type": "diamond", + "version": 1486, + "versionNonce": 1084970440, + "isDeleted": false, + "id": "Hh9F5WcDbakzc8zuSIdRu", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 1722.1127987469904, + "y": -252.42004201135836, + "strokeColor": "#fff", + "backgroundColor": "#228be6", + "width": 71.95742348303496, + "height": 23.490318597290813, + "seed": 1187947486, + "groupIds": [ + "YAbIAbOztFIE4zd0pwOMb" + ], + "roundness": null, + "boundElements": [], + "updated": 1682078796134, + "link": null, + "locked": false + }, + { + "type": "diamond", + "version": 1527, + "versionNonce": 1924385464, + "isDeleted": false, + "id": "AMoOGpefXu6TvXdtvXueG", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 1722.1127987469904, + "y": -258.0872000839152, + "strokeColor": "#fff", + "backgroundColor": "#228be6", + "width": 71.95742348303496, + "height": 23.490318597290813, + "seed": 1263171614, + "groupIds": [ + "YAbIAbOztFIE4zd0pwOMb" + ], + "roundness": null, + "boundElements": [], + "updated": 1682078796134, + "link": null, + "locked": false + }, + { + "type": "diamond", + "version": 1607, + "versionNonce": 458054856, + "isDeleted": false, + "id": "qjNl_LGTeW8nNBtib2k9J", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 1722.1127987469904, + "y": -266.1554094338887, + "strokeColor": "#fff", + "backgroundColor": "#228be6", + "width": 71.95742348303496, + "height": 23.490318597290813, + "seed": 834782302, + "groupIds": [ + "YAbIAbOztFIE4zd0pwOMb" + ], + "roundness": null, + "boundElements": [], + "updated": 1682078796134, + "link": null, + "locked": false + }, + { + "type": "diamond", + "version": 1649, + "versionNonce": 274314168, + "isDeleted": false, + "id": "5AaSHthQuz6DaD2PH-dcR", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 1722.1127987469904, + "y": -274.16045108241445, + "strokeColor": "#fff", + "backgroundColor": "#228be6", + "width": 71.95742348303496, + "height": 23.490318597290813, + "seed": 470124702, + "groupIds": [ + "YAbIAbOztFIE4zd0pwOMb" + ], + "roundness": null, + "boundElements": [], + "updated": 1682078796134, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 823, + "versionNonce": 35029960, + "isDeleted": false, + "id": "zcPSJeUOwih-WQxkYOzG0", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1809.002590475779, + "y": -261.7912826420143, + "strokeColor": "#000000", + "backgroundColor": "#e3e3e3", + "width": 60.06666564941406, + "height": 23, + "seed": 836726576, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1682078796134, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 2, + "text": "Layers", + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Layers", + "lineHeight": 1.15, + "baseline": 17 + }, + { + "type": "text", + "version": 924, + "versionNonce": 861568184, + "isDeleted": false, + "id": "l9m8R9c_E3ag51eRxDKOx", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2263.659306353637, + "y": -261.0872177696112, + "strokeColor": "#000000", + "backgroundColor": "#e3e3e3", + "width": 68.96666717529297, + "height": 23, + "seed": 836726576, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1682078796134, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 2, + "text": "Cache?", + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Cache?", + "lineHeight": 1.15, + "baseline": 17 + }, + { + "type": "freedraw", + "version": 397, + "versionNonce": 53211832, + "isDeleted": false, + "id": "U06QzHeksRgelkD-2vGTF", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2279.500889620965, + "y": -53.83877552622994, + "strokeColor": "#5c940d", + "backgroundColor": "#fa5252", + "width": 24.64377626640656, + "height": 30.81734296916816, + "seed": 1480973808, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1682078975614, + "link": null, + "locked": false, + "points": [ + [ + 0, + -81.38818177809442 + ], + [ + 0, + -81.41526825349533 + ], + [ + 0.23813898002678474, + -81.37640504965924 + ], + [ + 0.5009149710080372, + -81.20486043897654 + ], + [ + 2.2045896484296477, + -80.02954294114599 + ], + [ + 4.857775855588728, + -77.2616161344088 + ], + [ + 7.240377774244314, + -74.4552217483064 + ], + [ + 9.107603867636039, + -72.0888813812087 + ], + [ + 9.757665777957712, + -70.9170969019087 + ], + [ + 10.085416952291368, + -70.31648375171473 + ], + [ + 10.185233492096655, + -70.12413665431959 + ], + [ + 10.185233492096655, + -70.0095067640275 + ], + [ + 10.185233492096655, + -70.03659323942841 + ], + [ + 10.143739578910191, + -70.09076619023023 + ], + [ + 10.10224566572366, + -70.14493914103204 + ], + [ + 10.019257839350729, + -70.17202561643295 + ], + [ + 9.936270012977733, + -70.19911209183385 + ], + [ + 9.936270012977733, + -70.31491965496943 + ], + [ + 9.888771885451114, + -70.49981429140169 + ], + [ + 9.835241354784571, + -70.81425294062089 + ], + [ + 9.835241354784571, + -71.43253118346763 + ], + [ + 9.835241354784571, + -74.03950323454468 + ], + [ + 10.589968278463157, + -78.9319518509876 + ], + [ + 11.817928771825642, + -82.74210992366878 + ], + [ + 14.702065815083053, + -88.90566316273802 + ], + [ + 18.373375090495763, + -94.86429212646614 + ], + [ + 20.12513986023814, + -97.09794648643268 + ], + [ + 22.49088487666173, + -99.54475963107589 + ], + [ + 23.68879610952368, + -100.34400386735346 + ], + [ + 24.374347718691663, + -100.70712272762775 + ], + [ + 24.60287431801418, + -100.79976325779477 + ], + [ + 24.643776266406558, + -100.82684973319567 + ], + [ + 24.602282353220097, + -100.82684973319567 + ], + [ + 24.519294526847165, + -100.82684973319567 + ], + [ + 24.477800613660634, + -100.80015888226563 + ], + [ + 24.477800613660634, + -100.80015888226563 + ] + ], + "lastCommittedPoint": null, + "simulatePressure": true, + "pressures": [] + }, + { + "type": "freedraw", + "version": 428, + "versionNonce": 669207992, + "isDeleted": false, + "id": "TcsAj8vDsgkEGSFiefiyr", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2280.767967361648, + "y": -101.93602292010746, + "strokeColor": "#5c940d", + "backgroundColor": "#fa5252", + "width": 24.64377626640656, + "height": 30.81734296916816, + "seed": 1480973808, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1682078977147, + "link": null, + "locked": false, + "points": [ + [ + 0, + -81.38818177809442 + ], + [ + 0, + -81.41526825349533 + ], + [ + 0.23813898002678474, + -81.37640504965924 + ], + [ + 0.5009149710080372, + -81.20486043897654 + ], + [ + 2.2045896484296477, + -80.02954294114599 + ], + [ + 4.857775855588728, + -77.2616161344088 + ], + [ + 7.240377774244314, + -74.4552217483064 + ], + [ + 9.107603867636039, + -72.0888813812087 + ], + [ + 9.757665777957712, + -70.9170969019087 + ], + [ + 10.085416952291368, + -70.31648375171473 + ], + [ + 10.185233492096655, + -70.12413665431959 + ], + [ + 10.185233492096655, + -70.0095067640275 + ], + [ + 10.185233492096655, + -70.03659323942841 + ], + [ + 10.143739578910191, + -70.09076619023023 + ], + [ + 10.10224566572366, + -70.14493914103204 + ], + [ + 10.019257839350729, + -70.17202561643295 + ], + [ + 9.936270012977733, + -70.19911209183385 + ], + [ + 9.936270012977733, + -70.31491965496943 + ], + [ + 9.888771885451114, + -70.49981429140169 + ], + [ + 9.835241354784571, + -70.81425294062089 + ], + [ + 9.835241354784571, + -71.43253118346763 + ], + [ + 9.835241354784571, + -74.03950323454468 + ], + [ + 10.589968278463157, + -78.9319518509876 + ], + [ + 11.817928771825642, + -82.74210992366878 + ], + [ + 14.702065815083053, + -88.90566316273802 + ], + [ + 18.373375090495763, + -94.86429212646614 + ], + [ + 20.12513986023814, + -97.09794648643268 + ], + [ + 22.49088487666173, + -99.54475963107589 + ], + [ + 23.68879610952368, + -100.34400386735346 + ], + [ + 24.374347718691663, + -100.70712272762775 + ], + [ + 24.60287431801418, + -100.79976325779477 + ], + [ + 24.643776266406558, + -100.82684973319567 + ], + [ + 24.602282353220097, + -100.82684973319567 + ], + [ + 24.519294526847165, + -100.82684973319567 + ], + [ + 24.477800613660634, + -100.80015888226563 + ], + [ + 24.477800613660634, + -100.80015888226563 + ] + ], + "lastCommittedPoint": null, + "simulatePressure": true, + "pressures": [] + }, + { + "type": "freedraw", + "version": 415, + "versionNonce": 1348880328, + "isDeleted": false, + "id": "HCutS2GHFgsa9m2FanNzr", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2280.86928932373, + "y": -4.448292506455161, + "strokeColor": "#c92a2a", + "backgroundColor": "#fa5252", + "width": 31.804596513146894, + "height": 26.633896148620426, + "seed": 1419777296, + "groupIds": [ + "1xwJrxzdvRHBvT9Nl2P8W" + ], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1682078971117, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 0.030778514904426815, + 0.09299929862902157 + ], + [ + 2.316320886850439, + 1.7631926237913227 + ], + [ + 10.040384231049838, + 7.177236646092732 + ], + [ + 18.84025336617455, + 14.187354806306509 + ], + [ + 25.5073910308277, + 20.349613381424845 + ], + [ + 28.976431217893442, + 23.710969738788958 + ], + [ + 31.112686320263016, + 25.86190937223112 + ], + [ + 31.59657111927991, + 26.39124902273236 + ], + [ + 31.70950761885747, + 26.56257128341057 + ], + [ + 31.780832484067304, + 26.633896148620426 + ], + [ + 31.804596513146894, + 26.633896148620426 + ], + [ + 31.804596513146894, + 26.60977156185827 + ], + [ + 31.804596513146894, + 26.56152238833393 + ], + [ + 31.780471926384735, + 26.489148628047428 + ], + [ + 31.732222752860384, + 26.46502404128526 + ], + [ + 31.68397357933609, + 26.416774867760928 + ], + [ + 31.659848992573902, + 26.39265028099877 + ], + [ + 31.63572440581173, + 26.368525694236602 + ], + [ + 31.611599819049577, + 26.368525694236602 + ], + [ + 31.587475232287428, + 26.344401107474436 + ], + [ + 31.587475232287428, + 26.32027652071225 + ], + [ + 31.587475232287428, + 26.32027652071225 + ] + ], + "lastCommittedPoint": null, + "simulatePressure": true, + "pressures": [] + }, + { + "type": "freedraw", + "version": 379, + "versionNonce": 98105528, + "isDeleted": false, + "id": "yXLL6fPYVJTQzceQ-4Oyt", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2285.570036376722, + "y": 144.81162671704965, + "strokeColor": "#c92a2a", + "backgroundColor": "#fa5252", + "width": 24.907062489320822, + "height": 25.850715695085345, + "seed": 2113600784, + "groupIds": [ + "1xwJrxzdvRHBvT9Nl2P8W" + ], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1682078971117, + "link": null, + "locked": false, + "points": [ + [ + -0.1163708418009441, + -124.69724668250512 + ], + [ + -0.14049542856309927, + -124.69724668250512 + ], + [ + 0.11053466344512812, + -124.7392024855697 + ], + [ + 3.0394102750392356, + -127.6540819034853 + ], + [ + 9.96316667578074, + -135.79000864960486 + ], + [ + 15.037721056448401, + -141.64983307946807 + ], + [ + 17.434790475212715, + -144.4248652834967 + ], + [ + 18.362013722941118, + -145.3531374263017 + ], + [ + 18.700806832688077, + -145.5926296724673 + ], + [ + 18.833672338721286, + -145.699272801585 + ], + [ + 18.904997203931153, + -145.74752197510932 + ], + [ + 19.11477621925434, + -145.87198812603685 + ], + [ + 19.316852411358592, + -146.01289242949318 + ], + [ + 19.41895579147296, + -146.08875704370655 + ], + [ + 19.46650023861764, + -146.1128816304687 + ], + [ + 19.46650023861764, + -146.13700621723078 + ], + [ + 19.490280656682792, + -146.13700621723078 + ], + [ + 19.60705217888419, + -146.16812890083233 + ], + [ + 20.051078964989735, + -146.4677605295546 + ], + [ + 20.351423514584464, + -146.67264743268458 + ], + [ + 20.53357070023305, + -146.8285804359105 + ], + [ + 20.60489556544292, + -146.8527050226727 + ], + [ + 20.748954748621884, + -146.96982890806385 + ], + [ + 20.989495889863942, + -147.14918996616518 + ], + [ + 21.12970366143343, + -147.294289849928 + ], + [ + 21.231790652562182, + -147.37016265863411 + ], + [ + 21.326895935837207, + -147.4425364189206 + ], + [ + 21.350659964916808, + -147.46666100568282 + ], + [ + 21.6345663619827, + -147.77887937532452 + ], + [ + 22.058319972935507, + -148.24563768441863 + ], + [ + 22.376839907529718, + -148.59632100319806 + ], + [ + 22.551644827641987, + -148.76833979576313 + ], + [ + 22.771912793731353, + -148.99349987404574 + ], + [ + 22.908269153691386, + -149.1309051290824 + ], + [ + 23.07189678564346, + -149.26831038411913 + ], + [ + 23.32328743533427, + -149.48962724528502 + ], + [ + 23.623271427246415, + -149.7144431548706 + ], + [ + 24.2235835797677, + -150.20182700230723 + ], + [ + 24.469385585378415, + -150.37909027025532 + ], + [ + 24.67146177748271, + -150.52383779082834 + ], + [ + 24.742786642692593, + -150.54796237759047 + ], + [ + 24.766567060757723, + -150.54796237759047 + ], + [ + 24.766567060757723, + -150.54796237759047 + ] + ], + "lastCommittedPoint": null, + "simulatePressure": true, + "pressures": [] + }, + { + "type": "freedraw", + "version": 467, + "versionNonce": 414001096, + "isDeleted": false, + "id": "YznBJuAOOQg0rTmY2QJfD", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2278.7443108478224, + "y": -54.92629705283508, + "strokeColor": "#c92a2a", + "backgroundColor": "#fa5252", + "width": 31.804596513146894, + "height": 26.633896148620426, + "seed": 1419777296, + "groupIds": [ + "igB2hJfRf-tKUrzsPny6F" + ], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1682078980692, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 0.030778514904426815, + 0.09299929862902157 + ], + [ + 2.316320886850439, + 1.7631926237913227 + ], + [ + 10.040384231049838, + 7.177236646092732 + ], + [ + 18.84025336617455, + 14.187354806306509 + ], + [ + 25.5073910308277, + 20.349613381424845 + ], + [ + 28.976431217893442, + 23.710969738788958 + ], + [ + 31.112686320263016, + 25.86190937223112 + ], + [ + 31.59657111927991, + 26.39124902273236 + ], + [ + 31.70950761885747, + 26.56257128341057 + ], + [ + 31.780832484067304, + 26.633896148620426 + ], + [ + 31.804596513146894, + 26.633896148620426 + ], + [ + 31.804596513146894, + 26.60977156185827 + ], + [ + 31.804596513146894, + 26.56152238833393 + ], + [ + 31.780471926384735, + 26.489148628047428 + ], + [ + 31.732222752860384, + 26.46502404128526 + ], + [ + 31.68397357933609, + 26.416774867760928 + ], + [ + 31.659848992573902, + 26.39265028099877 + ], + [ + 31.63572440581173, + 26.368525694236602 + ], + [ + 31.611599819049577, + 26.368525694236602 + ], + [ + 31.587475232287428, + 26.344401107474436 + ], + [ + 31.587475232287428, + 26.32027652071225 + ], + [ + 31.587475232287428, + 26.32027652071225 + ] + ], + "lastCommittedPoint": null, + "simulatePressure": true, + "pressures": [] + }, + { + "type": "freedraw", + "version": 431, + "versionNonce": 1911560376, + "isDeleted": false, + "id": "kwmPvM7RJ2jUxxSz8SfPR", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2283.445057900814, + "y": 94.33362217066973, + "strokeColor": "#c92a2a", + "backgroundColor": "#fa5252", + "width": 24.907062489320822, + "height": 25.850715695085345, + "seed": 2113600784, + "groupIds": [ + "igB2hJfRf-tKUrzsPny6F" + ], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1682078980692, + "link": null, + "locked": false, + "points": [ + [ + -0.1163708418009441, + -124.69724668250512 + ], + [ + -0.14049542856309927, + -124.69724668250512 + ], + [ + 0.11053466344512812, + -124.7392024855697 + ], + [ + 3.0394102750392356, + -127.6540819034853 + ], + [ + 9.96316667578074, + -135.79000864960486 + ], + [ + 15.037721056448401, + -141.64983307946807 + ], + [ + 17.434790475212715, + -144.4248652834967 + ], + [ + 18.362013722941118, + -145.3531374263017 + ], + [ + 18.700806832688077, + -145.5926296724673 + ], + [ + 18.833672338721286, + -145.699272801585 + ], + [ + 18.904997203931153, + -145.74752197510932 + ], + [ + 19.11477621925434, + -145.87198812603685 + ], + [ + 19.316852411358592, + -146.01289242949318 + ], + [ + 19.41895579147296, + -146.08875704370655 + ], + [ + 19.46650023861764, + -146.1128816304687 + ], + [ + 19.46650023861764, + -146.13700621723078 + ], + [ + 19.490280656682792, + -146.13700621723078 + ], + [ + 19.60705217888419, + -146.16812890083233 + ], + [ + 20.051078964989735, + -146.4677605295546 + ], + [ + 20.351423514584464, + -146.67264743268458 + ], + [ + 20.53357070023305, + -146.8285804359105 + ], + [ + 20.60489556544292, + -146.8527050226727 + ], + [ + 20.748954748621884, + -146.96982890806385 + ], + [ + 20.989495889863942, + -147.14918996616518 + ], + [ + 21.12970366143343, + -147.294289849928 + ], + [ + 21.231790652562182, + -147.37016265863411 + ], + [ + 21.326895935837207, + -147.4425364189206 + ], + [ + 21.350659964916808, + -147.46666100568282 + ], + [ + 21.6345663619827, + -147.77887937532452 + ], + [ + 22.058319972935507, + -148.24563768441863 + ], + [ + 22.376839907529718, + -148.59632100319806 + ], + [ + 22.551644827641987, + -148.76833979576313 + ], + [ + 22.771912793731353, + -148.99349987404574 + ], + [ + 22.908269153691386, + -149.1309051290824 + ], + [ + 23.07189678564346, + -149.26831038411913 + ], + [ + 23.32328743533427, + -149.48962724528502 + ], + [ + 23.623271427246415, + -149.7144431548706 + ], + [ + 24.2235835797677, + -150.20182700230723 + ], + [ + 24.469385585378415, + -150.37909027025532 + ], + [ + 24.67146177748271, + -150.52383779082834 + ], + [ + 24.742786642692593, + -150.54796237759047 + ], + [ + 24.766567060757723, + -150.54796237759047 + ], + [ + 24.766567060757723, + -150.54796237759047 + ] + ], + "lastCommittedPoint": null, + "simulatePressure": true, + "pressures": [] + }, + { + "type": "freedraw", + "version": 412, + "versionNonce": 817592760, + "isDeleted": false, + "id": "2nOLefHcfIu73t501fPpU", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2275.568142198049, + "y": -103.90421550284864, + "strokeColor": "#c92a2a", + "backgroundColor": "#fa5252", + "width": 31.804596513146894, + "height": 26.633896148620426, + "seed": 1419777296, + "groupIds": [ + "Pm7hFMKHHyJxmCnZV4V8X" + ], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1682078978599, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 0.030778514904426815, + 0.09299929862902157 + ], + [ + 2.316320886850439, + 1.7631926237913227 + ], + [ + 10.040384231049838, + 7.177236646092732 + ], + [ + 18.84025336617455, + 14.187354806306509 + ], + [ + 25.5073910308277, + 20.349613381424845 + ], + [ + 28.976431217893442, + 23.710969738788958 + ], + [ + 31.112686320263016, + 25.86190937223112 + ], + [ + 31.59657111927991, + 26.39124902273236 + ], + [ + 31.70950761885747, + 26.56257128341057 + ], + [ + 31.780832484067304, + 26.633896148620426 + ], + [ + 31.804596513146894, + 26.633896148620426 + ], + [ + 31.804596513146894, + 26.60977156185827 + ], + [ + 31.804596513146894, + 26.56152238833393 + ], + [ + 31.780471926384735, + 26.489148628047428 + ], + [ + 31.732222752860384, + 26.46502404128526 + ], + [ + 31.68397357933609, + 26.416774867760928 + ], + [ + 31.659848992573902, + 26.39265028099877 + ], + [ + 31.63572440581173, + 26.368525694236602 + ], + [ + 31.611599819049577, + 26.368525694236602 + ], + [ + 31.587475232287428, + 26.344401107474436 + ], + [ + 31.587475232287428, + 26.32027652071225 + ], + [ + 31.587475232287428, + 26.32027652071225 + ] + ], + "lastCommittedPoint": null, + "simulatePressure": true, + "pressures": [] + }, + { + "type": "freedraw", + "version": 376, + "versionNonce": 1713118664, + "isDeleted": false, + "id": "DeTIb-QjKjRTHFrWR9a9p", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2280.2688892510405, + "y": 45.355703720656166, + "strokeColor": "#c92a2a", + "backgroundColor": "#fa5252", + "width": 24.907062489320822, + "height": 25.850715695085345, + "seed": 2113600784, + "groupIds": [ + "Pm7hFMKHHyJxmCnZV4V8X" + ], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1682078978599, + "link": null, + "locked": false, + "points": [ + [ + -0.1163708418009441, + -124.69724668250512 + ], + [ + -0.14049542856309927, + -124.69724668250512 + ], + [ + 0.11053466344512812, + -124.7392024855697 + ], + [ + 3.0394102750392356, + -127.6540819034853 + ], + [ + 9.96316667578074, + -135.79000864960486 + ], + [ + 15.037721056448401, + -141.64983307946807 + ], + [ + 17.434790475212715, + -144.4248652834967 + ], + [ + 18.362013722941118, + -145.3531374263017 + ], + [ + 18.700806832688077, + -145.5926296724673 + ], + [ + 18.833672338721286, + -145.699272801585 + ], + [ + 18.904997203931153, + -145.74752197510932 + ], + [ + 19.11477621925434, + -145.87198812603685 + ], + [ + 19.316852411358592, + -146.01289242949318 + ], + [ + 19.41895579147296, + -146.08875704370655 + ], + [ + 19.46650023861764, + -146.1128816304687 + ], + [ + 19.46650023861764, + -146.13700621723078 + ], + [ + 19.490280656682792, + -146.13700621723078 + ], + [ + 19.60705217888419, + -146.16812890083233 + ], + [ + 20.051078964989735, + -146.4677605295546 + ], + [ + 20.351423514584464, + -146.67264743268458 + ], + [ + 20.53357070023305, + -146.8285804359105 + ], + [ + 20.60489556544292, + -146.8527050226727 + ], + [ + 20.748954748621884, + -146.96982890806385 + ], + [ + 20.989495889863942, + -147.14918996616518 + ], + [ + 21.12970366143343, + -147.294289849928 + ], + [ + 21.231790652562182, + -147.37016265863411 + ], + [ + 21.326895935837207, + -147.4425364189206 + ], + [ + 21.350659964916808, + -147.46666100568282 + ], + [ + 21.6345663619827, + -147.77887937532452 + ], + [ + 22.058319972935507, + -148.24563768441863 + ], + [ + 22.376839907529718, + -148.59632100319806 + ], + [ + 22.551644827641987, + -148.76833979576313 + ], + [ + 22.771912793731353, + -148.99349987404574 + ], + [ + 22.908269153691386, + -149.1309051290824 + ], + [ + 23.07189678564346, + -149.26831038411913 + ], + [ + 23.32328743533427, + -149.48962724528502 + ], + [ + 23.623271427246415, + -149.7144431548706 + ], + [ + 24.2235835797677, + -150.20182700230723 + ], + [ + 24.469385585378415, + -150.37909027025532 + ], + [ + 24.67146177748271, + -150.52383779082834 + ], + [ + 24.742786642692593, + -150.54796237759047 + ], + [ + 24.766567060757723, + -150.54796237759047 + ], + [ + 24.766567060757723, + -150.54796237759047 + ] + ], + "lastCommittedPoint": null, + "simulatePressure": true, + "pressures": [] + }, + { + "type": "freedraw", + "version": 451, + "versionNonce": 254086840, + "isDeleted": false, + "id": "nFkdhMO8woi_PcVUjWz-t", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2281.8068000857756, + "y": 44.77682781168045, + "strokeColor": "#c92a2a", + "backgroundColor": "#fa5252", + "width": 31.804596513146894, + "height": 26.633896148620426, + "seed": 1419777296, + "groupIds": [ + "PlQkz6sGSyH9NebVRcVgs" + ], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1682078973884, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 0.030778514904426815, + 0.09299929862902157 + ], + [ + 2.316320886850439, + 1.7631926237913227 + ], + [ + 10.040384231049838, + 7.177236646092732 + ], + [ + 18.84025336617455, + 14.187354806306509 + ], + [ + 25.5073910308277, + 20.349613381424845 + ], + [ + 28.976431217893442, + 23.710969738788958 + ], + [ + 31.112686320263016, + 25.86190937223112 + ], + [ + 31.59657111927991, + 26.39124902273236 + ], + [ + 31.70950761885747, + 26.56257128341057 + ], + [ + 31.780832484067304, + 26.633896148620426 + ], + [ + 31.804596513146894, + 26.633896148620426 + ], + [ + 31.804596513146894, + 26.60977156185827 + ], + [ + 31.804596513146894, + 26.56152238833393 + ], + [ + 31.780471926384735, + 26.489148628047428 + ], + [ + 31.732222752860384, + 26.46502404128526 + ], + [ + 31.68397357933609, + 26.416774867760928 + ], + [ + 31.659848992573902, + 26.39265028099877 + ], + [ + 31.63572440581173, + 26.368525694236602 + ], + [ + 31.611599819049577, + 26.368525694236602 + ], + [ + 31.587475232287428, + 26.344401107474436 + ], + [ + 31.587475232287428, + 26.32027652071225 + ], + [ + 31.587475232287428, + 26.32027652071225 + ] + ], + "lastCommittedPoint": null, + "simulatePressure": true, + "pressures": [] + }, + { + "type": "freedraw", + "version": 415, + "versionNonce": 746739912, + "isDeleted": false, + "id": "nzFlVPdi-Oj7nUqdbqwb1", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2286.507547138767, + "y": 194.03674703518524, + "strokeColor": "#c92a2a", + "backgroundColor": "#fa5252", + "width": 24.907062489320822, + "height": 25.850715695085345, + "seed": 2113600784, + "groupIds": [ + "PlQkz6sGSyH9NebVRcVgs" + ], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1682078973884, + "link": null, + "locked": false, + "points": [ + [ + -0.1163708418009441, + -124.69724668250512 + ], + [ + -0.14049542856309927, + -124.69724668250512 + ], + [ + 0.11053466344512812, + -124.7392024855697 + ], + [ + 3.0394102750392356, + -127.6540819034853 + ], + [ + 9.96316667578074, + -135.79000864960486 + ], + [ + 15.037721056448401, + -141.64983307946807 + ], + [ + 17.434790475212715, + -144.4248652834967 + ], + [ + 18.362013722941118, + -145.3531374263017 + ], + [ + 18.700806832688077, + -145.5926296724673 + ], + [ + 18.833672338721286, + -145.699272801585 + ], + [ + 18.904997203931153, + -145.74752197510932 + ], + [ + 19.11477621925434, + -145.87198812603685 + ], + [ + 19.316852411358592, + -146.01289242949318 + ], + [ + 19.41895579147296, + -146.08875704370655 + ], + [ + 19.46650023861764, + -146.1128816304687 + ], + [ + 19.46650023861764, + -146.13700621723078 + ], + [ + 19.490280656682792, + -146.13700621723078 + ], + [ + 19.60705217888419, + -146.16812890083233 + ], + [ + 20.051078964989735, + -146.4677605295546 + ], + [ + 20.351423514584464, + -146.67264743268458 + ], + [ + 20.53357070023305, + -146.8285804359105 + ], + [ + 20.60489556544292, + -146.8527050226727 + ], + [ + 20.748954748621884, + -146.96982890806385 + ], + [ + 20.989495889863942, + -147.14918996616518 + ], + [ + 21.12970366143343, + -147.294289849928 + ], + [ + 21.231790652562182, + -147.37016265863411 + ], + [ + 21.326895935837207, + -147.4425364189206 + ], + [ + 21.350659964916808, + -147.46666100568282 + ], + [ + 21.6345663619827, + -147.77887937532452 + ], + [ + 22.058319972935507, + -148.24563768441863 + ], + [ + 22.376839907529718, + -148.59632100319806 + ], + [ + 22.551644827641987, + -148.76833979576313 + ], + [ + 22.771912793731353, + -148.99349987404574 + ], + [ + 22.908269153691386, + -149.1309051290824 + ], + [ + 23.07189678564346, + -149.26831038411913 + ], + [ + 23.32328743533427, + -149.48962724528502 + ], + [ + 23.623271427246415, + -149.7144431548706 + ], + [ + 24.2235835797677, + -150.20182700230723 + ], + [ + 24.469385585378415, + -150.37909027025532 + ], + [ + 24.67146177748271, + -150.52383779082834 + ], + [ + 24.742786642692593, + -150.54796237759047 + ], + [ + 24.766567060757723, + -150.54796237759047 + ], + [ + 24.766567060757723, + -150.54796237759047 + ] + ], + "lastCommittedPoint": null, + "simulatePressure": true, + "pressures": [] + }, + { + "type": "freedraw", + "version": 430, + "versionNonce": 1260588488, + "isDeleted": false, + "id": "BpUzyiKKZRk3XmVOFBPRU", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2281.2329256873672, + "y": 97.20791417439222, + "strokeColor": "#c92a2a", + "backgroundColor": "#fa5252", + "width": 31.804596513146894, + "height": 26.633896148620426, + "seed": 1419777296, + "groupIds": [ + "gtkfZZ3C8Z42yD_0VETOs" + ], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1682078796134, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 0.030778514904426815, + 0.09299929862902157 + ], + [ + 2.316320886850439, + 1.7631926237913227 + ], + [ + 10.040384231049838, + 7.177236646092732 + ], + [ + 18.84025336617455, + 14.187354806306509 + ], + [ + 25.5073910308277, + 20.349613381424845 + ], + [ + 28.976431217893442, + 23.710969738788958 + ], + [ + 31.112686320263016, + 25.86190937223112 + ], + [ + 31.59657111927991, + 26.39124902273236 + ], + [ + 31.70950761885747, + 26.56257128341057 + ], + [ + 31.780832484067304, + 26.633896148620426 + ], + [ + 31.804596513146894, + 26.633896148620426 + ], + [ + 31.804596513146894, + 26.60977156185827 + ], + [ + 31.804596513146894, + 26.56152238833393 + ], + [ + 31.780471926384735, + 26.489148628047428 + ], + [ + 31.732222752860384, + 26.46502404128526 + ], + [ + 31.68397357933609, + 26.416774867760928 + ], + [ + 31.659848992573902, + 26.39265028099877 + ], + [ + 31.63572440581173, + 26.368525694236602 + ], + [ + 31.611599819049577, + 26.368525694236602 + ], + [ + 31.587475232287428, + 26.344401107474436 + ], + [ + 31.587475232287428, + 26.32027652071225 + ], + [ + 31.587475232287428, + 26.32027652071225 + ] + ], + "lastCommittedPoint": null, + "simulatePressure": true, + "pressures": [] + }, + { + "type": "freedraw", + "version": 394, + "versionNonce": 917738168, + "isDeleted": false, + "id": "bDg-rk4hK2C4DHxfqe8lo", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2285.933672740359, + "y": 246.46783339789704, + "strokeColor": "#c92a2a", + "backgroundColor": "#fa5252", + "width": 24.907062489320822, + "height": 25.850715695085345, + "seed": 2113600784, + "groupIds": [ + "gtkfZZ3C8Z42yD_0VETOs" + ], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1682078796134, + "link": null, + "locked": false, + "points": [ + [ + -0.1163708418009441, + -124.69724668250512 + ], + [ + -0.14049542856309927, + -124.69724668250512 + ], + [ + 0.11053466344512812, + -124.7392024855697 + ], + [ + 3.0394102750392356, + -127.6540819034853 + ], + [ + 9.96316667578074, + -135.79000864960486 + ], + [ + 15.037721056448401, + -141.64983307946807 + ], + [ + 17.434790475212715, + -144.4248652834967 + ], + [ + 18.362013722941118, + -145.3531374263017 + ], + [ + 18.700806832688077, + -145.5926296724673 + ], + [ + 18.833672338721286, + -145.699272801585 + ], + [ + 18.904997203931153, + -145.74752197510932 + ], + [ + 19.11477621925434, + -145.87198812603685 + ], + [ + 19.316852411358592, + -146.01289242949318 + ], + [ + 19.41895579147296, + -146.08875704370655 + ], + [ + 19.46650023861764, + -146.1128816304687 + ], + [ + 19.46650023861764, + -146.13700621723078 + ], + [ + 19.490280656682792, + -146.13700621723078 + ], + [ + 19.60705217888419, + -146.16812890083233 + ], + [ + 20.051078964989735, + -146.4677605295546 + ], + [ + 20.351423514584464, + -146.67264743268458 + ], + [ + 20.53357070023305, + -146.8285804359105 + ], + [ + 20.60489556544292, + -146.8527050226727 + ], + [ + 20.748954748621884, + -146.96982890806385 + ], + [ + 20.989495889863942, + -147.14918996616518 + ], + [ + 21.12970366143343, + -147.294289849928 + ], + [ + 21.231790652562182, + -147.37016265863411 + ], + [ + 21.326895935837207, + -147.4425364189206 + ], + [ + 21.350659964916808, + -147.46666100568282 + ], + [ + 21.6345663619827, + -147.77887937532452 + ], + [ + 22.058319972935507, + -148.24563768441863 + ], + [ + 22.376839907529718, + -148.59632100319806 + ], + [ + 22.551644827641987, + -148.76833979576313 + ], + [ + 22.771912793731353, + -148.99349987404574 + ], + [ + 22.908269153691386, + -149.1309051290824 + ], + [ + 23.07189678564346, + -149.26831038411913 + ], + [ + 23.32328743533427, + -149.48962724528502 + ], + [ + 23.623271427246415, + -149.7144431548706 + ], + [ + 24.2235835797677, + -150.20182700230723 + ], + [ + 24.469385585378415, + -150.37909027025532 + ], + [ + 24.67146177748271, + -150.52383779082834 + ], + [ + 24.742786642692593, + -150.54796237759047 + ], + [ + 24.766567060757723, + -150.54796237759047 + ], + [ + 24.766567060757723, + -150.54796237759047 + ] + ], + "lastCommittedPoint": null, + "simulatePressure": true, + "pressures": [] + }, + { + "type": "diamond", + "version": 1613, + "versionNonce": 108650184, + "isDeleted": false, + "id": "GWdDtJCHsfiumzxkUC6uO", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 1721.6406386436531, + "y": 393.48992209427684, + "strokeColor": "#fff", + "backgroundColor": "#228be6", + "width": 71.95742348303496, + "height": 23.490318597290813, + "seed": 1187947486, + "groupIds": [ + "mi-EsZs9vIzyiRU3ReK0l" + ], + "roundness": null, + "boundElements": [], + "updated": 1682078796135, + "link": null, + "locked": false + }, + { + "type": "diamond", + "version": 1654, + "versionNonce": 497963448, + "isDeleted": false, + "id": "U4mG5AFYWhEgSqjEEIMMM", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 1721.6406386436531, + "y": 387.82276402171993, + "strokeColor": "#fff", + "backgroundColor": "#228be6", + "width": 71.95742348303496, + "height": 23.490318597290813, + "seed": 1263171614, + "groupIds": [ + "mi-EsZs9vIzyiRU3ReK0l" + ], + "roundness": null, + "boundElements": [], + "updated": 1682078796135, + "link": null, + "locked": false + }, + { + "type": "diamond", + "version": 1734, + "versionNonce": 409126344, + "isDeleted": false, + "id": "ChBH1eyaNbNv6IUTkm8S0", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 1721.6406386436531, + "y": 379.75455467174646, + "strokeColor": "#fff", + "backgroundColor": "#228be6", + "width": 71.95742348303496, + "height": 23.490318597290813, + "seed": 834782302, + "groupIds": [ + "mi-EsZs9vIzyiRU3ReK0l" + ], + "roundness": null, + "boundElements": [], + "updated": 1682078796135, + "link": null, + "locked": false + }, + { + "type": "diamond", + "version": 1776, + "versionNonce": 678124216, + "isDeleted": false, + "id": "Q5b-eXs4-RWa_mG_uV-uW", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 1721.6406386436531, + "y": 371.7495130232207, + "strokeColor": "#fff", + "backgroundColor": "#228be6", + "width": 71.95742348303496, + "height": 23.490318597290813, + "seed": 470124702, + "groupIds": [ + "mi-EsZs9vIzyiRU3ReK0l" + ], + "roundness": null, + "boundElements": [], + "updated": 1682078796135, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 950, + "versionNonce": 1788267720, + "isDeleted": false, + "id": "dWZf1BmJdcV5Nd1XJ4e1O", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1808.5304303724413, + "y": 384.1186814636208, + "strokeColor": "#000000", + "backgroundColor": "#e3e3e3", + "width": 60.06666564941406, + "height": 23, + "seed": 836726576, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1682078796135, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 2, + "text": "Layers", + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Layers", + "lineHeight": 1.15, + "baseline": 17 + }, + { + "type": "text", + "version": 1043, + "versionNonce": 1218397112, + "isDeleted": false, + "id": "u50wwrf0mMs0P48ZmZ2TP", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2263.1871462503022, + "y": 384.82274633602395, + "strokeColor": "#000000", + "backgroundColor": "#e3e3e3", + "width": 68.96666717529297, + "height": 23, + "seed": 836726576, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1682078796135, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 2, + "text": "Cache?", + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Cache?", + "lineHeight": 1.15, + "baseline": 17 + }, + { + "type": "freedraw", + "version": 520, + "versionNonce": 304704440, + "isDeleted": false, + "id": "Qlbtuam_cmSBXvbQhDrrm", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2277.756002244903, + "y": 594.6166431248596, + "strokeColor": "#5c940d", + "backgroundColor": "#fa5252", + "width": 24.64377626640656, + "height": 30.81734296916816, + "seed": 1480973808, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1682078906017, + "link": null, + "locked": false, + "points": [ + [ + 0, + -81.38818177809442 + ], + [ + 0, + -81.41526825349533 + ], + [ + 0.23813898002678474, + -81.37640504965924 + ], + [ + 0.5009149710080372, + -81.20486043897654 + ], + [ + 2.2045896484296477, + -80.02954294114599 + ], + [ + 4.857775855588728, + -77.2616161344088 + ], + [ + 7.240377774244314, + -74.4552217483064 + ], + [ + 9.107603867636039, + -72.0888813812087 + ], + [ + 9.757665777957712, + -70.9170969019087 + ], + [ + 10.085416952291368, + -70.31648375171473 + ], + [ + 10.185233492096655, + -70.12413665431959 + ], + [ + 10.185233492096655, + -70.0095067640275 + ], + [ + 10.185233492096655, + -70.03659323942841 + ], + [ + 10.143739578910191, + -70.09076619023023 + ], + [ + 10.10224566572366, + -70.14493914103204 + ], + [ + 10.019257839350729, + -70.17202561643295 + ], + [ + 9.936270012977733, + -70.19911209183385 + ], + [ + 9.936270012977733, + -70.31491965496943 + ], + [ + 9.888771885451114, + -70.49981429140169 + ], + [ + 9.835241354784571, + -70.81425294062089 + ], + [ + 9.835241354784571, + -71.43253118346763 + ], + [ + 9.835241354784571, + -74.03950323454468 + ], + [ + 10.589968278463157, + -78.9319518509876 + ], + [ + 11.817928771825642, + -82.74210992366878 + ], + [ + 14.702065815083053, + -88.90566316273802 + ], + [ + 18.373375090495763, + -94.86429212646614 + ], + [ + 20.12513986023814, + -97.09794648643268 + ], + [ + 22.49088487666173, + -99.54475963107589 + ], + [ + 23.68879610952368, + -100.34400386735346 + ], + [ + 24.374347718691663, + -100.70712272762775 + ], + [ + 24.60287431801418, + -100.79976325779477 + ], + [ + 24.643776266406558, + -100.82684973319567 + ], + [ + 24.602282353220097, + -100.82684973319567 + ], + [ + 24.519294526847165, + -100.82684973319567 + ], + [ + 24.477800613660634, + -100.80015888226563 + ], + [ + 24.477800613660634, + -100.80015888226563 + ] + ], + "lastCommittedPoint": null, + "simulatePressure": true, + "pressures": [] + }, + { + "type": "freedraw", + "version": 562, + "versionNonce": 1969347768, + "isDeleted": false, + "id": "vvB0jlZWj-Ukxy_t8TwFj", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2280.8412618037687, + "y": 638.6158461857124, + "strokeColor": "#5c940d", + "backgroundColor": "#fa5252", + "width": 24.64377626640656, + "height": 30.81734296916816, + "seed": 1480973808, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1682078903070, + "link": null, + "locked": false, + "points": [ + [ + 0, + -81.38818177809442 + ], + [ + 0, + -81.41526825349533 + ], + [ + 0.23813898002678474, + -81.37640504965924 + ], + [ + 0.5009149710080372, + -81.20486043897654 + ], + [ + 2.2045896484296477, + -80.02954294114599 + ], + [ + 4.857775855588728, + -77.2616161344088 + ], + [ + 7.240377774244314, + -74.4552217483064 + ], + [ + 9.107603867636039, + -72.0888813812087 + ], + [ + 9.757665777957712, + -70.9170969019087 + ], + [ + 10.085416952291368, + -70.31648375171473 + ], + [ + 10.185233492096655, + -70.12413665431959 + ], + [ + 10.185233492096655, + -70.0095067640275 + ], + [ + 10.185233492096655, + -70.03659323942841 + ], + [ + 10.143739578910191, + -70.09076619023023 + ], + [ + 10.10224566572366, + -70.14493914103204 + ], + [ + 10.019257839350729, + -70.17202561643295 + ], + [ + 9.936270012977733, + -70.19911209183385 + ], + [ + 9.936270012977733, + -70.31491965496943 + ], + [ + 9.888771885451114, + -70.49981429140169 + ], + [ + 9.835241354784571, + -70.81425294062089 + ], + [ + 9.835241354784571, + -71.43253118346763 + ], + [ + 9.835241354784571, + -74.03950323454468 + ], + [ + 10.589968278463157, + -78.9319518509876 + ], + [ + 11.817928771825642, + -82.74210992366878 + ], + [ + 14.702065815083053, + -88.90566316273802 + ], + [ + 18.373375090495763, + -94.86429212646614 + ], + [ + 20.12513986023814, + -97.09794648643268 + ], + [ + 22.49088487666173, + -99.54475963107589 + ], + [ + 23.68879610952368, + -100.34400386735346 + ], + [ + 24.374347718691663, + -100.70712272762775 + ], + [ + 24.60287431801418, + -100.79976325779477 + ], + [ + 24.643776266406558, + -100.82684973319567 + ], + [ + 24.602282353220097, + -100.82684973319567 + ], + [ + 24.519294526847165, + -100.82684973319567 + ], + [ + 24.477800613660634, + -100.80015888226563 + ], + [ + 24.477800613660634, + -100.80015888226563 + ] + ], + "lastCommittedPoint": null, + "simulatePressure": true, + "pressures": [] + }, + { + "type": "freedraw", + "version": 621, + "versionNonce": 1899521976, + "isDeleted": false, + "id": "25POPkzr89uW84jAzVey5", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2280.9994234717606, + "y": 697.3473034164365, + "strokeColor": "#c92a2a", + "backgroundColor": "#fa5252", + "width": 31.804596513146894, + "height": 26.633896148620426, + "seed": 1419777296, + "groupIds": [ + "GN5HuXksL2psepHsWr8qf" + ], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1682078918226, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 0.030778514904426815, + 0.09299929862902157 + ], + [ + 2.316320886850439, + 1.7631926237913227 + ], + [ + 10.040384231049838, + 7.177236646092732 + ], + [ + 18.84025336617455, + 14.187354806306509 + ], + [ + 25.5073910308277, + 20.349613381424845 + ], + [ + 28.976431217893442, + 23.710969738788958 + ], + [ + 31.112686320263016, + 25.86190937223112 + ], + [ + 31.59657111927991, + 26.39124902273236 + ], + [ + 31.70950761885747, + 26.56257128341057 + ], + [ + 31.780832484067304, + 26.633896148620426 + ], + [ + 31.804596513146894, + 26.633896148620426 + ], + [ + 31.804596513146894, + 26.60977156185827 + ], + [ + 31.804596513146894, + 26.56152238833393 + ], + [ + 31.780471926384735, + 26.489148628047428 + ], + [ + 31.732222752860384, + 26.46502404128526 + ], + [ + 31.68397357933609, + 26.416774867760928 + ], + [ + 31.659848992573902, + 26.39265028099877 + ], + [ + 31.63572440581173, + 26.368525694236602 + ], + [ + 31.611599819049577, + 26.368525694236602 + ], + [ + 31.587475232287428, + 26.344401107474436 + ], + [ + 31.587475232287428, + 26.32027652071225 + ], + [ + 31.587475232287428, + 26.32027652071225 + ] + ], + "lastCommittedPoint": null, + "simulatePressure": true, + "pressures": [] + }, + { + "type": "freedraw", + "version": 585, + "versionNonce": 715984840, + "isDeleted": false, + "id": "f8KKfD4N_dOIrH445k-ZF", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2285.700170524752, + "y": 846.6072226399413, + "strokeColor": "#c92a2a", + "backgroundColor": "#fa5252", + "width": 24.907062489320822, + "height": 25.850715695085345, + "seed": 2113600784, + "groupIds": [ + "GN5HuXksL2psepHsWr8qf" + ], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1682078918226, + "link": null, + "locked": false, + "points": [ + [ + -0.1163708418009441, + -124.69724668250512 + ], + [ + -0.14049542856309927, + -124.69724668250512 + ], + [ + 0.11053466344512812, + -124.7392024855697 + ], + [ + 3.0394102750392356, + -127.6540819034853 + ], + [ + 9.96316667578074, + -135.79000864960486 + ], + [ + 15.037721056448401, + -141.64983307946807 + ], + [ + 17.434790475212715, + -144.4248652834967 + ], + [ + 18.362013722941118, + -145.3531374263017 + ], + [ + 18.700806832688077, + -145.5926296724673 + ], + [ + 18.833672338721286, + -145.699272801585 + ], + [ + 18.904997203931153, + -145.74752197510932 + ], + [ + 19.11477621925434, + -145.87198812603685 + ], + [ + 19.316852411358592, + -146.01289242949318 + ], + [ + 19.41895579147296, + -146.08875704370655 + ], + [ + 19.46650023861764, + -146.1128816304687 + ], + [ + 19.46650023861764, + -146.13700621723078 + ], + [ + 19.490280656682792, + -146.13700621723078 + ], + [ + 19.60705217888419, + -146.16812890083233 + ], + [ + 20.051078964989735, + -146.4677605295546 + ], + [ + 20.351423514584464, + -146.67264743268458 + ], + [ + 20.53357070023305, + -146.8285804359105 + ], + [ + 20.60489556544292, + -146.8527050226727 + ], + [ + 20.748954748621884, + -146.96982890806385 + ], + [ + 20.989495889863942, + -147.14918996616518 + ], + [ + 21.12970366143343, + -147.294289849928 + ], + [ + 21.231790652562182, + -147.37016265863411 + ], + [ + 21.326895935837207, + -147.4425364189206 + ], + [ + 21.350659964916808, + -147.46666100568282 + ], + [ + 21.6345663619827, + -147.77887937532452 + ], + [ + 22.058319972935507, + -148.24563768441863 + ], + [ + 22.376839907529718, + -148.59632100319806 + ], + [ + 22.551644827641987, + -148.76833979576313 + ], + [ + 22.771912793731353, + -148.99349987404574 + ], + [ + 22.908269153691386, + -149.1309051290824 + ], + [ + 23.07189678564346, + -149.26831038411913 + ], + [ + 23.32328743533427, + -149.48962724528502 + ], + [ + 23.623271427246415, + -149.7144431548706 + ], + [ + 24.2235835797677, + -150.20182700230723 + ], + [ + 24.469385585378415, + -150.37909027025532 + ], + [ + 24.67146177748271, + -150.52383779082834 + ], + [ + 24.742786642692593, + -150.54796237759047 + ], + [ + 24.766567060757723, + -150.54796237759047 + ], + [ + 24.766567060757723, + -150.54796237759047 + ] + ], + "lastCommittedPoint": null, + "simulatePressure": true, + "pressures": [] + }, + { + "type": "freedraw", + "version": 556, + "versionNonce": 1846694856, + "isDeleted": false, + "id": "am2H_Ds5jB505wWL_2uQF", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2277.8232548219867, + "y": 646.551203148241, + "strokeColor": "#c92a2a", + "backgroundColor": "#fa5252", + "width": 31.804596513146894, + "height": 26.633896148620426, + "seed": 1419777296, + "groupIds": [ + "jiI2-MwVnxjD5JknSt-YU" + ], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1682078914182, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 0.030778514904426815, + 0.09299929862902157 + ], + [ + 2.316320886850439, + 1.7631926237913227 + ], + [ + 10.040384231049838, + 7.177236646092732 + ], + [ + 18.84025336617455, + 14.187354806306509 + ], + [ + 25.5073910308277, + 20.349613381424845 + ], + [ + 28.976431217893442, + 23.710969738788958 + ], + [ + 31.112686320263016, + 25.86190937223112 + ], + [ + 31.59657111927991, + 26.39124902273236 + ], + [ + 31.70950761885747, + 26.56257128341057 + ], + [ + 31.780832484067304, + 26.633896148620426 + ], + [ + 31.804596513146894, + 26.633896148620426 + ], + [ + 31.804596513146894, + 26.60977156185827 + ], + [ + 31.804596513146894, + 26.56152238833393 + ], + [ + 31.780471926384735, + 26.489148628047428 + ], + [ + 31.732222752860384, + 26.46502404128526 + ], + [ + 31.68397357933609, + 26.416774867760928 + ], + [ + 31.659848992573902, + 26.39265028099877 + ], + [ + 31.63572440581173, + 26.368525694236602 + ], + [ + 31.611599819049577, + 26.368525694236602 + ], + [ + 31.587475232287428, + 26.344401107474436 + ], + [ + 31.587475232287428, + 26.32027652071225 + ], + [ + 31.587475232287428, + 26.32027652071225 + ] + ], + "lastCommittedPoint": null, + "simulatePressure": true, + "pressures": [] + }, + { + "type": "freedraw", + "version": 520, + "versionNonce": 1908649144, + "isDeleted": false, + "id": "Tvc38I2My5Hs1alk1kWr1", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2282.5240018749782, + "y": 795.8111223717458, + "strokeColor": "#c92a2a", + "backgroundColor": "#fa5252", + "width": 24.907062489320822, + "height": 25.850715695085345, + "seed": 2113600784, + "groupIds": [ + "jiI2-MwVnxjD5JknSt-YU" + ], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1682078914182, + "link": null, + "locked": false, + "points": [ + [ + -0.1163708418009441, + -124.69724668250512 + ], + [ + -0.14049542856309927, + -124.69724668250512 + ], + [ + 0.11053466344512812, + -124.7392024855697 + ], + [ + 3.0394102750392356, + -127.6540819034853 + ], + [ + 9.96316667578074, + -135.79000864960486 + ], + [ + 15.037721056448401, + -141.64983307946807 + ], + [ + 17.434790475212715, + -144.4248652834967 + ], + [ + 18.362013722941118, + -145.3531374263017 + ], + [ + 18.700806832688077, + -145.5926296724673 + ], + [ + 18.833672338721286, + -145.699272801585 + ], + [ + 18.904997203931153, + -145.74752197510932 + ], + [ + 19.11477621925434, + -145.87198812603685 + ], + [ + 19.316852411358592, + -146.01289242949318 + ], + [ + 19.41895579147296, + -146.08875704370655 + ], + [ + 19.46650023861764, + -146.1128816304687 + ], + [ + 19.46650023861764, + -146.13700621723078 + ], + [ + 19.490280656682792, + -146.13700621723078 + ], + [ + 19.60705217888419, + -146.16812890083233 + ], + [ + 20.051078964989735, + -146.4677605295546 + ], + [ + 20.351423514584464, + -146.67264743268458 + ], + [ + 20.53357070023305, + -146.8285804359105 + ], + [ + 20.60489556544292, + -146.8527050226727 + ], + [ + 20.748954748621884, + -146.96982890806385 + ], + [ + 20.989495889863942, + -147.14918996616518 + ], + [ + 21.12970366143343, + -147.294289849928 + ], + [ + 21.231790652562182, + -147.37016265863411 + ], + [ + 21.326895935837207, + -147.4425364189206 + ], + [ + 21.350659964916808, + -147.46666100568282 + ], + [ + 21.6345663619827, + -147.77887937532452 + ], + [ + 22.058319972935507, + -148.24563768441863 + ], + [ + 22.376839907529718, + -148.59632100319806 + ], + [ + 22.551644827641987, + -148.76833979576313 + ], + [ + 22.771912793731353, + -148.99349987404574 + ], + [ + 22.908269153691386, + -149.1309051290824 + ], + [ + 23.07189678564346, + -149.26831038411913 + ], + [ + 23.32328743533427, + -149.48962724528502 + ], + [ + 23.623271427246415, + -149.7144431548706 + ], + [ + 24.2235835797677, + -150.20182700230723 + ], + [ + 24.469385585378415, + -150.37909027025532 + ], + [ + 24.67146177748271, + -150.52383779082834 + ], + [ + 24.742786642692593, + -150.54796237759047 + ], + [ + 24.766567060757723, + -150.54796237759047 + ], + [ + 24.766567060757723, + -150.54796237759047 + ] + ], + "lastCommittedPoint": null, + "simulatePressure": true, + "pressures": [] + }, + { + "type": "freedraw", + "version": 603, + "versionNonce": 633849288, + "isDeleted": false, + "id": "pZRrgwewe56QyzeJDj5r0", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2281.1528218006233, + "y": 747.5958828264066, + "strokeColor": "#c92a2a", + "backgroundColor": "#fa5252", + "width": 31.804596513146894, + "height": 26.633896148620426, + "seed": 1419777296, + "groupIds": [ + "GH2jrRJwa13rVIlrQl7QB" + ], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1682078921933, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 0.030778514904426815, + 0.09299929862902157 + ], + [ + 2.316320886850439, + 1.7631926237913227 + ], + [ + 10.040384231049838, + 7.177236646092732 + ], + [ + 18.84025336617455, + 14.187354806306509 + ], + [ + 25.5073910308277, + 20.349613381424845 + ], + [ + 28.976431217893442, + 23.710969738788958 + ], + [ + 31.112686320263016, + 25.86190937223112 + ], + [ + 31.59657111927991, + 26.39124902273236 + ], + [ + 31.70950761885747, + 26.56257128341057 + ], + [ + 31.780832484067304, + 26.633896148620426 + ], + [ + 31.804596513146894, + 26.633896148620426 + ], + [ + 31.804596513146894, + 26.60977156185827 + ], + [ + 31.804596513146894, + 26.56152238833393 + ], + [ + 31.780471926384735, + 26.489148628047428 + ], + [ + 31.732222752860384, + 26.46502404128526 + ], + [ + 31.68397357933609, + 26.416774867760928 + ], + [ + 31.659848992573902, + 26.39265028099877 + ], + [ + 31.63572440581173, + 26.368525694236602 + ], + [ + 31.611599819049577, + 26.368525694236602 + ], + [ + 31.587475232287428, + 26.344401107474436 + ], + [ + 31.587475232287428, + 26.32027652071225 + ], + [ + 31.587475232287428, + 26.32027652071225 + ] + ], + "lastCommittedPoint": null, + "simulatePressure": true, + "pressures": [] + }, + { + "type": "freedraw", + "version": 567, + "versionNonce": 1339447992, + "isDeleted": false, + "id": "Y6hFkSwC6MDragEuP-a7N", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2285.853568853615, + "y": 896.8558020499114, + "strokeColor": "#c92a2a", + "backgroundColor": "#fa5252", + "width": 24.907062489320822, + "height": 25.850715695085345, + "seed": 2113600784, + "groupIds": [ + "GH2jrRJwa13rVIlrQl7QB" + ], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1682078921933, + "link": null, + "locked": false, + "points": [ + [ + -0.1163708418009441, + -124.69724668250512 + ], + [ + -0.14049542856309927, + -124.69724668250512 + ], + [ + 0.11053466344512812, + -124.7392024855697 + ], + [ + 3.0394102750392356, + -127.6540819034853 + ], + [ + 9.96316667578074, + -135.79000864960486 + ], + [ + 15.037721056448401, + -141.64983307946807 + ], + [ + 17.434790475212715, + -144.4248652834967 + ], + [ + 18.362013722941118, + -145.3531374263017 + ], + [ + 18.700806832688077, + -145.5926296724673 + ], + [ + 18.833672338721286, + -145.699272801585 + ], + [ + 18.904997203931153, + -145.74752197510932 + ], + [ + 19.11477621925434, + -145.87198812603685 + ], + [ + 19.316852411358592, + -146.01289242949318 + ], + [ + 19.41895579147296, + -146.08875704370655 + ], + [ + 19.46650023861764, + -146.1128816304687 + ], + [ + 19.46650023861764, + -146.13700621723078 + ], + [ + 19.490280656682792, + -146.13700621723078 + ], + [ + 19.60705217888419, + -146.16812890083233 + ], + [ + 20.051078964989735, + -146.4677605295546 + ], + [ + 20.351423514584464, + -146.67264743268458 + ], + [ + 20.53357070023305, + -146.8285804359105 + ], + [ + 20.60489556544292, + -146.8527050226727 + ], + [ + 20.748954748621884, + -146.96982890806385 + ], + [ + 20.989495889863942, + -147.14918996616518 + ], + [ + 21.12970366143343, + -147.294289849928 + ], + [ + 21.231790652562182, + -147.37016265863411 + ], + [ + 21.326895935837207, + -147.4425364189206 + ], + [ + 21.350659964916808, + -147.46666100568282 + ], + [ + 21.6345663619827, + -147.77887937532452 + ], + [ + 22.058319972935507, + -148.24563768441863 + ], + [ + 22.376839907529718, + -148.59632100319806 + ], + [ + 22.551644827641987, + -148.76833979576313 + ], + [ + 22.771912793731353, + -148.99349987404574 + ], + [ + 22.908269153691386, + -149.1309051290824 + ], + [ + 23.07189678564346, + -149.26831038411913 + ], + [ + 23.32328743533427, + -149.48962724528502 + ], + [ + 23.623271427246415, + -149.7144431548706 + ], + [ + 24.2235835797677, + -150.20182700230723 + ], + [ + 24.469385585378415, + -150.37909027025532 + ], + [ + 24.67146177748271, + -150.52383779082834 + ], + [ + 24.742786642692593, + -150.54796237759047 + ], + [ + 24.766567060757723, + -150.54796237759047 + ], + [ + 24.766567060757723, + -150.54796237759047 + ] + ], + "lastCommittedPoint": null, + "simulatePressure": true, + "pressures": [] + }, + { + "type": "freedraw", + "version": 596, + "versionNonce": 1173105592, + "isDeleted": false, + "id": "YFQCAst9F8imKbgPqJm2I", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2282.2153110385784, + "y": 799.8451510072999, + "strokeColor": "#c92a2a", + "backgroundColor": "#fa5252", + "width": 31.804596513146894, + "height": 26.633896148620426, + "seed": 1419777296, + "groupIds": [ + "hR_sqKt5lzZ0xD_ww51sW" + ], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1682078924685, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 0.030778514904426815, + 0.09299929862902157 + ], + [ + 2.316320886850439, + 1.7631926237913227 + ], + [ + 10.040384231049838, + 7.177236646092732 + ], + [ + 18.84025336617455, + 14.187354806306509 + ], + [ + 25.5073910308277, + 20.349613381424845 + ], + [ + 28.976431217893442, + 23.710969738788958 + ], + [ + 31.112686320263016, + 25.86190937223112 + ], + [ + 31.59657111927991, + 26.39124902273236 + ], + [ + 31.70950761885747, + 26.56257128341057 + ], + [ + 31.780832484067304, + 26.633896148620426 + ], + [ + 31.804596513146894, + 26.633896148620426 + ], + [ + 31.804596513146894, + 26.60977156185827 + ], + [ + 31.804596513146894, + 26.56152238833393 + ], + [ + 31.780471926384735, + 26.489148628047428 + ], + [ + 31.732222752860384, + 26.46502404128526 + ], + [ + 31.68397357933609, + 26.416774867760928 + ], + [ + 31.659848992573902, + 26.39265028099877 + ], + [ + 31.63572440581173, + 26.368525694236602 + ], + [ + 31.611599819049577, + 26.368525694236602 + ], + [ + 31.587475232287428, + 26.344401107474436 + ], + [ + 31.587475232287428, + 26.32027652071225 + ], + [ + 31.587475232287428, + 26.32027652071225 + ] + ], + "lastCommittedPoint": null, + "simulatePressure": true, + "pressures": [] + }, + { + "type": "freedraw", + "version": 560, + "versionNonce": 2131200968, + "isDeleted": false, + "id": "qw8u8gPD_-kOqI4-XMkwx", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2286.91605809157, + "y": 949.105070230805, + "strokeColor": "#c92a2a", + "backgroundColor": "#fa5252", + "width": 24.907062489320822, + "height": 25.850715695085345, + "seed": 2113600784, + "groupIds": [ + "hR_sqKt5lzZ0xD_ww51sW" + ], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1682078924685, + "link": null, + "locked": false, + "points": [ + [ + -0.1163708418009441, + -124.69724668250512 + ], + [ + -0.14049542856309927, + -124.69724668250512 + ], + [ + 0.11053466344512812, + -124.7392024855697 + ], + [ + 3.0394102750392356, + -127.6540819034853 + ], + [ + 9.96316667578074, + -135.79000864960486 + ], + [ + 15.037721056448401, + -141.64983307946807 + ], + [ + 17.434790475212715, + -144.4248652834967 + ], + [ + 18.362013722941118, + -145.3531374263017 + ], + [ + 18.700806832688077, + -145.5926296724673 + ], + [ + 18.833672338721286, + -145.699272801585 + ], + [ + 18.904997203931153, + -145.74752197510932 + ], + [ + 19.11477621925434, + -145.87198812603685 + ], + [ + 19.316852411358592, + -146.01289242949318 + ], + [ + 19.41895579147296, + -146.08875704370655 + ], + [ + 19.46650023861764, + -146.1128816304687 + ], + [ + 19.46650023861764, + -146.13700621723078 + ], + [ + 19.490280656682792, + -146.13700621723078 + ], + [ + 19.60705217888419, + -146.16812890083233 + ], + [ + 20.051078964989735, + -146.4677605295546 + ], + [ + 20.351423514584464, + -146.67264743268458 + ], + [ + 20.53357070023305, + -146.8285804359105 + ], + [ + 20.60489556544292, + -146.8527050226727 + ], + [ + 20.748954748621884, + -146.96982890806385 + ], + [ + 20.989495889863942, + -147.14918996616518 + ], + [ + 21.12970366143343, + -147.294289849928 + ], + [ + 21.231790652562182, + -147.37016265863411 + ], + [ + 21.326895935837207, + -147.4425364189206 + ], + [ + 21.350659964916808, + -147.46666100568282 + ], + [ + 21.6345663619827, + -147.77887937532452 + ], + [ + 22.058319972935507, + -148.24563768441863 + ], + [ + 22.376839907529718, + -148.59632100319806 + ], + [ + 22.551644827641987, + -148.76833979576313 + ], + [ + 22.771912793731353, + -148.99349987404574 + ], + [ + 22.908269153691386, + -149.1309051290824 + ], + [ + 23.07189678564346, + -149.26831038411913 + ], + [ + 23.32328743533427, + -149.48962724528502 + ], + [ + 23.623271427246415, + -149.7144431548706 + ], + [ + 24.2235835797677, + -150.20182700230723 + ], + [ + 24.469385585378415, + -150.37909027025532 + ], + [ + 24.67146177748271, + -150.52383779082834 + ], + [ + 24.742786642692593, + -150.54796237759047 + ], + [ + 24.766567060757723, + -150.54796237759047 + ], + [ + 24.766567060757723, + -150.54796237759047 + ] + ], + "lastCommittedPoint": null, + "simulatePressure": true, + "pressures": [] + }, + { + "type": "freedraw", + "version": 532, + "versionNonce": 926356936, + "isDeleted": false, + "id": "ozwcp9HGehMzK-0tZEn5t", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2282.5913355676466, + "y": 690.9410693092049, + "strokeColor": "#5c940d", + "backgroundColor": "#fa5252", + "width": 24.64377626640656, + "height": 30.81734296916816, + "seed": 1480973808, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1682078898113, + "link": null, + "locked": false, + "points": [ + [ + 0, + -81.38818177809442 + ], + [ + 0, + -81.41526825349533 + ], + [ + 0.23813898002678474, + -81.37640504965924 + ], + [ + 0.5009149710080372, + -81.20486043897654 + ], + [ + 2.2045896484296477, + -80.02954294114599 + ], + [ + 4.857775855588728, + -77.2616161344088 + ], + [ + 7.240377774244314, + -74.4552217483064 + ], + [ + 9.107603867636039, + -72.0888813812087 + ], + [ + 9.757665777957712, + -70.9170969019087 + ], + [ + 10.085416952291368, + -70.31648375171473 + ], + [ + 10.185233492096655, + -70.12413665431959 + ], + [ + 10.185233492096655, + -70.0095067640275 + ], + [ + 10.185233492096655, + -70.03659323942841 + ], + [ + 10.143739578910191, + -70.09076619023023 + ], + [ + 10.10224566572366, + -70.14493914103204 + ], + [ + 10.019257839350729, + -70.17202561643295 + ], + [ + 9.936270012977733, + -70.19911209183385 + ], + [ + 9.936270012977733, + -70.31491965496943 + ], + [ + 9.888771885451114, + -70.49981429140169 + ], + [ + 9.835241354784571, + -70.81425294062089 + ], + [ + 9.835241354784571, + -71.43253118346763 + ], + [ + 9.835241354784571, + -74.03950323454468 + ], + [ + 10.589968278463157, + -78.9319518509876 + ], + [ + 11.817928771825642, + -82.74210992366878 + ], + [ + 14.702065815083053, + -88.90566316273802 + ], + [ + 18.373375090495763, + -94.86429212646614 + ], + [ + 20.12513986023814, + -97.09794648643268 + ], + [ + 22.49088487666173, + -99.54475963107589 + ], + [ + 23.68879610952368, + -100.34400386735346 + ], + [ + 24.374347718691663, + -100.70712272762775 + ], + [ + 24.60287431801418, + -100.79976325779477 + ], + [ + 24.643776266406558, + -100.82684973319567 + ], + [ + 24.602282353220097, + -100.82684973319567 + ], + [ + 24.519294526847165, + -100.82684973319567 + ], + [ + 24.477800613660634, + -100.80015888226563 + ], + [ + 24.477800613660634, + -100.80015888226563 + ] + ], + "lastCommittedPoint": null, + "simulatePressure": true, + "pressures": [] + }, + { + "type": "ellipse", + "version": 292, + "versionNonce": 1271139000, + "isDeleted": false, + "id": "ko3PrDhsadNoT1UKpDRhr", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2266.9395569791604, + "y": 580.5382107141112, + "strokeColor": "#5c940d", + "backgroundColor": "transparent", + "width": 53.84276772489373, + "height": 49.70101636144071, + "seed": 1967589926, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1682078898113, + "link": null, + "locked": false + }, + { + "type": "arrow", + "version": 843, + "versionNonce": 382344392, + "isDeleted": false, + "id": "SYBAKIL_dl35CKdTJZn23", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1698.2108866571416, + "y": 601.5458698321116, + "strokeColor": "#5c940d", + "backgroundColor": "transparent", + "width": 38.64335931303822, + "height": 53.24254610866103, + "seed": 84626854, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1682078863432, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": "triangle", + "endArrowhead": "triangle", + "points": [ + [ + 0, + 0 + ], + [ + -20.12540075607012, + 1.690564054342076 + ], + [ + -38.64335931303822, + 24.446308741405005 + ], + [ + -23.888603855819838, + 50.118198987690334 + ], + [ + -0.3639484356274352, + 53.24254610866103 + ] + ] + }, + { + "type": "line", + "version": 189, + "versionNonce": 1247878344, + "isDeleted": false, + "id": "e_GCcg6l0Kk3Y5GV7o-ax", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2325.7269100800304, + "y": 587.6158293538625, + "strokeColor": "#5c940d", + "backgroundColor": "transparent", + "width": 8.968344214480567, + "height": 6.423205581642193, + "seed": 1389887270, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1682078898113, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 8.968344214480567, + -6.423205581642193 + ] + ] + }, + { + "type": "line", + "version": 194, + "versionNonce": 1566700472, + "isDeleted": false, + "id": "Lv59sziLHa9Fooai9gi6v", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2328.3122880458995, + "y": 604.4207861320108, + "strokeColor": "#5c940d", + "backgroundColor": "transparent", + "width": 12.119588005756668, + "height": 1.292688982934493, + "seed": 119268454, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1682078898113, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 12.119588005756668, + -1.292688982934493 + ] + ] + }, + { + "type": "line", + "version": 196, + "versionNonce": 414335944, + "isDeleted": false, + "id": "hQKe_KEiYPjkRTWVsrFpK", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2326.3732545714984, + "y": 617.3476759613557, + "strokeColor": "#5c940d", + "backgroundColor": "transparent", + "width": 13.896825760376032, + "height": 5.695963230283866, + "seed": 22068454, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1682078898113, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 13.896825760376032, + 5.695963230283866 + ] + ] + }, + { + "type": "line", + "version": 249, + "versionNonce": 895139000, + "isDeleted": false, + "id": "9YDByTl-zsP2vipgaSGm8", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 3.141592653589793, + "x": 2252.0625390223004, + "y": 625.0226730383409, + "strokeColor": "#5c940d", + "backgroundColor": "transparent", + "width": 8.200862530091854, + "height": 5.655723897253594, + "seed": 1389887270, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1682078898113, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 8.200862530091854, + -5.655723897253594 + ] + ] + }, + { + "type": "line", + "version": 242, + "versionNonce": 1883671240, + "isDeleted": false, + "id": "PSIdsImgHRXE3pxHTQUSD", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 3.141592653589793, + "x": 2242.4457049158373, + "y": 604.5978413935627, + "strokeColor": "#5c940d", + "backgroundColor": "transparent", + "width": 15.956996427699323, + "height": 1.292688982934493, + "seed": 119268454, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1682078898113, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 15.956996427699323, + -1.292688982934493 + ] + ] + }, + { + "type": "line", + "version": 272, + "versionNonce": 89286072, + "isDeleted": false, + "id": "sZFbNh9z3fAY-aRFAWmQL", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 3.141592653589793, + "x": 2244.7256022506263, + "y": 583.5280624582398, + "strokeColor": "#5c940d", + "backgroundColor": "transparent", + "width": 16.199270813541716, + "height": 5.695963230283866, + "seed": 22068454, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1682078898113, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 16.199270813541716, + 5.695963230283866 + ] + ] + }, + { + "type": "freedraw", + "version": 571, + "versionNonce": 2062495432, + "isDeleted": false, + "id": "TwvspDltPBgH_99W7lMwL", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2276.420261742126, + "y": 547.6778863306363, + "strokeColor": "#5c940d", + "backgroundColor": "#fa5252", + "width": 24.64377626640656, + "height": 30.81734296916816, + "seed": 1480973808, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1682078928334, + "link": null, + "locked": false, + "points": [ + [ + 0, + -81.38818177809442 + ], + [ + 0, + -81.41526825349533 + ], + [ + 0.23813898002678474, + -81.37640504965924 + ], + [ + 0.5009149710080372, + -81.20486043897654 + ], + [ + 2.2045896484296477, + -80.02954294114599 + ], + [ + 4.857775855588728, + -77.2616161344088 + ], + [ + 7.240377774244314, + -74.4552217483064 + ], + [ + 9.107603867636039, + -72.0888813812087 + ], + [ + 9.757665777957712, + -70.9170969019087 + ], + [ + 10.085416952291368, + -70.31648375171473 + ], + [ + 10.185233492096655, + -70.12413665431959 + ], + [ + 10.185233492096655, + -70.0095067640275 + ], + [ + 10.185233492096655, + -70.03659323942841 + ], + [ + 10.143739578910191, + -70.09076619023023 + ], + [ + 10.10224566572366, + -70.14493914103204 + ], + [ + 10.019257839350729, + -70.17202561643295 + ], + [ + 9.936270012977733, + -70.19911209183385 + ], + [ + 9.936270012977733, + -70.31491965496943 + ], + [ + 9.888771885451114, + -70.49981429140169 + ], + [ + 9.835241354784571, + -70.81425294062089 + ], + [ + 9.835241354784571, + -71.43253118346763 + ], + [ + 9.835241354784571, + -74.03950323454468 + ], + [ + 10.589968278463157, + -78.9319518509876 + ], + [ + 11.817928771825642, + -82.74210992366878 + ], + [ + 14.702065815083053, + -88.90566316273802 + ], + [ + 18.373375090495763, + -94.86429212646614 + ], + [ + 20.12513986023814, + -97.09794648643268 + ], + [ + 22.49088487666173, + -99.54475963107589 + ], + [ + 23.68879610952368, + -100.34400386735346 + ], + [ + 24.374347718691663, + -100.70712272762775 + ], + [ + 24.60287431801418, + -100.79976325779477 + ], + [ + 24.643776266406558, + -100.82684973319567 + ], + [ + 24.602282353220097, + -100.82684973319567 + ], + [ + 24.519294526847165, + -100.82684973319567 + ], + [ + 24.477800613660634, + -100.80015888226563 + ], + [ + 24.477800613660634, + -100.80015888226563 + ] + ], + "lastCommittedPoint": null, + "simulatePressure": true, + "pressures": [] + }, + { + "type": "line", + "version": 326, + "versionNonce": 636508616, + "isDeleted": false, + "id": "ET7riHjeCg-5yrCcfDxo-", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1675.658421567153, + "y": 552.4306113264479, + "strokeColor": "#5c940d", + "backgroundColor": "transparent", + "width": 16.18532661592715, + "height": 9.344602678627465, + "seed": 254132198, + "groupIds": [ + "tyu1E-mlw_4MrO3qaekzI" + ], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1682078839915, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 16.18532661592715, + 9.344602678627465 + ] + ] + }, + { + "type": "line", + "version": 331, + "versionNonce": 858851000, + "isDeleted": false, + "id": "CUxcomjKtlLI9AaFfvp2D", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1675.658421567153, + "y": 563.1360405341197, + "strokeColor": "#5c940d", + "backgroundColor": "transparent", + "width": 13.560210329717675, + "height": 13.560210329717632, + "seed": 1270364326, + "groupIds": [ + "tyu1E-mlw_4MrO3qaekzI" + ], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1682078839915, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 13.560210329717675, + -13.560210329717632 + ] + ] + }, + { + "type": "line", + "version": 311, + "versionNonce": 424796360, + "isDeleted": false, + "id": "go21lSOLQ7Z2JCAXZgqYK", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1682.7953743722667, + "y": 546.7210490823562, + "strokeColor": "#5c940d", + "backgroundColor": "transparent", + "width": 0, + "height": 20.697163134832202, + "seed": 1806479738, + "groupIds": [ + "tyu1E-mlw_4MrO3qaekzI" + ], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1682078839915, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 0, + 20.697163134832202 + ] + ] + }, + { + "type": "rectangle", + "version": 474, + "versionNonce": 1240981944, + "isDeleted": false, + "id": "MRJBhdcQX1Frc63YXq8ag", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 85.73871142235924, + "y": -248.30502980068576, + "strokeColor": "transparent", + "backgroundColor": "#fafafa", + "width": 221.00103103088614, + "height": 38.26083777512531, + "seed": 887663846, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1682078796136, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2942, + "versionNonce": 1530541512, + "isDeleted": false, + "id": "ZJ9bbFktSEC6guEBuSo1t", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 180.39517651723378, + "y": -239.3916607716764, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 124.5, + "height": 32.199999999999996, + "seed": 804287196, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1682078796136, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 2, + "text": "Dockerfile", + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Dockerfile", + "lineHeight": 1.15, + "baseline": 24 + }, + { + "type": "line", + "version": 727, + "versionNonce": 889383608, + "isDeleted": false, + "id": "bH0RoZiphko4TREWdM-7V", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 92.20991182448212, + "y": -275.13405040507246, + "strokeColor": "#000000", + "backgroundColor": "#fafafa", + "width": 46.2725293055735, + "height": 65.63479334123907, + "seed": 1051352386, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1682078796136, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + -0.32817396670618093, + 63.99392350770812 + ], + [ + 45.61618137216114, + 63.99392350770812 + ], + [ + 45.94435533886732, + 8.204349167654891 + ], + [ + 37.083658237800094, + 9.188871067773464 + ], + [ + 37.083658237800094, + -1.6408698335309615 + ], + [ + 0, + 0 + ] + ] + }, + { + "type": "line", + "version": 574, + "versionNonce": 1090534600, + "isDeleted": false, + "id": "HAkh5plZxZBfS-dHiR9sn", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 100.61876213849649, + "y": -260.4350106600415, + "strokeColor": "#000000", + "backgroundColor": "#fff", + "width": 23.46761829266846, + "height": 0, + "seed": 1652977346, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1682078796136, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 23.46761829266846, + 0 + ] + ] + }, + { + "type": "line", + "version": 583, + "versionNonce": 2076496824, + "isDeleted": false, + "id": "Nsov2rnJxrZLqBUjk5G7I", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 99.50096815351907, + "y": -251.6112834149549, + "strokeColor": "#000000", + "backgroundColor": "#fff", + "width": 27.73387985984898, + "height": 0, + "seed": 1652977346, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1682078796136, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 27.73387985984898, + 0 + ] + ] + }, + { + "type": "line", + "version": 569, + "versionNonce": 778920904, + "isDeleted": false, + "id": "BwDeei9O0ubHnkFSQ2Glv", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 99.50096815351912, + "y": -242.98296523633522, + "strokeColor": "#000000", + "backgroundColor": "#fff", + "width": 27.73387985984898, + "height": 0, + "seed": 1652977346, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1682078796136, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 27.73387985984898, + 0 + ] + ] + }, + { + "type": "line", + "version": 611, + "versionNonce": 1147247800, + "isDeleted": false, + "id": "3V2kwI64ks6UrrxggwcpO", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 100.11727659484905, + "y": -234.97095549904557, + "strokeColor": "#000000", + "backgroundColor": "#fff", + "width": 15.561796600081543, + "height": 0, + "seed": 1652977346, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1682078796136, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 15.561796600081543, + 0 + ] + ] + }, + { + "type": "line", + "version": 475, + "versionNonce": 1637722824, + "isDeleted": false, + "id": "FupR7lzemmdYwOosHW0i0", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 138.81061509676186, + "y": -267.25787520412376, + "strokeColor": "#000000", + "backgroundColor": "#fff", + "width": 8.860697101067283, + "height": 9.517045034479644, + "seed": 799813662, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1682078796136, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + -8.860697101067283, + -9.517045034479644 + ] + ] + }, + { + "type": "rectangle", + "version": 114, + "versionNonce": 1350387128, + "isDeleted": false, + "id": "tPrqfJsG4vJuP1R7-K81z", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 132.0843442981192, + "y": -246.9753462737538, + "strokeColor": "transparent", + "backgroundColor": "#fafafa", + "width": 11.40025780261002, + "height": 34.20077340783004, + "seed": 1324749415, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1682078796136, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 183, + "versionNonce": 1965887944, + "isDeleted": false, + "id": "IV5PvZXumxK6rjHyDTBcr", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 116.2164178971891, + "y": -216.93412638849767, + "strokeColor": "transparent", + "backgroundColor": "#fafafa", + "width": 27.11412666566705, + "height": 8.93533719664026, + "seed": 1324749415, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1682078796136, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 4447, + "versionNonce": 222023352, + "isDeleted": false, + "id": "ehCQPb3KnJ9SRplV7EkCL", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 162.48045146339376, + "y": -230.54376800625315, + "strokeColor": "transparent", + "backgroundColor": "#228be6", + "width": 54.23398008567099, + "height": 31.775856173542913, + "seed": 1042760606, + "groupIds": [ + "_fvqAfeTfHNU-tflapflN" + ], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1682078796136, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + -1.1294220922927207, + -3.1276304094259584 + ], + [ + -3.5185842106042036, + -5.799148050810632 + ], + [ + -6.754812898135239, + -6.754812898135233 + ], + [ + -8.177450341311637, + -3.138490237236468 + ], + [ + -7.221785493987035, + 0.39095380117824546 + ], + [ + -5.277876315906309, + 3.2579483431520404 + ], + [ + -8.275188791606192, + 4.495968713549815 + ], + [ + -14.856244444773319, + 4.691445614138939 + ], + [ + -21.6979359653926, + 4.626286647275899 + ], + [ + -38.64650723499022, + 4.633526532482902 + ], + [ + -44.48185471183587, + 4.901402285142069 + ], + [ + -45.003126446740204, + 8.629943166749412 + ], + [ + -43.01939790002095, + 14.783845592703258 + ], + [ + -38.31347251546802, + 20.78571042931003 + ], + [ + -33.100755166424754, + 23.84818187187295 + ], + [ + -26.650017446983693, + 25.021043275407678 + ], + [ + -17.527762086157978, + 24.173976706188128 + ], + [ + -9.122255360825719, + 20.78571042931003 + ], + [ + -3.909538011782448, + 16.224582748897156 + ], + [ + -1.006344043773618, + 10.237197682704414 + ], + [ + 0.3909538011782474, + 6.450737719441041 + ], + [ + 3.6271824887092805, + 5.914986214122701 + ], + [ + 7.3919227963516265, + 4.380130550237743 + ], + [ + 9.230853638930792, + 1.6217342863690136 + ], + [ + 6.407298408199009, + -0.6515896686304108 + ], + [ + 2.570159248486621, + -0.9701446177386056 + ], + [ + 0, + 0 + ] + ] + }, + { + "type": "rectangle", + "version": 1865, + "versionNonce": 1345820872, + "isDeleted": false, + "id": "VmqAqNWGQKQ8d-8_o6HHm", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 122.0972751586155, + "y": -232.28381937930257, + "strokeColor": "transparent", + "backgroundColor": "#228be6", + "width": 5.139413511322346, + "height": 4.895067385585944, + "seed": 1442389982, + "groupIds": [ + "_fvqAfeTfHNU-tflapflN" + ], + "roundness": null, + "boundElements": [], + "updated": 1682078796136, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 1868, + "versionNonce": 591476664, + "isDeleted": false, + "id": "fOYSGjRqjbY8c5xKy_LTi", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 128.03488601401034, + "y": -232.35712321702349, + "strokeColor": "transparent", + "backgroundColor": "#228be6", + "width": 4.935791739875341, + "height": 4.935791739875341, + "seed": 130380830, + "groupIds": [ + "_fvqAfeTfHNU-tflapflN" + ], + "roundness": null, + "boundElements": [], + "updated": 1682078796136, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 1806, + "versionNonce": 374947784, + "isDeleted": false, + "id": "NuCEcEXsDf7421Fyhld50", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 133.9317725151156, + "y": -232.27567450844467, + "strokeColor": "transparent", + "backgroundColor": "#228be6", + "width": 4.854343031296542, + "height": 4.854343031296542, + "seed": 494747742, + "groupIds": [ + "_fvqAfeTfHNU-tflapflN" + ], + "roundness": null, + "boundElements": [], + "updated": 1682078796136, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 1864, + "versionNonce": 112296120, + "isDeleted": false, + "id": "RtvqA5O31nU4A9zLUNN71", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 139.66576159906322, + "y": -232.32454373359198, + "strokeColor": "transparent", + "backgroundColor": "#228be6", + "width": 4.854343031296542, + "height": 4.854343031296542, + "seed": 2062648478, + "groupIds": [ + "_fvqAfeTfHNU-tflapflN" + ], + "roundness": null, + "boundElements": [], + "updated": 1682078796136, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 1869, + "versionNonce": 397280968, + "isDeleted": false, + "id": "5KWVIbma2Wr5QN3ziQLZy", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 145.47305452073152, + "y": -232.27567450844467, + "strokeColor": "transparent", + "backgroundColor": "#228be6", + "width": 4.854343031296542, + "height": 4.854343031296542, + "seed": 1641234654, + "groupIds": [ + "_fvqAfeTfHNU-tflapflN" + ], + "roundness": null, + "boundElements": [], + "updated": 1682078796136, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 1942, + "versionNonce": 120629688, + "isDeleted": false, + "id": "6QJ7ijowsI5ZSJY01ISpb", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 139.5924577613422, + "y": -238.05853281753954, + "strokeColor": "transparent", + "backgroundColor": "#228be6", + "width": 4.935791739875341, + "height": 4.935791739875341, + "seed": 900953374, + "groupIds": [ + "_fvqAfeTfHNU-tflapflN" + ], + "roundness": null, + "boundElements": [], + "updated": 1682078796136, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 1992, + "versionNonce": 1087499720, + "isDeleted": false, + "id": "zTZ8S29kNO8JeZivRE-lx", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 134.0702353196994, + "y": -237.77346233751373, + "strokeColor": "transparent", + "backgroundColor": "#228be6", + "width": 4.691445614138941, + "height": 4.691445614138941, + "seed": 1073946974, + "groupIds": [ + "_fvqAfeTfHNU-tflapflN" + ], + "roundness": null, + "boundElements": [], + "updated": 1682078796136, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 2134, + "versionNonce": 1608692408, + "isDeleted": false, + "id": "GLYIPKq9RCFMGHhpH_uof", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 128.13262446430497, + "y": -237.8141866918032, + "strokeColor": "transparent", + "backgroundColor": "#228be6", + "width": 4.691445614138941, + "height": 4.691445614138941, + "seed": 1947420062, + "groupIds": [ + "_fvqAfeTfHNU-tflapflN" + ], + "roundness": null, + "boundElements": [], + "updated": 1682078796136, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 2130, + "versionNonce": 182514888, + "isDeleted": false, + "id": "nz9LaCZzXCeKVRfh8lZcJ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 139.51100905276348, + "y": -243.79252190148716, + "strokeColor": "transparent", + "backgroundColor": "#228be6", + "width": 4.935791739875341, + "height": 4.935791739875341, + "seed": 857006558, + "groupIds": [ + "_fvqAfeTfHNU-tflapflN" + ], + "roundness": null, + "boundElements": [], + "updated": 1682078796136, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 614, + "versionNonce": 1198234552, + "isDeleted": false, + "id": "P-SvQdmbg3OgC5-ULpyeI", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1713.3672756519236, + "y": -205.16948730456886, + "strokeColor": "#000000", + "backgroundColor": "#e3e3e3", + "width": 508, + "height": 37, + "seed": 1615390136, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "type": "text", + "id": "NXLaLNgnVE6a54OyutNln" + } + ], + "updated": 1682078796136, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 502, + "versionNonce": 1802968008, + "isDeleted": false, + "id": "NXLaLNgnVE6a54OyutNln", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1718.3672756519236, + "y": -198.66948730456886, + "strokeColor": "#000000", + "backgroundColor": "#e3e3e3", + "width": 281.6000061035156, + "height": 24, + "seed": 1653829304, + "groupIds": [], + "roundness": null, + "boundElements": null, + "updated": 1682078796136, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": " FROM golang:1.20-alpine", + "textAlign": "left", + "verticalAlign": "middle", + "containerId": "P-SvQdmbg3OgC5-ULpyeI", + "originalText": " FROM golang:1.20-alpine", + "lineHeight": 1.2, + "baseline": 19 + }, + { + "type": "rectangle", + "version": 672, + "versionNonce": 2146395320, + "isDeleted": false, + "id": "-n776hHWZvHyKzghQw3Uv", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1715.5978231194008, + "y": -156.46183818627821, + "strokeColor": "#000000", + "backgroundColor": "#e3e3e3", + "width": 508, + "height": 35, + "seed": 749000632, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "type": "text", + "id": "24jvOUuM18az2akIFcVgm" + } + ], + "updated": 1682078796136, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 581, + "versionNonce": 1152410312, + "isDeleted": false, + "id": "24jvOUuM18az2akIFcVgm", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1720.5978231194008, + "y": -150.96183818627821, + "strokeColor": "#000000", + "backgroundColor": "#e3e3e3", + "width": 152.53334045410156, + "height": 24, + "seed": 1654726840, + "groupIds": [], + "roundness": null, + "boundElements": null, + "updated": 1682078796136, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": " WORKDIR /src", + "textAlign": "left", + "verticalAlign": "middle", + "containerId": "-n776hHWZvHyKzghQw3Uv", + "originalText": " WORKDIR /src", + "lineHeight": 1.2, + "baseline": 19 + }, + { + "type": "rectangle", + "version": 689, + "versionNonce": 1729236408, + "isDeleted": false, + "id": "nbYEHdfXZRe7S-l-lwt-J", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1715.7051051007566, + "y": -110.16871196284615, + "strokeColor": "#000000", + "backgroundColor": "#e3e3e3", + "width": 508, + "height": 35, + "seed": 70011320, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "type": "text", + "id": "TXyeifdYkA6ix01-ofUmN" + } + ], + "updated": 1682078796136, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 618, + "versionNonce": 1428736456, + "isDeleted": false, + "id": "TXyeifdYkA6ix01-ofUmN", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1720.7051051007566, + "y": -104.66871196284615, + "strokeColor": "#000000", + "backgroundColor": "#e3e3e3", + "width": 105.5999984741211, + "height": 24, + "seed": 2087342776, + "groupIds": [], + "roundness": null, + "boundElements": null, + "updated": 1682078796136, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": " COPY . .", + "textAlign": "left", + "verticalAlign": "middle", + "containerId": "nbYEHdfXZRe7S-l-lwt-J", + "originalText": " COPY . .", + "lineHeight": 1.2, + "baseline": 19 + }, + { + "type": "rectangle", + "version": 718, + "versionNonce": 100112056, + "isDeleted": false, + "id": "8530wlwmiyIpdSV_LfNI3", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1717.2762648679582, + "y": -61.38775639102761, + "strokeColor": "#000000", + "backgroundColor": "#e3e3e3", + "width": 508, + "height": 37, + "seed": 838810552, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "type": "text", + "id": "8KxqpEaKiiKqvlWw7X9qD" + } + ], + "updated": 1682078796136, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 665, + "versionNonce": 670847176, + "isDeleted": false, + "id": "8KxqpEaKiiKqvlWw7X9qD", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1722.2762648679582, + "y": -54.88775639102761, + "strokeColor": "#000000", + "backgroundColor": "#e3e3e3", + "width": 234.6666717529297, + "height": 24, + "seed": 386860216, + "groupIds": [], + "roundness": null, + "boundElements": null, + "updated": 1682078796136, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": " RUN go mod download", + "textAlign": "left", + "verticalAlign": "middle", + "containerId": "8530wlwmiyIpdSV_LfNI3", + "originalText": " RUN go mod download", + "lineHeight": 1.2, + "baseline": 19 + }, + { + "type": "rectangle", + "version": 796, + "versionNonce": 558104504, + "isDeleted": false, + "id": "iQnVcNxHH1BlLdUcbzjd0", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1717.3565886082924, + "y": -13.382335654106953, + "strokeColor": "#000000", + "backgroundColor": "#e3e3e3", + "width": 509, + "height": 40, + "seed": 960343480, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "type": "text", + "id": "OD2cUruGeUcH7kbtrcSha" + } + ], + "updated": 1682078796136, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 915, + "versionNonce": 80148424, + "isDeleted": false, + "id": "OD2cUruGeUcH7kbtrcSha", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1722.3565886082924, + "y": -5.382335654106953, + "strokeColor": "#000000", + "backgroundColor": "#e3e3e3", + "width": 481.0666809082031, + "height": 24, + "seed": 1370437304, + "groupIds": [], + "roundness": null, + "boundElements": null, + "updated": 1682078796136, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": " RUN go build -o /bin/client ./cmd/client", + "textAlign": "left", + "verticalAlign": "middle", + "containerId": "iQnVcNxHH1BlLdUcbzjd0", + "originalText": " RUN go build -o /bin/client ./cmd/client", + "lineHeight": 1.2, + "baseline": 19 + }, + { + "type": "rectangle", + "version": 855, + "versionNonce": 1226524856, + "isDeleted": false, + "id": "KSh0cdPVB5abvCTFmGRPH", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1717.3565886082924, + "y": 39.023356656760086, + "strokeColor": "#000000", + "backgroundColor": "#e3e3e3", + "width": 510, + "height": 39, + "seed": 1426563000, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "type": "text", + "id": "64kwx9sY0cDLo7tRwupot" + } + ], + "updated": 1682078796136, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 926, + "versionNonce": 1604632264, + "isDeleted": false, + "id": "64kwx9sY0cDLo7tRwupot", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1722.3565886082924, + "y": 46.523356656760086, + "strokeColor": "#000000", + "backgroundColor": "#e3e3e3", + "width": 481.0666809082031, + "height": 24, + "seed": 57338040, + "groupIds": [], + "roundness": null, + "boundElements": null, + "updated": 1682078796136, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": " RUN go build -o /bin/server ./cmd/server", + "textAlign": "left", + "verticalAlign": "middle", + "containerId": "KSh0cdPVB5abvCTFmGRPH", + "originalText": " RUN go build -o /bin/server ./cmd/server", + "lineHeight": 1.2, + "baseline": 19 + }, + { + "type": "rectangle", + "version": 833, + "versionNonce": 1763799480, + "isDeleted": false, + "id": "xKrQmTqgiFGYJlVwkqv0-", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1717.3057880953747, + "y": 91.36361926062904, + "strokeColor": "#000000", + "backgroundColor": "#e3e3e3", + "width": 510, + "height": 37, + "seed": 2021462456, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "type": "text", + "id": "0MRRmp7JHwUe98hu2Txit" + } + ], + "updated": 1682078796136, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 849, + "versionNonce": 1227990472, + "isDeleted": false, + "id": "0MRRmp7JHwUe98hu2Txit", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1722.3057880953747, + "y": 97.86361926062904, + "strokeColor": "#000000", + "backgroundColor": "#e3e3e3", + "width": 340.26666259765625, + "height": 24, + "seed": 996285112, + "groupIds": [], + "roundness": null, + "boundElements": null, + "updated": 1682078796136, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": " ENTRYPOINT [ \"/bin/server\" ]", + "textAlign": "left", + "verticalAlign": "middle", + "containerId": "xKrQmTqgiFGYJlVwkqv0-", + "originalText": " ENTRYPOINT [ \"/bin/server\" ]", + "lineHeight": 1.2, + "baseline": 19 + }, + { + "type": "rectangle", + "version": 684, + "versionNonce": 1484421816, + "isDeleted": false, + "id": "c_Krw2qgOjuekh1TTP_L4", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1713.3672756519236, + "y": 442.83051269543114, + "strokeColor": "#000000", + "backgroundColor": "#e3e3e3", + "width": 508, + "height": 37, + "seed": 1084855855, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "type": "text", + "id": "iDId3odnprtmFYxKezkqH" + } + ], + "updated": 1682078796136, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 573, + "versionNonce": 1586080968, + "isDeleted": false, + "id": "iDId3odnprtmFYxKezkqH", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1718.3672756519236, + "y": 449.33051269543114, + "strokeColor": "#000000", + "backgroundColor": "#e3e3e3", + "width": 281.6000061035156, + "height": 24, + "seed": 1445772529, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1682078796136, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": " FROM golang:1.20-alpine", + "textAlign": "left", + "verticalAlign": "middle", + "containerId": "c_Krw2qgOjuekh1TTP_L4", + "originalText": " FROM golang:1.20-alpine", + "lineHeight": 1.2, + "baseline": 19 + }, + { + "type": "rectangle", + "version": 742, + "versionNonce": 1774871480, + "isDeleted": false, + "id": "Z99jYhdF1TuTo80ofsbTy", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1715.5978231194008, + "y": 491.5381618137218, + "strokeColor": "#000000", + "backgroundColor": "#e3e3e3", + "width": 508, + "height": 35, + "seed": 1084855855, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "type": "text", + "id": "_pcPTF6kgXMx5eK6SbbIo" + } + ], + "updated": 1682078796136, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 652, + "versionNonce": 961074120, + "isDeleted": false, + "id": "_pcPTF6kgXMx5eK6SbbIo", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1720.5978231194008, + "y": 497.0381618137218, + "strokeColor": "#000000", + "backgroundColor": "#e3e3e3", + "width": 152.53334045410156, + "height": 24, + "seed": 1445772529, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1682078796136, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": " WORKDIR /src", + "textAlign": "left", + "verticalAlign": "middle", + "containerId": "Z99jYhdF1TuTo80ofsbTy", + "originalText": " WORKDIR /src", + "lineHeight": 1.2, + "baseline": 19 + }, + { + "type": "rectangle", + "version": 760, + "versionNonce": 2067082424, + "isDeleted": false, + "id": "ZiHDR3AbC1DIoehuR11Zu", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1715.7051051007566, + "y": 537.8312880371539, + "strokeColor": "#000000", + "backgroundColor": "#e3e3e3", + "width": 508, + "height": 35, + "seed": 1084855855, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "type": "text", + "id": "aZT20USCAjttsJXaS5qtk" + } + ], + "updated": 1682078796136, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 705, + "versionNonce": 373428424, + "isDeleted": false, + "id": "aZT20USCAjttsJXaS5qtk", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1720.7051051007566, + "y": 543.3312880371539, + "strokeColor": "#000000", + "backgroundColor": "#e3e3e3", + "width": 246.39999389648438, + "height": 24, + "seed": 1445772529, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1682078816367, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": " COPY go.mod go.sum .", + "textAlign": "left", + "verticalAlign": "middle", + "containerId": "ZiHDR3AbC1DIoehuR11Zu", + "originalText": " COPY go.mod go.sum .", + "lineHeight": 1.2, + "baseline": 19 + }, + { + "type": "rectangle", + "version": 794, + "versionNonce": 1987412920, + "isDeleted": false, + "id": "QE5fODwh4vviGGaqF1WnE", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1717.2762648679582, + "y": 586.6122436089724, + "strokeColor": "#000000", + "backgroundColor": "#e3e3e3", + "width": 508, + "height": 37, + "seed": 1984983496, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "type": "text", + "id": "yFdxFXstxs3cQCqBUZFyL" + } + ], + "updated": 1682078808748, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 739, + "versionNonce": 871137736, + "isDeleted": false, + "id": "yFdxFXstxs3cQCqBUZFyL", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1722.2762648679582, + "y": 593.1122436089724, + "strokeColor": "#000000", + "backgroundColor": "#e3e3e3", + "width": 234.6666717529297, + "height": 24, + "seed": 367982792, + "groupIds": [], + "roundness": null, + "boundElements": null, + "updated": 1682078796136, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": " RUN go mod download", + "textAlign": "left", + "verticalAlign": "middle", + "containerId": "QE5fODwh4vviGGaqF1WnE", + "originalText": " RUN go mod download", + "lineHeight": 1.2, + "baseline": 19 + }, + { + "type": "rectangle", + "version": 894, + "versionNonce": 27411144, + "isDeleted": false, + "id": "PiKboqh61v4HMlXa1xi5J", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1717.3565886082924, + "y": 689.3449370731657, + "strokeColor": "#000000", + "backgroundColor": "#e3e3e3", + "width": 509, + "height": 40, + "seed": 1084855855, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "type": "text", + "id": "cv3A9XwaP9JBq8jNL4X2z" + }, + { + "id": "SYBAKIL_dl35CKdTJZn23", + "type": "arrow" + } + ], + "updated": 1682078867234, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1013, + "versionNonce": 313404856, + "isDeleted": false, + "id": "cv3A9XwaP9JBq8jNL4X2z", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1722.3565886082924, + "y": 697.3449370731657, + "strokeColor": "#000000", + "backgroundColor": "#e3e3e3", + "width": 481.0666809082031, + "height": 24, + "seed": 1445772529, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1682078867235, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": " RUN go build -o /bin/client ./cmd/client", + "textAlign": "left", + "verticalAlign": "middle", + "containerId": "PiKboqh61v4HMlXa1xi5J", + "originalText": " RUN go build -o /bin/client ./cmd/client", + "lineHeight": 1.2, + "baseline": 19 + }, + { + "type": "rectangle", + "version": 956, + "versionNonce": 179462840, + "isDeleted": false, + "id": "RkMQ7a0xOq-zgV9t5GCwJ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1717.3565886082924, + "y": 744.4779021113056, + "strokeColor": "#000000", + "backgroundColor": "#e3e3e3", + "width": 510, + "height": 39, + "seed": 1084855855, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "type": "text", + "id": "Ir8qPNvD_w0SbZu5KY0Jb" + } + ], + "updated": 1682078869658, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1028, + "versionNonce": 2049197256, + "isDeleted": false, + "id": "Ir8qPNvD_w0SbZu5KY0Jb", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1722.3565886082924, + "y": 751.9779021113056, + "strokeColor": "#000000", + "backgroundColor": "#e3e3e3", + "width": 481.0666809082031, + "height": 24, + "seed": 1445772529, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1682078869658, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": " RUN go build -o /bin/server ./cmd/server", + "textAlign": "left", + "verticalAlign": "middle", + "containerId": "RkMQ7a0xOq-zgV9t5GCwJ", + "originalText": " RUN go build -o /bin/server ./cmd/server", + "lineHeight": 1.2, + "baseline": 19 + }, + { + "type": "rectangle", + "version": 939, + "versionNonce": 1279075016, + "isDeleted": false, + "id": "XJh9gklNUnmsx33OUSSu4", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1717.3057880953747, + "y": 794.9999828969926, + "strokeColor": "#000000", + "backgroundColor": "#e3e3e3", + "width": 510, + "height": 37, + "seed": 1084855855, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "type": "text", + "id": "h10eVOM3JUokjXV9dZ9zY" + } + ], + "updated": 1682078873082, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 956, + "versionNonce": 2075217336, + "isDeleted": false, + "id": "h10eVOM3JUokjXV9dZ9zY", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1722.3057880953747, + "y": 801.4999828969926, + "strokeColor": "#000000", + "backgroundColor": "#e3e3e3", + "width": 340.26666259765625, + "height": 24, + "seed": 1445772529, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1682078873082, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": " ENTRYPOINT [ \"/bin/server\" ]", + "textAlign": "left", + "verticalAlign": "middle", + "containerId": "XJh9gklNUnmsx33OUSSu4", + "originalText": " ENTRYPOINT [ \"/bin/server\" ]", + "lineHeight": 1.2, + "baseline": 19 + }, + { + "type": "rectangle", + "version": 828, + "versionNonce": 541142728, + "isDeleted": false, + "id": "6LV67OEiLs-uMOkHpEzpt", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1716.3671739588672, + "y": 636.9758799726087, + "strokeColor": "#000000", + "backgroundColor": "#e3e3e3", + "width": 508, + "height": 37, + "seed": 1084855855, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "type": "text", + "id": "odm8kfs8e5Mt8ghyg2ppx" + } + ], + "updated": 1682078860533, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 787, + "versionNonce": 405017032, + "isDeleted": false, + "id": "odm8kfs8e5Mt8ghyg2ppx", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1721.3671739588672, + "y": 643.4758799726087, + "strokeColor": "#000000", + "backgroundColor": "#e3e3e3", + "width": 105.5999984741211, + "height": 24, + "seed": 1445772529, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1682078853507, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": " COPY . .", + "textAlign": "left", + "verticalAlign": "middle", + "containerId": "6LV67OEiLs-uMOkHpEzpt", + "originalText": " COPY . .", + "lineHeight": 1.2, + "baseline": 19 + } + ], + "appState": { + "gridSize": null, + "viewBackgroundColor": "#ffffff" + }, + "files": {} +} \ No newline at end of file diff --git a/build/guide/images/layers.png b/build/guide/images/layers.png new file mode 100644 index 0000000000..eb20bd387d Binary files /dev/null and b/build/guide/images/layers.png differ diff --git a/build/guide/images/multi-platform.excalidraw b/build/guide/images/multi-platform.excalidraw new file mode 100644 index 0000000000..8e9fd28c01 --- /dev/null +++ b/build/guide/images/multi-platform.excalidraw @@ -0,0 +1,3963 @@ +{ + "type": "excalidraw", + "version": 2, + "source": "https://excalidraw.com", + "elements": [ + { + "type": "rectangle", + "version": 525, + "versionNonce": 1722914761, + "isDeleted": false, + "id": "m4oct8keJ1DppEJE1WkMD", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 139.26430190110273, + "y": 280.50163184359303, + "strokeColor": "#000000", + "backgroundColor": "#fafafa", + "width": 1235.453168431244, + "height": 533.663793372685, + "seed": 2039120594, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1682013068625, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 495, + "versionNonce": 1219192135, + "isDeleted": false, + "id": "1-ZLFLV8su0g9XwuwteNo", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 141.0435201490318, + "y": 898.9806192367971, + "strokeColor": "#000000", + "backgroundColor": "#fafafa", + "width": 1235.453168431244, + "height": 502.9620225491115, + "seed": 2039120594, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1682013068625, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 303, + "versionNonce": 1981658793, + "isDeleted": false, + "id": "rN2_cl0xfvRYQonl6vkph", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1172.484227229203, + "y": 1054.0279192773983, + "strokeColor": "#000000", + "backgroundColor": "#fff", + "width": 105, + "height": 48, + "seed": 319438128, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "type": "text", + "id": "CmNX48kM2xZpBvOWv4vLL" + } + ], + "updated": 1682013068625, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 296, + "versionNonce": 1287464039, + "isDeleted": false, + "id": "CmNX48kM2xZpBvOWv4vLL", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1196.6342268477333, + "y": 1059.0279192773983, + "strokeColor": "#000000", + "backgroundColor": "#fff", + "width": 56.70000076293945, + "height": 23, + "seed": 365730256, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1682013068625, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 2, + "text": "Native", + "textAlign": "center", + "verticalAlign": "top", + "containerId": "rN2_cl0xfvRYQonl6vkph", + "originalText": "Native", + "lineHeight": 1.15, + "baseline": 17 + }, + { + "type": "rectangle", + "version": 650, + "versionNonce": 1147337097, + "isDeleted": false, + "id": "LtirwYxkN46iINTk6ORnF", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 578.2983200783708, + "y": 1092.282346336332, + "strokeColor": "#000000", + "backgroundColor": "#fff", + "width": 734.1126518629558, + "height": 265.7164496080455, + "seed": 1119365330, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "TX-iYKUTgMQViBz7VfpBl", + "type": "arrow" + } + ], + "updated": 1682013068625, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 236, + "versionNonce": 1653211015, + "isDeleted": false, + "id": "Q5BKJXg6fsHd-gsqJrara", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1154.7835248624697, + "y": 717.7780770792342, + "strokeColor": "#000000", + "backgroundColor": "#fff", + "width": 105, + "height": 48, + "seed": 319438128, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "type": "text", + "id": "z7Hz9l8Eh1rp0yZ3Em_1y" + } + ], + "updated": 1682013068625, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 240, + "versionNonce": 1656545385, + "isDeleted": false, + "id": "z7Hz9l8Eh1rp0yZ3Em_1y", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1162.8001912748232, + "y": 737.7780770792342, + "strokeColor": "#000000", + "backgroundColor": "#fff", + "width": 88.96666717529297, + "height": 23, + "seed": 365730256, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1682013068625, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 2, + "text": "Emulation", + "textAlign": "center", + "verticalAlign": "bottom", + "containerId": "Q5BKJXg6fsHd-gsqJrara", + "originalText": "Emulation", + "lineHeight": 1.15, + "baseline": 17 + }, + { + "type": "rectangle", + "version": 172, + "versionNonce": 1548646055, + "isDeleted": false, + "id": "GQm4FzZtbbhCDoaqAv7le", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1150.8946619997946, + "y": 418.48112839251695, + "strokeColor": "#000000", + "backgroundColor": "#fff", + "width": 105, + "height": 48, + "seed": 319438128, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "type": "text", + "id": "l8tMFUyV-haN9PrKiPRBF" + } + ], + "updated": 1682013068625, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 165, + "versionNonce": 787934025, + "isDeleted": false, + "id": "l8tMFUyV-haN9PrKiPRBF", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1175.0446616183249, + "y": 423.48112839251695, + "strokeColor": "#000000", + "backgroundColor": "#fff", + "width": 56.70000076293945, + "height": 23, + "seed": 365730256, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1682013068625, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 2, + "text": "Native", + "textAlign": "center", + "verticalAlign": "top", + "containerId": "GQm4FzZtbbhCDoaqAv7le", + "originalText": "Native", + "lineHeight": 1.15, + "baseline": 17 + }, + { + "type": "rectangle", + "version": 158, + "versionNonce": 280431047, + "isDeleted": false, + "id": "ir2clNPFarBiIM-l8XGHL", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 216.18333435058594, + "y": 317.75, + "strokeColor": "#000000", + "backgroundColor": "#fff", + "width": 540, + "height": 100, + "seed": 1746443342, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "OWMwmgu_4YUKcxC0ZQ3X8", + "type": "arrow" + } + ], + "updated": 1682013068625, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 290, + "versionNonce": 1097636393, + "isDeleted": false, + "id": "gAHHdwqLplaGwjf6VPcpz", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 249, + "y": 343, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 481.0666809082031, + "height": 48, + "seed": 191454226, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1682013068625, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": "$ docker buildx build \\\n --platform=linux/x86_64,linux/arm64 .", + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "$ docker buildx build \\\n --platform=linux/x86_64,linux/arm64 .", + "lineHeight": 1.2, + "baseline": 43 + }, + { + "type": "rectangle", + "version": 334, + "versionNonce": 1289763047, + "isDeleted": false, + "id": "q3lButtA5onR4VZR0P1dC", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 696.9577126081389, + "y": 453, + "strokeColor": "#000000", + "backgroundColor": "#fff", + "width": 582, + "height": 125.00000000000001, + "seed": 665934610, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "XHNgPrDKzSDPBN_VvqakM", + "type": "arrow" + } + ], + "updated": 1682013068625, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 271, + "versionNonce": 453602569, + "isDeleted": false, + "id": "t8oZfLgXNIMbZPfkf2K43", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 711.9577126081389, + "y": 464.09999999999997, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 65.66666412353516, + "height": 23, + "seed": 59952334, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1682013068625, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 2, + "text": "x86_64", + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "x86_64", + "lineHeight": 1.15, + "baseline": 17 + }, + { + "type": "rectangle", + "version": 346, + "versionNonce": 106333191, + "isDeleted": false, + "id": "1Fp_pbpmTWDQd0ZVJ9pIG", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 748.9577126081389, + "y": 508, + "strokeColor": "#000000", + "backgroundColor": "#e3e3e3", + "width": 109, + "height": 38, + "seed": 1223334350, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "type": "text", + "id": "EUBXesfSs7cBbwtyEXcsu" + }, + { + "id": "BEaU3H-Y9JQG9lObz__wb", + "type": "arrow" + } + ], + "updated": 1682013068625, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 300, + "versionNonce": 323544041, + "isDeleted": false, + "id": "EUBXesfSs7cBbwtyEXcsu", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 768.9577126081389, + "y": 515.5, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 69, + "height": 23, + "seed": 1874213518, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1682013068625, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 2, + "text": "Stage 0", + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "1Fp_pbpmTWDQd0ZVJ9pIG", + "originalText": "Stage 0", + "lineHeight": 1.15, + "baseline": 17 + }, + { + "type": "rectangle", + "version": 412, + "versionNonce": 1293314855, + "isDeleted": false, + "id": "2yXR4vGEbBpsKnMV7s1kP", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 906.4577126081389, + "y": 508, + "strokeColor": "#000000", + "backgroundColor": "#e3e3e3", + "width": 109, + "height": 38, + "seed": 791077842, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "type": "text", + "id": "TRfDbeoK-YvwQj-Oy90Lq" + }, + { + "id": "BEaU3H-Y9JQG9lObz__wb", + "type": "arrow" + }, + { + "id": "vdRYSoxgrrnjghTRAudf3", + "type": "arrow" + } + ], + "updated": 1682013068625, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 365, + "versionNonce": 104234697, + "isDeleted": false, + "id": "TRfDbeoK-YvwQj-Oy90Lq", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 926.4577126081389, + "y": 515.5, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 69, + "height": 23, + "seed": 1711766094, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1682013068625, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 2, + "text": "Stage 1", + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "2yXR4vGEbBpsKnMV7s1kP", + "originalText": "Stage 1", + "lineHeight": 1.15, + "baseline": 17 + }, + { + "type": "rectangle", + "version": 467, + "versionNonce": 2106355271, + "isDeleted": false, + "id": "ZKM1quL44whxYBoCupgGk", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1061.457712608139, + "y": 508, + "strokeColor": "#000000", + "backgroundColor": "#e3e3e3", + "width": 109, + "height": 38, + "seed": 693859150, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "type": "text", + "id": "RA9bv5dhC9alZowtz882T" + }, + { + "id": "vdRYSoxgrrnjghTRAudf3", + "type": "arrow" + }, + { + "id": "yj0XHB-wh7i1Fwbx9pF6P", + "type": "arrow" + } + ], + "updated": 1682013068625, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 420, + "versionNonce": 1114488233, + "isDeleted": false, + "id": "RA9bv5dhC9alZowtz882T", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1081.4577126081388, + "y": 515.5, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 69, + "height": 23, + "seed": 1120055442, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1682013068625, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 2, + "text": "Stage 2", + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "ZKM1quL44whxYBoCupgGk", + "originalText": "Stage 2", + "lineHeight": 1.15, + "baseline": 17 + }, + { + "type": "arrow", + "version": 729, + "versionNonce": 848629095, + "isDeleted": false, + "id": "BEaU3H-Y9JQG9lObz__wb", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 863.9577126081389, + "y": 525, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 37, + "height": 0, + "seed": 271617488, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1682013068625, + "link": null, + "locked": false, + "startBinding": { + "elementId": "1Fp_pbpmTWDQd0ZVJ9pIG", + "focus": -0.10526315789473684, + "gap": 6 + }, + "endBinding": { + "elementId": "2yXR4vGEbBpsKnMV7s1kP", + "focus": 0.10526315789473684, + "gap": 5.5 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "triangle", + "points": [ + [ + 0, + 0 + ], + [ + 37, + 0 + ] + ] + }, + { + "type": "arrow", + "version": 731, + "versionNonce": 924459145, + "isDeleted": false, + "id": "vdRYSoxgrrnjghTRAudf3", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1023.957712608139, + "y": 528, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 32, + "height": 0, + "seed": 209605584, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1682013068625, + "link": null, + "locked": false, + "startBinding": { + "elementId": "2yXR4vGEbBpsKnMV7s1kP", + "focus": 0.05263157894736842, + "gap": 8.500000000000114 + }, + "endBinding": { + "elementId": "ZKM1quL44whxYBoCupgGk", + "focus": -0.05263157894736842, + "gap": 5.5 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "triangle", + "points": [ + [ + 0, + 0 + ], + [ + 32, + 0 + ] + ] + }, + { + "type": "rectangle", + "version": 400, + "versionNonce": 2004666503, + "isDeleted": false, + "id": "d68ZQZftblOLaIpz4KtPY", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 695.9577126081389, + "y": 604.5, + "strokeColor": "#000000", + "backgroundColor": "#fff", + "width": 586.9999999999999, + "height": 125.00000000000001, + "seed": 1119365330, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "DaErp3P_aUu9wm4RfRQMv", + "type": "arrow" + } + ], + "updated": 1682013068625, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 356, + "versionNonce": 1643587433, + "isDeleted": false, + "id": "hNKK8u3GTx9DKB6WLmuqJ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 710.9577126081389, + "y": 615.6, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 56.733333587646484, + "height": 23, + "seed": 11019278, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1682013068625, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 2, + "text": "arm64", + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "arm64", + "lineHeight": 1.15, + "baseline": 17 + }, + { + "type": "rectangle", + "version": 437, + "versionNonce": 973086631, + "isDeleted": false, + "id": "fbslI5MeFjrSnwQIcAyWd", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 748.9577126081389, + "y": 659.5, + "strokeColor": "#000000", + "backgroundColor": "#e3e3e3", + "width": 109, + "height": 38, + "seed": 1483107282, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "AL2yN2H7rEtewmV6SnwXg", + "type": "arrow" + }, + { + "type": "text", + "id": "Z1MvFuFWHCVsswewm9VHv" + } + ], + "updated": 1682013068625, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 390, + "versionNonce": 2102415945, + "isDeleted": false, + "id": "Z1MvFuFWHCVsswewm9VHv", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 768.9577126081389, + "y": 667, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 69, + "height": 23, + "seed": 409236046, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1682013068625, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 2, + "text": "Stage 0", + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "fbslI5MeFjrSnwQIcAyWd", + "originalText": "Stage 0", + "lineHeight": 1.15, + "baseline": 17 + }, + { + "type": "rectangle", + "version": 503, + "versionNonce": 2085327559, + "isDeleted": false, + "id": "1rf5ItjGeSBQBOFWfz7Wr", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 906.4577126081389, + "y": 659.5, + "strokeColor": "#000000", + "backgroundColor": "#e3e3e3", + "width": 109, + "height": 38, + "seed": 1678582162, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "AL2yN2H7rEtewmV6SnwXg", + "type": "arrow" + }, + { + "id": "nvAATnxHpfvKCROKF5UON", + "type": "arrow" + }, + { + "type": "text", + "id": "jiRmppkOox-fyjdU_vGPW" + } + ], + "updated": 1682013068625, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 455, + "versionNonce": 1845567785, + "isDeleted": false, + "id": "jiRmppkOox-fyjdU_vGPW", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 926.4577126081389, + "y": 667, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 69, + "height": 23, + "seed": 134019214, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1682013068625, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 2, + "text": "Stage 1", + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "1rf5ItjGeSBQBOFWfz7Wr", + "originalText": "Stage 1", + "lineHeight": 1.15, + "baseline": 17 + }, + { + "type": "rectangle", + "version": 560, + "versionNonce": 1190896103, + "isDeleted": false, + "id": "bnsdFNkZRrjEBdcnLybj4", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1061.457712608139, + "y": 659.5, + "strokeColor": "#000000", + "backgroundColor": "#e3e3e3", + "width": 109, + "height": 38, + "seed": 1020731218, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "nvAATnxHpfvKCROKF5UON", + "type": "arrow" + }, + { + "type": "text", + "id": "jtMxhNTd7B7uHlaZ-9MyI" + }, + { + "id": "NN9ja6xlhMofzQtQ63rot", + "type": "arrow" + } + ], + "updated": 1682013068625, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 510, + "versionNonce": 1903498249, + "isDeleted": false, + "id": "jtMxhNTd7B7uHlaZ-9MyI", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1081.4577126081388, + "y": 667, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 69, + "height": 23, + "seed": 1999288014, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1682013068625, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 2, + "text": "Stage 2", + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "bnsdFNkZRrjEBdcnLybj4", + "originalText": "Stage 2", + "lineHeight": 1.15, + "baseline": 17 + }, + { + "type": "text", + "version": 377, + "versionNonce": 1528614151, + "isDeleted": false, + "id": "hn0O6YU9iz6ooAkIpZjym", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1232.957712608139, + "y": 663.5, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 16.700000762939453, + "height": 23, + "seed": 1864066322, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "NN9ja6xlhMofzQtQ63rot", + "type": "arrow" + } + ], + "updated": 1682013068625, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 2, + "text": "...", + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "...", + "lineHeight": 1.15, + "baseline": 17 + }, + { + "type": "arrow", + "version": 1069, + "versionNonce": 195537641, + "isDeleted": false, + "id": "AL2yN2H7rEtewmV6SnwXg", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 863.9577126081389, + "y": 676.5, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 37, + "height": 0, + "seed": 119757264, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1682013068625, + "link": null, + "locked": false, + "startBinding": { + "elementId": "fbslI5MeFjrSnwQIcAyWd", + "focus": -0.10526315789473684, + "gap": 6 + }, + "endBinding": { + "elementId": "1rf5ItjGeSBQBOFWfz7Wr", + "focus": 0.10526315789473684, + "gap": 5.5 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "triangle", + "points": [ + [ + 0, + 0 + ], + [ + 37, + 0 + ] + ] + }, + { + "type": "arrow", + "version": 1075, + "versionNonce": 606835751, + "isDeleted": false, + "id": "nvAATnxHpfvKCROKF5UON", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1020.957712608139, + "y": 679.5, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 32, + "height": 0, + "seed": 859283408, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1682013068625, + "link": null, + "locked": false, + "startBinding": { + "elementId": "1rf5ItjGeSBQBOFWfz7Wr", + "focus": 0.05263157894736842, + "gap": 5.500000000000114 + }, + "endBinding": { + "elementId": "bnsdFNkZRrjEBdcnLybj4", + "focus": -0.05263157894736842, + "gap": 8.5 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "triangle", + "points": [ + [ + 0, + 0 + ], + [ + 32, + 0 + ] + ] + }, + { + "type": "text", + "version": 403, + "versionNonce": 891577801, + "isDeleted": false, + "id": "caChwq3YzNrRxUKuLTUDh", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1230.2514869284173, + "y": 516, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 16.700000762939453, + "height": 23, + "seed": 1347882574, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "yj0XHB-wh7i1Fwbx9pF6P", + "type": "arrow" + } + ], + "updated": 1682013068625, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 2, + "text": "...", + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "...", + "lineHeight": 1.15, + "baseline": 17 + }, + { + "type": "arrow", + "version": 1318, + "versionNonce": 1779726151, + "isDeleted": false, + "id": "yj0XHB-wh7i1Fwbx9pF6P", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1181.1554635541802, + "y": 529.5844034638384, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 35.97670807398822, + "height": 0.917159452202668, + "seed": 487451600, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1682013068625, + "link": null, + "locked": false, + "startBinding": { + "elementId": "ZKM1quL44whxYBoCupgGk", + "focus": 0.045234719089785984, + "gap": 10.697750946041197 + }, + "endBinding": { + "elementId": "caChwq3YzNrRxUKuLTUDh", + "focus": -0.30299012778721246, + "gap": 13.1193153002489 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "triangle", + "points": [ + [ + 0, + 0 + ], + [ + 35.97670807398822, + 0.917159452202668 + ] + ] + }, + { + "type": "rectangle", + "version": 263, + "versionNonce": 1225180329, + "isDeleted": false, + "id": "YS4-jnB5Z9NSRGXMdhXh2", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 219.55501530146717, + "y": 949.9806192367971, + "strokeColor": "#000000", + "backgroundColor": "#fff", + "width": 540, + "height": 100, + "seed": 265660498, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "twHh6Ujx_ivxDMDAl01mb", + "type": "arrow" + } + ], + "updated": 1682013068625, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 391, + "versionNonce": 1127478887, + "isDeleted": false, + "id": "-w-ODS-0PhtrWyYN87rKS", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 252.37168095088123, + "y": 976.2306192367971, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 481.0666809082031, + "height": 48, + "seed": 1073036750, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1682013068625, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": "$ docker buildx build \\\n --platform=linux/x86_64,linux/arm64 .", + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "$ docker buildx build \\\n --platform=linux/x86_64,linux/arm64 .", + "lineHeight": 1.2, + "baseline": 43 + }, + { + "type": "rectangle", + "version": 581, + "versionNonce": 855263113, + "isDeleted": false, + "id": "rCWTugUXkb9Us1HYZt5WU", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 610.1334474020507, + "y": 1198.0756799819796, + "strokeColor": "#000000", + "backgroundColor": "#e3e3e3", + "width": 109, + "height": 38, + "seed": 2110648722, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "YxSVyP4c1fhRZcLESrX9_", + "type": "arrow" + }, + { + "type": "text", + "id": "NfRytK-V9ByjUbQfaj46Q" + } + ], + "updated": 1682013068625, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 530, + "versionNonce": 1180078471, + "isDeleted": false, + "id": "NfRytK-V9ByjUbQfaj46Q", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 630.1334474020507, + "y": 1205.5756799819796, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 69, + "height": 23, + "seed": 57747598, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1682013068625, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 2, + "text": "Stage 0", + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "rCWTugUXkb9Us1HYZt5WU", + "originalText": "Stage 0", + "lineHeight": 1.15, + "baseline": 17 + }, + { + "type": "rectangle", + "version": 616, + "versionNonce": 1564110441, + "isDeleted": false, + "id": "ODwh222UhVWgIfQtNtZzF", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 767.6334474020507, + "y": 1198.0756799819796, + "strokeColor": "#000000", + "backgroundColor": "#e3e3e3", + "width": 109, + "height": 38, + "seed": 100527954, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "YxSVyP4c1fhRZcLESrX9_", + "type": "arrow" + }, + { + "id": "HmuCBmjwtVLfhfqz20qKU", + "type": "arrow" + }, + { + "type": "text", + "id": "uHThi45tUkI60yBUmjtcZ" + }, + { + "id": "u0w1bIMJowuT3wIL3F3uX", + "type": "arrow" + } + ], + "updated": 1682013068625, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 566, + "versionNonce": 2092484775, + "isDeleted": false, + "id": "uHThi45tUkI60yBUmjtcZ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 787.6334474020507, + "y": 1205.5756799819796, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 69, + "height": 23, + "seed": 1419306702, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1682013068625, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 2, + "text": "Stage 1", + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "ODwh222UhVWgIfQtNtZzF", + "originalText": "Stage 1", + "lineHeight": 1.15, + "baseline": 17 + }, + { + "type": "rectangle", + "version": 724, + "versionNonce": 1586673993, + "isDeleted": false, + "id": "lZaUHVKGq9BaZJ4WDR1rd", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 937.6334474020507, + "y": 1248.0756799819796, + "strokeColor": "#000000", + "backgroundColor": "#e3e3e3", + "width": 109, + "height": 56, + "seed": 182990098, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "HmuCBmjwtVLfhfqz20qKU", + "type": "arrow" + }, + { + "id": "u0w1bIMJowuT3wIL3F3uX", + "type": "arrow" + }, + { + "type": "text", + "id": "c5Ja2YsH1r9SQa-uwBASi" + }, + { + "id": "4IQTAXUVWyxYomW7AZqep", + "type": "arrow" + }, + { + "id": "ACgIsyLhU_FB76UY1rJtZ", + "type": "arrow" + } + ], + "updated": 1682013068625, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 683, + "versionNonce": 336010183, + "isDeleted": false, + "id": "c5Ja2YsH1r9SQa-uwBASi", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 957.1001145773437, + "y": 1253.0756799819796, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 70.06666564941406, + "height": 46, + "seed": 514776334, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1682013068625, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 2, + "text": "Stage 2\n(arm64)", + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "lZaUHVKGq9BaZJ4WDR1rd", + "originalText": "Stage 2\n(arm64)", + "lineHeight": 1.15, + "baseline": 40 + }, + { + "type": "arrow", + "version": 1658, + "versionNonce": 1751033897, + "isDeleted": false, + "id": "YxSVyP4c1fhRZcLESrX9_", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 725.1334474020507, + "y": 1215.0756799819796, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 37, + "height": 0, + "seed": 726849488, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1682013068625, + "link": null, + "locked": false, + "startBinding": { + "elementId": "rCWTugUXkb9Us1HYZt5WU", + "focus": -0.10526315789473684, + "gap": 6 + }, + "endBinding": { + "elementId": "ODwh222UhVWgIfQtNtZzF", + "focus": 0.10526315789473684, + "gap": 5.5 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "triangle", + "points": [ + [ + 0, + 0 + ], + [ + 37, + 0 + ] + ] + }, + { + "type": "arrow", + "version": 1710, + "versionNonce": 1348340455, + "isDeleted": false, + "id": "HmuCBmjwtVLfhfqz20qKU", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 885.0156289347301, + "y": 1237.4860107067416, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 47.1178184673206, + "height": 13.825676882837797, + "seed": 1623678416, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1682013068625, + "link": null, + "locked": false, + "startBinding": { + "elementId": "ODwh222UhVWgIfQtNtZzF", + "focus": 0.05598314449711775, + "gap": 8.382181532679397 + }, + "endBinding": { + "elementId": "lZaUHVKGq9BaZJ4WDR1rd", + "focus": 0.16271949081077258, + "gap": 5.5 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "triangle", + "points": [ + [ + 0, + 0 + ], + [ + 47.1178184673206, + 13.825676882837797 + ] + ] + }, + { + "type": "arrow", + "version": 2174, + "versionNonce": 1955183369, + "isDeleted": false, + "id": "u0w1bIMJowuT3wIL3F3uX", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 887.2651484073244, + "y": 1190.7066865340905, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 37.438960269667064, + "height": 20.144504831057702, + "seed": 1102783440, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1682013068625, + "link": null, + "locked": false, + "startBinding": { + "elementId": "ODwh222UhVWgIfQtNtZzF", + "focus": 0.1795353406569025, + "gap": 10.631701005273726 + }, + "endBinding": { + "elementId": "tnyWm37RIDomUU-7uov2f", + "focus": 0.5809893397278695, + "gap": 11.554346354453742 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "triangle", + "points": [ + [ + 0, + 0 + ], + [ + 37.438960269667064, + -20.144504831057702 + ] + ] + }, + { + "type": "rectangle", + "version": 788, + "versionNonce": 1045042695, + "isDeleted": false, + "id": "tnyWm37RIDomUU-7uov2f", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 936.2584550314452, + "y": 1140.3256799819796, + "strokeColor": "#000000", + "backgroundColor": "#e3e3e3", + "width": 109, + "height": 56, + "seed": 1516874830, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "HmuCBmjwtVLfhfqz20qKU", + "type": "arrow" + }, + { + "id": "u0w1bIMJowuT3wIL3F3uX", + "type": "arrow" + }, + { + "type": "text", + "id": "loK4BPhHRUc1uB7O1Hljz" + }, + { + "id": "4IQTAXUVWyxYomW7AZqep", + "type": "arrow" + } + ], + "updated": 1682013068625, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 751, + "versionNonce": 865038825, + "isDeleted": false, + "id": "loK4BPhHRUc1uB7O1Hljz", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 951.2584550314452, + "y": 1145.3256799819796, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 79, + "height": 46, + "seed": 462456722, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1682013068625, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 2, + "text": "Stage 2\n(x86_64)", + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "tnyWm37RIDomUU-7uov2f", + "originalText": "Stage 2\n(x86_64)", + "lineHeight": 1.15, + "baseline": 40 + }, + { + "type": "rectangle", + "version": 714, + "versionNonce": 617069863, + "isDeleted": false, + "id": "wAeR_vBd17HyDGrDlwyC_", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1098.2584550314452, + "y": 1193.3256799819796, + "strokeColor": "#000000", + "backgroundColor": "#e3e3e3", + "width": 109, + "height": 38, + "seed": 1200610702, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "YxSVyP4c1fhRZcLESrX9_", + "type": "arrow" + }, + { + "id": "HmuCBmjwtVLfhfqz20qKU", + "type": "arrow" + }, + { + "id": "u0w1bIMJowuT3wIL3F3uX", + "type": "arrow" + }, + { + "type": "text", + "id": "iG2c2MrjypoqKaOX2mtoS" + }, + { + "id": "4IQTAXUVWyxYomW7AZqep", + "type": "arrow" + }, + { + "id": "ACgIsyLhU_FB76UY1rJtZ", + "type": "arrow" + }, + { + "id": "_p0pmkZw_xVeyERHCtdZS", + "type": "arrow" + } + ], + "updated": 1682013068625, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 662, + "versionNonce": 981159113, + "isDeleted": false, + "id": "iG2c2MrjypoqKaOX2mtoS", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1118.2584550314452, + "y": 1200.8256799819796, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 69, + "height": 23, + "seed": 537987666, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1682013068625, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 2, + "text": "Stage 3", + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "wAeR_vBd17HyDGrDlwyC_", + "originalText": "Stage 3", + "lineHeight": 1.15, + "baseline": 17 + }, + { + "type": "arrow", + "version": 2313, + "versionNonce": 927170631, + "isDeleted": false, + "id": "4IQTAXUVWyxYomW7AZqep", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1054.0389748966118, + "y": 1174.3979323975086, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 36.438960269667064, + "height": 15.855495168942298, + "seed": 474360272, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1682013068625, + "link": null, + "locked": false, + "startBinding": { + "elementId": "tnyWm37RIDomUU-7uov2f", + "focus": -0.41502389716035465, + "gap": 8.780519865166525 + }, + "endBinding": { + "elementId": "wAeR_vBd17HyDGrDlwyC_", + "focus": -0.11770170519336821, + "gap": 7.780519865166525 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "triangle", + "points": [ + [ + 0, + 0 + ], + [ + 36.438960269667064, + 15.855495168942298 + ] + ] + }, + { + "type": "arrow", + "version": 2210, + "versionNonce": 1894304681, + "isDeleted": false, + "id": "ACgIsyLhU_FB76UY1rJtZ", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1056.0389748966118, + "y": 1254.3979323975086, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 37.438960269667064, + "height": 20.144504831057702, + "seed": 998272976, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1682013068625, + "link": null, + "locked": false, + "startBinding": { + "elementId": "lZaUHVKGq9BaZJ4WDR1rd", + "focus": 0.2216756709114692, + "gap": 9.405527494561056 + }, + "endBinding": { + "elementId": "wAeR_vBd17HyDGrDlwyC_", + "focus": 0.20629084533281625, + "gap": 4.780519865166525 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "triangle", + "points": [ + [ + 0, + 0 + ], + [ + 37.438960269667064, + -20.144504831057702 + ] + ] + }, + { + "type": "arrow", + "version": 1672, + "versionNonce": 127524711, + "isDeleted": false, + "id": "_p0pmkZw_xVeyERHCtdZS", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1215.2584550314452, + "y": 1214.3256799819796, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 37, + "height": 0, + "seed": 1199699408, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1682013068625, + "link": null, + "locked": false, + "startBinding": { + "elementId": "wAeR_vBd17HyDGrDlwyC_", + "focus": 0.10526315789473684, + "gap": 8 + }, + "endBinding": { + "elementId": "d9qHgPlv8Hb3SYjbo_vdC", + "focus": -0.17391304347826086, + "gap": 15.149999618530273 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "triangle", + "points": [ + [ + 0, + 0 + ], + [ + 37, + 0 + ] + ] + }, + { + "type": "text", + "version": 543, + "versionNonce": 1057189513, + "isDeleted": false, + "id": "d9qHgPlv8Hb3SYjbo_vdC", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1267.4084546499755, + "y": 1200.8256799819796, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 16.700000762939453, + "height": 23, + "seed": 1501402062, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "_p0pmkZw_xVeyERHCtdZS", + "type": "arrow" + } + ], + "updated": 1682013068625, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 2, + "text": "...", + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "...", + "lineHeight": 1.15, + "baseline": 17 + }, + { + "type": "arrow", + "version": 72, + "versionNonce": 1836609959, + "isDeleted": false, + "id": "OWMwmgu_4YUKcxC0ZQ3X8", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 419.27140705741624, + "y": 427.0849261376058, + "strokeColor": "#000000", + "backgroundColor": "#fff", + "width": 3, + "height": 85.4561978825073, + "seed": 1758570288, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1682013068625, + "link": null, + "locked": false, + "startBinding": { + "elementId": "ir2clNPFarBiIM-l8XGHL", + "focus": 0.25388621826760055, + "gap": 9.334926137605805 + }, + "endBinding": { + "elementId": "eW4wLD-B0x4obRM1_qCuV", + "focus": 0.0010969719250419608, + "gap": 12.930949052709835 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "triangle", + "points": [ + [ + 0, + 0 + ], + [ + 3, + 85.4561978825073 + ] + ] + }, + { + "type": "arrow", + "version": 53, + "versionNonce": 431890505, + "isDeleted": false, + "id": "XHNgPrDKzSDPBN_VvqakM", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 511.37671952813673, + "y": 575.4768184515444, + "strokeColor": "#000000", + "backgroundColor": "#fff", + "width": 172.69746088260092, + "height": 53.72809894125362, + "seed": 1307366864, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1682013068625, + "link": null, + "locked": false, + "startBinding": { + "elementId": "eW4wLD-B0x4obRM1_qCuV", + "focus": 0.0599697674893874, + "gap": 16.697014961212304 + }, + "endBinding": { + "elementId": "q3lButtA5onR4VZR0P1dC", + "focus": 0.5769515824875527, + "gap": 12.88353219740128 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "triangle", + "points": [ + [ + 0, + 0 + ], + [ + 172.69746088260092, + -53.72809894125362 + ] + ] + }, + { + "type": "arrow", + "version": 39, + "versionNonce": 15312071, + "isDeleted": false, + "id": "DaErp3P_aUu9wm4RfRQMv", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 512.655959979119, + "y": 610.0163106280646, + "strokeColor": "#000000", + "backgroundColor": "#fff", + "width": 167.58049907867212, + "height": 51.16961803928916, + "seed": 507269424, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1682013068625, + "link": null, + "locked": false, + "startBinding": { + "elementId": "eW4wLD-B0x4obRM1_qCuV", + "focus": -0.19098219601450322, + "gap": 16.000824136753636 + }, + "endBinding": { + "elementId": "d68ZQZftblOLaIpz4KtPY", + "focus": -0.5824718001473967, + "gap": 15.72125355034774 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "triangle", + "points": [ + [ + 0, + 0 + ], + [ + 167.58049907867212, + 51.16961803928916 + ] + ] + }, + { + "type": "arrow", + "version": 531, + "versionNonce": 726098441, + "isDeleted": false, + "id": "twHh6Ujx_ivxDMDAl01mb", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 423.4171332358702, + "y": 1058.8393125126645, + "strokeColor": "#000000", + "backgroundColor": "#fff", + "width": 1.1511993344824987, + "height": 64.17695743152512, + "seed": 1089039824, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1682013068625, + "link": null, + "locked": false, + "startBinding": { + "elementId": "YS4-jnB5Z9NSRGXMdhXh2", + "focus": 0.2402466860128919, + "gap": 8.858693275867381 + }, + "endBinding": { + "elementId": "IvR4tdD4qTmfgM3QsH7D4", + "focus": -0.04749560935189743, + "gap": 12.341609090682368 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "triangle", + "points": [ + [ + 0, + 0 + ], + [ + -1.1511993344824987, + 64.17695743152512 + ] + ] + }, + { + "type": "arrow", + "version": 726, + "versionNonce": 417226503, + "isDeleted": false, + "id": "TX-iYKUTgMQViBz7VfpBl", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 508.34237898922174, + "y": 1209.4047697618141, + "strokeColor": "#000000", + "backgroundColor": "#fff", + "width": 59.213885745322216, + "height": 0.7440109061924431, + "seed": 1683067856, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1682013068625, + "link": null, + "locked": false, + "startBinding": { + "elementId": "IvR4tdD4qTmfgM3QsH7D4", + "focus": 0.009449213932212134, + "gap": 11.849380935254544 + }, + "endBinding": { + "elementId": "LtirwYxkN46iINTk6ORnF", + "focus": 0.07452398003125042, + "gap": 10.742055343826905 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "triangle", + "points": [ + [ + 0, + 0 + ], + [ + 59.213885745322216, + 0.7440109061924431 + ] + ] + }, + { + "type": "arrow", + "version": 1365, + "versionNonce": 838875369, + "isDeleted": false, + "id": "NN9ja6xlhMofzQtQ63rot", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1182.2573132670266, + "y": 675.9334244219384, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 35.97670807398822, + "height": 0.917159452202668, + "seed": 487451600, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1682013068626, + "link": null, + "locked": false, + "startBinding": { + "elementId": "bnsdFNkZRrjEBdcnLybj4", + "focus": -0.20877347362110119, + "gap": 11.799600658887584 + }, + "endBinding": { + "elementId": "hn0O6YU9iz6ooAkIpZjym", + "focus": -0.20821586128081568, + "gap": 14.723691267124195 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "triangle", + "points": [ + [ + 0, + 0 + ], + [ + 35.97670807398822, + 0.917159452202668 + ] + ] + }, + { + "type": "ellipse", + "version": 320, + "versionNonce": 1430198951, + "isDeleted": false, + "id": "eW4wLD-B0x4obRM1_qCuV", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 352.85566585459014, + "y": 525.4223315040042, + "strokeColor": "#000", + "backgroundColor": "#fff", + "width": 144.65533699199153, + "height": 144.65533699199153, + "seed": 1939286566, + "groupIds": [ + "zllQsRN8kpTxd7fRPV5wR" + ], + "roundness": null, + "boundElements": [ + { + "id": "XHNgPrDKzSDPBN_VvqakM", + "type": "arrow" + }, + { + "id": "DaErp3P_aUu9wm4RfRQMv", + "type": "arrow" + }, + { + "id": "OWMwmgu_4YUKcxC0ZQ3X8", + "type": "arrow" + } + ], + "updated": 1682013068626, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 1804, + "versionNonce": 1976731465, + "isDeleted": false, + "id": "Z-G3U7mYMEqLtpZuDjkVy", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 383.3553903874431, + "y": 598.8676757365404, + "strokeColor": "#000", + "backgroundColor": "#228be6", + "width": 48.462479197464376, + "height": 48.00727078788957, + "seed": 669731308, + "groupIds": [ + "405bGVmXZiZ9_ZM85t0ZC", + "zllQsRN8kpTxd7fRPV5wR" + ], + "roundness": null, + "boundElements": [], + "updated": 1682013068626, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 3.232350920222781, + -5.268712379608585 + ], + [ + 1.351727601895389, + -9.735192760635055 + ], + [ + 7.228675471667403, + -13.96659522687024 + ], + [ + 10.803172589834595, + -11.413107445744108 + ], + [ + 16.515894122589973, + -13.122940360317552 + ], + [ + 18.064782733515074, + -17.824498656134946 + ], + [ + 24.160388020957896, + -17.146081821325136 + ], + [ + 24.868903798698604, + -12.965838732654833 + ], + [ + 30.39532686507639, + -9.635814577273443 + ], + [ + 35.49664046480918, + -11.336252443851281 + ], + [ + 39.18092250906128, + -6.801751466310624 + ], + [ + 36.55941413142096, + -2.692359955414607 + ], + [ + 38.33070357577272, + 3.400875733155674 + ], + [ + 42.794352975538736, + 5.597274644151715 + ], + [ + 42.0149856200241, + 11.761361910495921 + ], + [ + 37.55133622025737, + 12.61158084378484 + ], + [ + 34.221312064876344, + 18.56311337680691 + ], + [ + 36.06345308700204, + 22.53080173215471 + ], + [ + 31.45810053168745, + 26.498490087502876 + ], + [ + 27.702966909661427, + 23.947833287636122 + ], + [ + 21.397176487769006, + 25.506567998665744 + ], + [ + 19.20077757677296, + 30.182772131754618 + ], + [ + 12.894987154880544, + 29.190850042917486 + ], + [ + 12.115619799365913, + 24.372942754280764 + ], + [ + 6.518345155214198, + 22.10569226551043 + ], + [ + 2.408953644318542, + 23.451872243217554 + ], + [ + -1.2753283999335585, + 19.200777576773326 + ], + [ + 0.7793673555146309, + 14.807979754780883 + ], + [ + -0.921070511063206, + 8.927298799533101 + ], + [ + -5.6681262219256405, + 6.376641999666707 + ], + [ + -4.676204133089232, + 1.0627736666110577 + ], + [ + 0, + 0 + ] + ] + }, + { + "type": "ellipse", + "version": 1126, + "versionNonce": 1811099079, + "isDeleted": false, + "id": "8yqGd4P_FA4gPFoK8e3x4", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 387.09168061753815, + "y": 590.1564475487975, + "strokeColor": "transparent", + "backgroundColor": "#fff", + "width": 29.349481925706176, + "height": 29.349481925706176, + "seed": 865367148, + "groupIds": [ + "405bGVmXZiZ9_ZM85t0ZC", + "zllQsRN8kpTxd7fRPV5wR" + ], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1682013068626, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 1964, + "versionNonce": 1651815977, + "isDeleted": false, + "id": "V8HXj7O6Lz5LZFDwzbiGb", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 448.7370485342349, + "y": 599.7531280670795, + "strokeColor": "#000", + "backgroundColor": "#228be6", + "width": 18.07788101926878, + "height": 17.90807535510263, + "seed": 1706844116, + "groupIds": [ + "405bGVmXZiZ9_ZM85t0ZC", + "zllQsRN8kpTxd7fRPV5wR" + ], + "roundness": null, + "boundElements": [], + "updated": 1682013068626, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 1.2057586882878402, + -1.9653793429597384 + ], + [ + 0.5042327830146355, + -3.631503367983193 + ], + [ + 2.6965012369929946, + -5.209936654847365 + ], + [ + 4.02989017367221, + -4.257413196374152 + ], + [ + 6.160897540104465, + -4.895229430796297 + ], + [ + 6.738676978632851, + -6.649044193978904 + ], + [ + 9.012510859021344, + -6.395975448337794 + ], + [ + 9.276807365151004, + -4.836626062172748 + ], + [ + 11.338320112962455, + -3.5944324833633208 + ], + [ + 13.241254957095896, + -4.228744098074555 + ], + [ + 14.615596788970292, + -2.5372464588446797 + ], + [ + 13.637699716290658, + -1.004326723292682 + ], + [ + 14.29844098161481, + 1.2686232294224735 + ], + [ + 15.963508970231503, + 2.087942398424365 + ], + [ + 15.672782813488928, + 4.387322001752433 + ], + [ + 14.007714824871965, + 4.704477809108051 + ], + [ + 12.765521246062674, + 6.924568460597247 + ], + [ + 13.452692161999734, + 8.404628894923288 + ], + [ + 11.734764872156946, + 9.884689329249461 + ], + [ + 10.333993389669644, + 8.93322190718261 + ], + [ + 7.981754485115617, + 9.514674220667887 + ], + [ + 7.162435316113725, + 11.259031161123724 + ], + [ + 4.810196411559699, + 10.889016052542143 + ], + [ + 4.519470254817128, + 9.091799810860483 + ], + [ + 2.4315278563927616, + 8.246050991245545 + ], + [ + 0.8986081208408969, + 8.74821435289182 + ], + [ + -0.4757337110334955, + 7.16243531611386 + ], + [ + 0.2907261567425713, + 5.523796978109942 + ], + [ + -0.3435854579686661, + 3.3301359772337933 + ], + [ + -2.1143720490372777, + 2.3786685551670725 + ], + [ + -1.7443569404559698, + 0.3964447591944887 + ], + [ + 0, + 0 + ] + ] + }, + { + "type": "ellipse", + "version": 989, + "versionNonce": 888659175, + "isDeleted": false, + "id": "UJRehZGuKeN60u1tvuOeD", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 50, + "angle": 0, + "x": 450.7690757277858, + "y": 597.0722907403032, + "strokeColor": "transparent", + "backgroundColor": "#fff", + "width": 9.838274710293614, + "height": 9.838274710293614, + "seed": 1346979156, + "groupIds": [ + "405bGVmXZiZ9_ZM85t0ZC", + "zllQsRN8kpTxd7fRPV5wR" + ], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1682013068626, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 2077, + "versionNonce": 481167625, + "isDeleted": false, + "id": "IPOYvoiPWeXA4yCuSVHpF", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 412.8853501067506, + "y": 569.1385202901731, + "strokeColor": "#000", + "backgroundColor": "#228be6", + "width": 26.592110509330666, + "height": 26.342330627396294, + "seed": 2121165140, + "groupIds": [ + "405bGVmXZiZ9_ZM85t0ZC", + "zllQsRN8kpTxd7fRPV5wR" + ], + "roundness": null, + "boundElements": [], + "updated": 1682013068626, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 1.7736408516219317, + -2.8910238221523064 + ], + [ + 0.7417138034076349, + -5.341850561660664 + ], + [ + 3.9664858290767158, + -7.663686420142039 + ], + [ + 5.927867581633842, + -6.262548253370651 + ], + [ + 9.062526080822058, + -7.2007599703479155 + ], + [ + 9.912425173696347, + -9.78057759088306 + ], + [ + 13.257177900119409, + -9.408319800084842 + ], + [ + 13.64595144557746, + -7.114555881882269 + ], + [ + 16.6783851001504, + -5.2873202182293975 + ], + [ + 19.4775546274482, + -6.220376727328793 + ], + [ + 21.4991770638303, + -3.732226036397196 + ], + [ + 20.060714945635674, + -1.4773394727405513 + ], + [ + 21.0326488092808, + 1.8661130181987946 + ], + [ + 23.48192214566627, + 3.07131100911867 + ], + [ + 23.05427124566249, + 6.453640854603741 + ], + [ + 20.60499790927662, + 6.920169109153439 + ], + [ + 18.77776224562395, + 10.185866891001135 + ], + [ + 19.7885734638148, + 12.362998745566134 + ], + [ + 17.26154541833748, + 14.540130600131329 + ], + [ + 15.201045627409659, + 13.140545836482236 + ], + [ + 11.740961072832937, + 13.995847636489982 + ], + [ + 10.53576308191306, + 16.56175303651323 + ], + [ + 7.0756785273363425, + 16.017470072871877 + ], + [ + 6.648027627332568, + 13.37380996375718 + ], + [ + 3.5767166182138967, + 12.129734618291383 + ], + [ + 1.3218300545574475, + 12.86840435466156 + ], + [ + -0.699792381824648, + 10.535763081913261 + ], + [ + 0.4276509000037744, + 8.125367100073314 + ], + [ + -0.5054056090956239, + 4.898546672771543 + ], + [ + -3.110188363664396, + 3.498961909122644 + ], + [ + -2.565905400023444, + 0.5831603181870729 + ], + [ + 0, + 0 + ] + ] + }, + { + "type": "ellipse", + "version": 1100, + "versionNonce": 1406773255, + "isDeleted": false, + "id": "qL96yy6zPtqXLORFeeSGO", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 50, + "angle": 0, + "x": 415.87441124899806, + "y": 565.1950756809748, + "strokeColor": "transparent", + "backgroundColor": "#fff", + "width": 14.471855857355514, + "height": 14.471855857355514, + "seed": 1761484500, + "groupIds": [ + "405bGVmXZiZ9_ZM85t0ZC", + "zllQsRN8kpTxd7fRPV5wR" + ], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1682013068626, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 1440, + "versionNonce": 771358697, + "isDeleted": false, + "id": "0ct8xbcYsMZvVp4bzyUtq", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 422.4422398725509, + "y": 598.9828784052056, + "strokeColor": "#000", + "backgroundColor": "#ced4da", + "width": 64.82480153660623, + "height": 27.150152172978316, + "seed": 1182034516, + "groupIds": [ + "405bGVmXZiZ9_ZM85t0ZC", + "zllQsRN8kpTxd7fRPV5wR" + ], + "roundness": null, + "boundElements": [], + "updated": 1682013068626, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 9.698769110680917, + 4.228444879073213 + ], + [ + 9.904237349153744, + 8.049813005593023 + ], + [ + 7.868421773176677, + 11.549834229089711 + ], + [ + -2.961133307055898, + 9.109371112417243 + ], + [ + -2.808604362263954, + 13.532710511385893 + ], + [ + 3.7501402637923684, + 18.566165689522318 + ], + [ + 12.901876951313557, + 17.19340518639437 + ], + [ + 16.562571626322036, + 13.38018156659395 + ], + [ + 59.72826300246312, + 22.83697614369857 + ], + [ + 61.863668229550335, + 16.735818352018082 + ], + [ + 17.630274239865642, + 7.279023774913457 + ], + [ + 15.64739795756946, + 0.2626923144808493 + ], + [ + 6.49566127004918, + -4.313176029279745 + ], + [ + 0, + 0 + ] + ] + }, + { + "id": "f-d34FQPMBf_4xuQ6_4dC", + "type": "text", + "x": 379.5166702270508, + "y": 682.25, + "width": 87.16666412353516, + "height": 32.199999999999996, + "angle": 0, + "strokeColor": "#000", + "backgroundColor": "#fff", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "roundness": null, + "seed": 408435911, + "version": 64, + "versionNonce": 1184173863, + "isDeleted": false, + "boundElements": null, + "updated": 1682013068626, + "link": null, + "locked": false, + "text": "Builder", + "fontSize": 28, + "fontFamily": 2, + "textAlign": "center", + "verticalAlign": "top", + "baseline": 24, + "containerId": null, + "originalText": "Builder", + "lineHeight": 1.15 + }, + { + "id": "_XsfNNJcRV7Bt7UKuUg6-", + "type": "text", + "x": 390.35000228881836, + "y": 722.25, + "width": 65.66666412353516, + "height": 23, + "angle": 0, + "strokeColor": "#000", + "backgroundColor": "#fff", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "roundness": null, + "seed": 1333197225, + "version": 77, + "versionNonce": 1684282057, + "isDeleted": false, + "boundElements": null, + "updated": 1682013068626, + "link": null, + "locked": false, + "text": "x86_64", + "fontSize": 20, + "fontFamily": 2, + "textAlign": "center", + "verticalAlign": "top", + "baseline": 17, + "containerId": null, + "originalText": "x86_64", + "lineHeight": 1.15 + }, + { + "type": "ellipse", + "version": 333, + "versionNonce": 395743815, + "isDeleted": false, + "id": "IvR4tdD4qTmfgM3QsH7D4", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 351.85566585459014, + "y": 1135.3361657520022, + "strokeColor": "#000", + "backgroundColor": "#fff", + "width": 144.65533699199153, + "height": 144.65533699199153, + "seed": 1939286566, + "groupIds": [ + "5vsAhxm6C2Bq_rzwF8H7B" + ], + "roundness": null, + "boundElements": [ + { + "id": "TX-iYKUTgMQViBz7VfpBl", + "type": "arrow" + }, + { + "id": "twHh6Ujx_ivxDMDAl01mb", + "type": "arrow" + } + ], + "updated": 1682013068626, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 1815, + "versionNonce": 1082644905, + "isDeleted": false, + "id": "xj3vYi8Qi3vpZGprVYvqP", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 382.3553903874431, + "y": 1208.7815099845384, + "strokeColor": "#000", + "backgroundColor": "#228be6", + "width": 48.462479197464376, + "height": 48.00727078788957, + "seed": 669731308, + "groupIds": [ + "GXeNeNDLLNU6sD6crDmYB", + "5vsAhxm6C2Bq_rzwF8H7B" + ], + "roundness": null, + "boundElements": [], + "updated": 1682013068626, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 3.232350920222781, + -5.268712379608585 + ], + [ + 1.351727601895389, + -9.735192760635055 + ], + [ + 7.228675471667403, + -13.96659522687024 + ], + [ + 10.803172589834595, + -11.413107445744108 + ], + [ + 16.515894122589973, + -13.122940360317552 + ], + [ + 18.064782733515074, + -17.824498656134946 + ], + [ + 24.160388020957896, + -17.146081821325136 + ], + [ + 24.868903798698604, + -12.965838732654833 + ], + [ + 30.39532686507639, + -9.635814577273443 + ], + [ + 35.49664046480918, + -11.336252443851281 + ], + [ + 39.18092250906128, + -6.801751466310624 + ], + [ + 36.55941413142096, + -2.692359955414607 + ], + [ + 38.33070357577272, + 3.400875733155674 + ], + [ + 42.794352975538736, + 5.597274644151715 + ], + [ + 42.0149856200241, + 11.761361910495921 + ], + [ + 37.55133622025737, + 12.61158084378484 + ], + [ + 34.221312064876344, + 18.56311337680691 + ], + [ + 36.06345308700204, + 22.53080173215471 + ], + [ + 31.45810053168745, + 26.498490087502876 + ], + [ + 27.702966909661427, + 23.947833287636122 + ], + [ + 21.397176487769006, + 25.506567998665744 + ], + [ + 19.20077757677296, + 30.182772131754618 + ], + [ + 12.894987154880544, + 29.190850042917486 + ], + [ + 12.115619799365913, + 24.372942754280764 + ], + [ + 6.518345155214198, + 22.10569226551043 + ], + [ + 2.408953644318542, + 23.451872243217554 + ], + [ + -1.2753283999335585, + 19.200777576773326 + ], + [ + 0.7793673555146309, + 14.807979754780883 + ], + [ + -0.921070511063206, + 8.927298799533101 + ], + [ + -5.6681262219256405, + 6.376641999666707 + ], + [ + -4.676204133089232, + 1.0627736666110577 + ], + [ + 0, + 0 + ] + ] + }, + { + "type": "ellipse", + "version": 1137, + "versionNonce": 1337635175, + "isDeleted": false, + "id": "eG8Sfta9ACdawTTVkfd3v", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 386.09168061753815, + "y": 1200.0702817967956, + "strokeColor": "transparent", + "backgroundColor": "#fff", + "width": 29.349481925706176, + "height": 29.349481925706176, + "seed": 865367148, + "groupIds": [ + "GXeNeNDLLNU6sD6crDmYB", + "5vsAhxm6C2Bq_rzwF8H7B" + ], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1682013068626, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 1975, + "versionNonce": 596688009, + "isDeleted": false, + "id": "_fEc3U4z2SXB96oAnIoku", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 447.7370485342349, + "y": 1209.6669623150776, + "strokeColor": "#000", + "backgroundColor": "#228be6", + "width": 18.07788101926878, + "height": 17.90807535510263, + "seed": 1706844116, + "groupIds": [ + "GXeNeNDLLNU6sD6crDmYB", + "5vsAhxm6C2Bq_rzwF8H7B" + ], + "roundness": null, + "boundElements": [], + "updated": 1682013068626, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 1.2057586882878402, + -1.9653793429597384 + ], + [ + 0.5042327830146355, + -3.631503367983193 + ], + [ + 2.6965012369929946, + -5.209936654847365 + ], + [ + 4.02989017367221, + -4.257413196374152 + ], + [ + 6.160897540104465, + -4.895229430796297 + ], + [ + 6.738676978632851, + -6.649044193978904 + ], + [ + 9.012510859021344, + -6.395975448337794 + ], + [ + 9.276807365151004, + -4.836626062172748 + ], + [ + 11.338320112962455, + -3.5944324833633208 + ], + [ + 13.241254957095896, + -4.228744098074555 + ], + [ + 14.615596788970292, + -2.5372464588446797 + ], + [ + 13.637699716290658, + -1.004326723292682 + ], + [ + 14.29844098161481, + 1.2686232294224735 + ], + [ + 15.963508970231503, + 2.087942398424365 + ], + [ + 15.672782813488928, + 4.387322001752433 + ], + [ + 14.007714824871965, + 4.704477809108051 + ], + [ + 12.765521246062674, + 6.924568460597247 + ], + [ + 13.452692161999734, + 8.404628894923288 + ], + [ + 11.734764872156946, + 9.884689329249461 + ], + [ + 10.333993389669644, + 8.93322190718261 + ], + [ + 7.981754485115617, + 9.514674220667887 + ], + [ + 7.162435316113725, + 11.259031161123724 + ], + [ + 4.810196411559699, + 10.889016052542143 + ], + [ + 4.519470254817128, + 9.091799810860483 + ], + [ + 2.4315278563927616, + 8.246050991245545 + ], + [ + 0.8986081208408969, + 8.74821435289182 + ], + [ + -0.4757337110334955, + 7.16243531611386 + ], + [ + 0.2907261567425713, + 5.523796978109942 + ], + [ + -0.3435854579686661, + 3.3301359772337933 + ], + [ + -2.1143720490372777, + 2.3786685551670725 + ], + [ + -1.7443569404559698, + 0.3964447591944887 + ], + [ + 0, + 0 + ] + ] + }, + { + "type": "ellipse", + "version": 1000, + "versionNonce": 676195463, + "isDeleted": false, + "id": "1b5s6uM-BDV5kUWVrcJks", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 50, + "angle": 0, + "x": 449.7690757277858, + "y": 1206.9861249883013, + "strokeColor": "transparent", + "backgroundColor": "#fff", + "width": 9.838274710293614, + "height": 9.838274710293614, + "seed": 1346979156, + "groupIds": [ + "GXeNeNDLLNU6sD6crDmYB", + "5vsAhxm6C2Bq_rzwF8H7B" + ], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1682013068626, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 2088, + "versionNonce": 1027228521, + "isDeleted": false, + "id": "ZZdys_5X1Low1zyGOHVNf", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 411.8853501067506, + "y": 1179.0523545381711, + "strokeColor": "#000", + "backgroundColor": "#228be6", + "width": 26.592110509330666, + "height": 26.342330627396294, + "seed": 2121165140, + "groupIds": [ + "GXeNeNDLLNU6sD6crDmYB", + "5vsAhxm6C2Bq_rzwF8H7B" + ], + "roundness": null, + "boundElements": [], + "updated": 1682013068626, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 1.7736408516219317, + -2.8910238221523064 + ], + [ + 0.7417138034076349, + -5.341850561660664 + ], + [ + 3.9664858290767158, + -7.663686420142039 + ], + [ + 5.927867581633842, + -6.262548253370651 + ], + [ + 9.062526080822058, + -7.2007599703479155 + ], + [ + 9.912425173696347, + -9.78057759088306 + ], + [ + 13.257177900119409, + -9.408319800084842 + ], + [ + 13.64595144557746, + -7.114555881882269 + ], + [ + 16.6783851001504, + -5.2873202182293975 + ], + [ + 19.4775546274482, + -6.220376727328793 + ], + [ + 21.4991770638303, + -3.732226036397196 + ], + [ + 20.060714945635674, + -1.4773394727405513 + ], + [ + 21.0326488092808, + 1.8661130181987946 + ], + [ + 23.48192214566627, + 3.07131100911867 + ], + [ + 23.05427124566249, + 6.453640854603741 + ], + [ + 20.60499790927662, + 6.920169109153439 + ], + [ + 18.77776224562395, + 10.185866891001135 + ], + [ + 19.7885734638148, + 12.362998745566134 + ], + [ + 17.26154541833748, + 14.540130600131329 + ], + [ + 15.201045627409659, + 13.140545836482236 + ], + [ + 11.740961072832937, + 13.995847636489982 + ], + [ + 10.53576308191306, + 16.56175303651323 + ], + [ + 7.0756785273363425, + 16.017470072871877 + ], + [ + 6.648027627332568, + 13.37380996375718 + ], + [ + 3.5767166182138967, + 12.129734618291383 + ], + [ + 1.3218300545574475, + 12.86840435466156 + ], + [ + -0.699792381824648, + 10.535763081913261 + ], + [ + 0.4276509000037744, + 8.125367100073314 + ], + [ + -0.5054056090956239, + 4.898546672771543 + ], + [ + -3.110188363664396, + 3.498961909122644 + ], + [ + -2.565905400023444, + 0.5831603181870729 + ], + [ + 0, + 0 + ] + ] + }, + { + "type": "ellipse", + "version": 1112, + "versionNonce": 2097988519, + "isDeleted": false, + "id": "MLDOgkdE-UyaLshVZ-hqU", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 50, + "angle": 0, + "x": 414.87441124899806, + "y": 1175.1089099289727, + "strokeColor": "transparent", + "backgroundColor": "#fff", + "width": 14.471855857355514, + "height": 14.471855857355514, + "seed": 1761484500, + "groupIds": [ + "GXeNeNDLLNU6sD6crDmYB", + "5vsAhxm6C2Bq_rzwF8H7B" + ], + "roundness": { + "type": 2 + }, + "boundElements": [ + { + "id": "twHh6Ujx_ivxDMDAl01mb", + "type": "arrow" + } + ], + "updated": 1682013068626, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 1451, + "versionNonce": 969928265, + "isDeleted": false, + "id": "IdEtWoWSqmZXt15tOPvL2", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 421.4422398725509, + "y": 1208.8967126532036, + "strokeColor": "#000", + "backgroundColor": "#ced4da", + "width": 64.82480153660623, + "height": 27.150152172978316, + "seed": 1182034516, + "groupIds": [ + "GXeNeNDLLNU6sD6crDmYB", + "5vsAhxm6C2Bq_rzwF8H7B" + ], + "roundness": null, + "boundElements": [], + "updated": 1682013068626, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 9.698769110680917, + 4.228444879073213 + ], + [ + 9.904237349153744, + 8.049813005593023 + ], + [ + 7.868421773176677, + 11.549834229089711 + ], + [ + -2.961133307055898, + 9.109371112417243 + ], + [ + -2.808604362263954, + 13.532710511385893 + ], + [ + 3.7501402637923684, + 18.566165689522318 + ], + [ + 12.901876951313557, + 17.19340518639437 + ], + [ + 16.562571626322036, + 13.38018156659395 + ], + [ + 59.72826300246312, + 22.83697614369857 + ], + [ + 61.863668229550335, + 16.735818352018082 + ], + [ + 17.630274239865642, + 7.279023774913457 + ], + [ + 15.64739795756946, + 0.2626923144808493 + ], + [ + 6.49566127004918, + -4.313176029279745 + ], + [ + 0, + 0 + ] + ] + }, + { + "type": "text", + "version": 75, + "versionNonce": 2116269767, + "isDeleted": false, + "id": "38YPYDYCzKCSV-fPo40vw", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 378.5166702270508, + "y": 1292.163834247998, + "strokeColor": "#000", + "backgroundColor": "#fff", + "width": 87.16666412353516, + "height": 32.199999999999996, + "seed": 408435911, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1682013068626, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 2, + "text": "Builder", + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Builder", + "lineHeight": 1.15, + "baseline": 24 + }, + { + "type": "text", + "version": 88, + "versionNonce": 808271145, + "isDeleted": false, + "id": "BmKpura2c_HB6kXjFzGwG", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 389.35000228881836, + "y": 1332.163834247998, + "strokeColor": "#000", + "backgroundColor": "#fff", + "width": 65.66666412353516, + "height": 23, + "seed": 1333197225, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1682013068626, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 2, + "text": "x86_64", + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "x86_64", + "lineHeight": 1.15, + "baseline": 17 + } + ], + "appState": { + "gridSize": null, + "viewBackgroundColor": "#ffffff" + }, + "files": {} +} \ No newline at end of file diff --git a/build/guide/images/parallelism.gif b/build/guide/images/parallelism.gif new file mode 100644 index 0000000000..fef29596b6 Binary files /dev/null and b/build/guide/images/parallelism.gif differ diff --git a/build/guide/images/reordered-layers.png b/build/guide/images/reordered-layers.png new file mode 100644 index 0000000000..1fbcfcd2ce Binary files /dev/null and b/build/guide/images/reordered-layers.png differ diff --git a/build/guide/index.md b/build/guide/index.md new file mode 100644 index 0000000000..f93d910ac2 --- /dev/null +++ b/build/guide/index.md @@ -0,0 +1,34 @@ +--- +title: Build with Docker +description: Explore the features of Docker Build in this step-by-step guide +keywords: build, buildkit, buildx, guide, tutorial +--- + +Welcome! This guide is an introduction and deep-dive into building software with +Docker. + +Whether you’re just getting started, or you’re already an advanced Docker user, +this guide aims to provide useful pointers into the possibilities and best +practices of Docker's build features. + +Topics covered in this guide include: + +- Introduction to build concepts +- Image size optimization +- Build speed performance improvements +- Building and exporting binaries +- Cache mounts and bind mounts +- Software testing +- Multi-platform builds + +Throughout this guide, an example application written in Go is used to +illustrate how the build features work. You don’t need to know the Go +programming language to follow this guide. + +The guide starts off with a simple Dockerfile example, and builds from there. +Some of the later sections in this guide describe advanced concepts and +workflows. You don't need to complete this entire guide from start to finish. +Follow the sections that seem relevant to you, and save the advanced sections at +the end for later, when you need them. + +[Get started](intro.md){: .button .primary-btn } diff --git a/build/guide/intro.md b/build/guide/intro.md new file mode 100644 index 0000000000..0213279bff --- /dev/null +++ b/build/guide/intro.md @@ -0,0 +1,172 @@ +--- +title: Introduction +description: An introduction to the Docker Build guide +keywords: build, buildkit, buildx, guide, tutorial, introduction +--- + +{% include_relative nav.html selected="1" %} + +The starting resources for this guide includes a simple Go project and a +Dockerfile. From this starting point, the guide illustrates various ways that +you can improve how you build the application with Docker. + +## Environment setup + +To follow this guide: + +1. Install [Docker Desktop or Docker Engine](../../get-docker.md) +2. Clone or create a new repository from the + [application example on GitHub](https://github.com/dockersamples/buildme) + +## The application + +The example project for this guide is a client-server application for +translating messages to a fictional language. + +Here’s an overview of the files included in the project: + +```text +. +├── Dockerfile +├── cmd +│   ├── client +│   │   ├── main.go +│   │   ├── request.go +│   │   └── ui.go +│   └── server +│   ├── main.go +│   └── translate.go +├── go.mod +└── go.sum +``` + +The `cmd/` directory contains the code for the two application components: +client and server. The client is a user interface for writing, sending, and +receiving messages. The server receives messages from clients, translates them, +and sends them back to the client. + +## The Dockerfile + +A Dockerfile is a text document in which you define the build steps for your +application. You write the Dockerfile in a domain-specific language, called the +Dockerfile syntax. + +Here's the Dockerfile used as the starting point for this guide: + +```dockerfile +# syntax=docker/dockerfile:1 +FROM golang:{{site.example_go_version}}-alpine +WORKDIR /src +COPY . . +RUN go mod download +RUN go build -o /bin/client ./cmd/client +RUN go build -o /bin/server ./cmd/server +ENTRYPOINT [ "/bin/server" ] +``` + +Here’s what this Dockerfile does: + +1. `# syntax=docker/dockerfile:1` + + This comment is a + [Dockerfile parser directive](../../engine/reference/builder.md#parser-directives). + It specifies which version of the Dockerfile syntax to use. This file uses + the `dockerfile:1` syntax which is best practice: it ensures that you have + access to the latest Docker build features. + +2. `FROM golang:{{site.example_go_version}}-alpine` + + The `FROM` instruction uses version `{{site.example_go_version}}-alpine` of the `golang` official image. + +3. `WORKDIR /src` + + Creates the `/src` working directory inside the container. + +4. `COPY . .` + + Copies the files in the build context to the working directory in the + container. + +5. `RUN go mod download` + + Downloads the necessary Go modules to the container. Go modules is the + dependency management tool for the Go programming language, similar to + `npm install` for JavaScript, or `pip install` for Python. + +6. `RUN go build -o /bin/client ./cmd/client` + + Builds the `client` binary, used to send messages to be translated, into the + `/bin` directory. + +7. `RUN go build -o /bin/server ./cmd/server` + + Builds the `server` binary, which listens for client translation requests, + into the `/bin` directory. + +8. `ENTRYPOINT [ "/bin/server" ]` + + Specifies a command to run when the container starts. Starts the server + process. + +## Build the image + +To build an image using a Dockerfile, you use the `docker` command-line tool. +The command for building an image is `docker build`. + +Run the following command to build the image. + +```console +$ docker build --tag=buildme . +``` + +This creates an image with the tag `buildme`. An image tag is the name of the +image. + +## Run the container + +The image you just built contains two binaries, one for the server and one for +the client. To see the translation service in action, run a container that hosts +the server component, and then run another container that invokes the client. + +To run a container, you use the `docker run` command. + +1. Run a container from the image in detached mode. + + ```console + $ docker run --name=buildme --rm --detach buildme + ``` + + This starts a container named `buildme`. + +2. Run a new command in the `buildme` container that invokes the client binary. + + ```console + $ docker exec -it buildme /bin/client + ``` + +The `docker exec` command opens a terminal user interface where you can submit +messages for the backend (server) process to translate. + +When you're done testing, you can stop the container: + +```console +$ docker stop buildme +``` + +## Summary + +This section gave you an overview of the example application used in this guide, +an introduction to Dockerfiles and building. You've successfully built a +container image and created a container from it. + +Related information: + +- [Dockerfile reference](../../engine/reference/builder.md) +- [`docker build` CLI reference](../../engine/reference/commandline/build.md) +- [`docker run` CLI reference](../../engine/reference/commandline/run.md) + +## Next steps + +The next section explores how you can use layer cache to improve build speed. + +[Layers](layers.md){: .button .primary-btn } diff --git a/build/guide/layers.md b/build/guide/layers.md new file mode 100644 index 0000000000..240dfcd631 --- /dev/null +++ b/build/guide/layers.md @@ -0,0 +1,83 @@ +--- +title: Layers +description: Improving the initial Dockerfile using layers +keywords: build, buildkit, buildx, guide, tutorial, layers +--- + +{% include_relative nav.html selected="2" %} + +The order of Dockerfile instructions matter. A Docker build consists of a series +of ordered build instructions. Each instruction in a Dockerfile roughly translates +to an image layer. The following diagram illustrates how a Dockerfile translates +into a stack of layers in a container image. + +![From Dockerfile to layers](./images/layers.png){:.invertible} + +## Cached layers + +When you run a build, the builder attempts to reuse layers from earlier builds. +If a layer of an image is unchanged, then the builder picks it up from the build cache. +If a layer has changed since the last build, that layer, and all layers that follow, must be rebuilt. + +The Dockerfile from the previous section copies all project files to the +container (`COPY . .`) and then downloads application dependencies in the +following step (`RUN go mod download`). If you were to change any of the project +files, that would invalidate the cache for the `COPY` layer. It also invalidates +the cache for all of the layers that follow. + +![Layer cache is bust](./images/cache-bust.png){:.invertible} + +The current order of the Dockerfile instruction make it so that the builder must +download the Go modules again, despite none of the packages having changed since +last time. + +## Update the instruction order + +You can avoid this redundancy by reordering the instructions in the Dockerfile. +Change the order of the instructions so that downloading and installing dependencies +occurs before you copy the source code over to the container. That way, the +builder can reuse the "dependencies" layer from the cache, even when you +make changes to your source code. + +Go uses two files, called `go.mod` and `go.sum`, to track dependencies for a project. +These files are to Go, what `package.json` and `package-lock.json` are to JavaScript. +For Go to know which dependencies to download, you need to copy the `go.mod` and +`go.sum` files to the container. Add another `COPY` instruction before +`RUN go mod download`, this time copying only the `go.mod` and `go.sum` files. + +```diff + # syntax=docker/dockerfile:1 + FROM golang:{{site.example_go_version}}-alpine + WORKDIR /src +- COPY . . ++ COPY go.mod go.sum . + RUN go mod download ++ COPY . . + RUN go build -o /bin/client ./cmd/client + RUN go build -o /bin/server ./cmd/server + ENTRYPOINT [ "/bin/server" ] +``` + +Now if you edit the application code, building the image won't cause the +builder to download the dependencies each time. The `COPY . .` instruction +appears after the package management instructions, so the builder can reuse the +`RUN go mod download` layer. + +![Reordered](./images/reordered-layers.png){:.invertible} + +## Summary + +Ordering your Dockerfile instructions appropriately helps you avoid unnecessary +work at build time. + +Related information: + +- [Optimizing builds with cache](../cache/index.md) +- [Dockerfile best practices](../../develop/develop-images/dockerfile_best-practices.md) + +## Next steps + +The next section shows how you can make the build run faster, and make the +resulting output smaller, using multi-stage builds. + +[Multi-stage](multi-stage.md){: .button .primary-btn } diff --git a/build/guide/mounts.md b/build/guide/mounts.md new file mode 100644 index 0000000000..433192dda0 --- /dev/null +++ b/build/guide/mounts.md @@ -0,0 +1,228 @@ +--- +title: Mounts +description: Introduction to cache mounts and bind mounts in builds +keywords: > + build, buildkit, buildx, guide, tutorial, mounts, cache mounts, bind mounts +--- + +{% include_relative nav.html selected="4" %} + +This section describes how to use cache mounts and bind mounts with Docker +builds. + +Cache mounts let you specify a persistent package cache to be used during +builds. The persistent cache helps speed up build steps, especially steps that +involve installing packages using a package manager. Having a persistent cache +for packages means that even if you rebuild a layer, you only download new or +changed packages. + +Cache mounts are created using the `--mount` flag together with the `RUN` +instruction in the Dockerfile. To use a cache mount, the format for the flag is +`--mount=type=cache,target=`, where `` is the location of the cache +directory that you wish to mount into the container. + +## Add a cache mount + +The target path to use for the cache mount depends on the package manager you’re +using. The application example in this guide uses Go modules. That means that +the target directory for the cache mount is the directory where the Go module +cache gets written to. According to the +[Go modules reference](https://go.dev/ref/mod#module-cache), the default +location for the module cache is `$GOPATH/pkg/mod`, and the default value for +`$GOPATH` is `/go`. + +Update the build steps for downloading packages and compiling the program to +mount the `/go/pkg/mod` directory as a cache mount: + +```diff + # syntax=docker/dockerfile:1 + FROM golang:{{site.example_go_version}}-alpine AS base + WORKDIR /src + COPY go.mod go.sum . +- RUN go mod download ++ RUN --mount=type=cache,target=/go/pkg/mod/ \ ++ go mod download -x + COPY . . + + FROM base AS build-client +- RUN go build -o /bin/client ./cmd/client ++ RUN --mount=type=cache,target=/go/pkg/mod/ \ ++ go build -o /bin/client ./cmd/client + + FROM base AS build-server +- RUN go build -o /bin/server ./cmd/server ++ RUN --mount=type=cache,target=/go/pkg/mod/ \ ++ go build -o /bin/server ./cmd/server + + FROM scratch AS client + COPY --from=build-client /bin/client /bin/ + ENTRYPOINT [ "/bin/client" ] + + FROM scratch AS server + COPY --from=build-server /bin/server /bin/ + ENTRYPOINT [ "/bin/server" ] +``` + +The `-x` flag added to the `go mod download` command prints the download +executions that take place. Adding this flag lets you see how the cache mount is +being used in the next step. + +## Rebuild the image + +Before you rebuild the image, clear your build cache. This ensures that you're +starting from a clean slate, making it easier to see exactly what the build is +doing. + +```console +$ docker builder prune -af +``` + +Now it’s time to rebuild the image. Invoke the build command, this time together +with the `--progress=plain` flag, while also redirecting the output to a log +file. + +```console +$ docker build --target=client --progress=plain . 2> log1.txt +``` + +When the build has finished, inspect the `log1.txt` file. The logs show how the +Go modules were downloaded as part of the build. + +```console +$ awk '/proxy.golang.org/' log1.txt +#11 0.168 # get https://proxy.golang.org/github.com/charmbracelet/lipgloss/@v/v0.6.0.mod +#11 0.168 # get https://proxy.golang.org/github.com/aymanbagabas/go-osc52/@v/v1.0.3.mod +#11 0.168 # get https://proxy.golang.org/github.com/atotto/clipboard/@v/v0.1.4.mod +#11 0.168 # get https://proxy.golang.org/github.com/charmbracelet/bubbletea/@v/v0.23.1.mod +#11 0.169 # get https://proxy.golang.org/github.com/charmbracelet/bubbles/@v/v0.14.0.mod +#11 0.218 # get https://proxy.golang.org/github.com/charmbracelet/bubbles/@v/v0.14.0.mod: 200 OK (0.049s) +#11 0.218 # get https://proxy.golang.org/github.com/aymanbagabas/go-osc52/@v/v1.0.3.mod: 200 OK (0.049s) +#11 0.218 # get https://proxy.golang.org/github.com/containerd/console/@v/v1.0.3.mod +#11 0.218 # get https://proxy.golang.org/github.com/go-chi/chi/v5/@v/v5.0.0.mod +#11 0.219 # get https://proxy.golang.org/github.com/charmbracelet/bubbletea/@v/v0.23.1.mod: 200 OK (0.050s) +#11 0.219 # get https://proxy.golang.org/github.com/atotto/clipboard/@v/v0.1.4.mod: 200 OK (0.051s) +#11 0.219 # get https://proxy.golang.org/github.com/charmbracelet/lipgloss/@v/v0.6.0.mod: 200 OK (0.051s) +... +``` + +Now, in order to see that the cache mount is being used, change the version of +one of the Go modules that your program imports. By changing the module version, +you're forcing Go to download the new version of the dependency the next time +you build. If you weren’t using cache mounts, your system would re-download all +modules. But because you've added a cache mount, Go can reuse most of the +modules and only download the package versions that doesn't already exist in the +`/go/pkg/mod` directory. + +Update the version of the `chi` package that the server component of the +application uses: + +```console +$ docker run -v $PWD:$PWD -w $PWD golang:{{site.example_go_version}}-alpine \ + go get github.com/go-chi/chi/v5@v5.0.8 +``` + +Now, run another build, and again redirect the build logs to a log file: + +```console +$ docker build --target=client --progress=plain . 2> log2.txt +``` + +Now if you inspect the `log2.txt` file, you’ll find that only the `chi` package +that was changed has been downloaded: + +```console +$ awk '/proxy.golang.org/' log2.txt +#10 0.143 # get https://proxy.golang.org/github.com/go-chi/chi/v5/@v/v5.0.8.mod +#10 0.190 # get https://proxy.golang.org/github.com/go-chi/chi/v5/@v/v5.0.8.mod: 200 OK (0.047s) +#10 0.190 # get https://proxy.golang.org/github.com/go-chi/chi/v5/@v/v5.0.8.info +#10 0.199 # get https://proxy.golang.org/github.com/go-chi/chi/v5/@v/v5.0.8.info: 200 OK (0.008s) +#10 0.201 # get https://proxy.golang.org/github.com/go-chi/chi/v5/@v/v5.0.8.zip +#10 0.209 # get https://proxy.golang.org/github.com/go-chi/chi/v5/@v/v5.0.8.zip: 200 OK (0.008s) +``` + +## Add bind mounts + +There are a few more small optimizations that you can implement to improve the +Dockerfile. Currently, it's using the `COPY` instruction to pull in the `go.mod` +and `go.sum` files before downloading modules. Instead of copying those files +over to the container’s filesystem, you can use a bind mount. A bind mount makes +the files available to the container directly from the host. This change removes +the need for the additional `COPY` instruction (and layer) entirely. + +```diff + # syntax=docker/dockerfile:1 + FROM golang:{{site.example_go_version}}-alpine AS base + WORKDIR /src +- COPY go.mod go.sum . + RUN --mount=type=cache,target=/go/pkg/mod/ \ ++ --mount=type=bind,source=go.sum,target=go.sum \ ++ --mount=type=bind,source=go.mod,target=go.mod \ + go mod download -x + COPY . . + + FROM base AS build-client + RUN --mount=type=cache,target=/go/pkg/mod/ \ + go build -o /bin/client ./cmd/client + + FROM base AS build-server + RUN --mount=type=cache,target=/go/pkg/mod/ \ + go build -o /bin/server ./cmd/server + + FROM scratch AS client + COPY --from=build-client /bin/client /bin/ + ENTRYPOINT [ "/bin/client" ] + + FROM scratch AS server + COPY --from=build-server /bin/server /bin/ + ENTRYPOINT [ "/bin/server" ] +``` + +Similarly, you can use the same technique to remove the need for the second +`COPY` instruction as well. Specify bind mounts in the `build-client` and +`build-server` stages for mounting the current working directory. + +```diff + # syntax=docker/dockerfile:1 + FROM golang:{{site.example_go_version}}-alpine AS base + WORKDIR /src + RUN --mount=type=cache,target=/go/pkg/mod/ \ + --mount=type=bind,source=go.sum,target=go.sum \ + --mount=type=bind,source=go.mod,target=go.mod \ + go mod download -x +- COPY . . + + FROM base AS build-client + RUN --mount=type=cache,target=/go/pkg/mod/ \ ++ --mount=type=bind,target=. \ + go build -o /bin/client ./cmd/client + + FROM base AS build-server + RUN --mount=type=cache,target=/go/pkg/mod/ \ ++ --mount=type=bind,target=. \ + go build -o /bin/server ./cmd/server + + FROM scratch AS client + COPY --from=build-client /bin/client /bin/ + ENTRYPOINT [ "/bin/client" ] + + FROM scratch AS server + COPY --from=build-server /bin/server /bin/ + ENTRYPOINT [ "/bin/server" ] +``` + +## Summary + +This section has shown how you can improve your build speed using cache and bind +mounts. + +Related information: + +- [Dockerfile reference](../../engine/reference/builder.md#run---mount) +- [Bind mounts](../../storage/bind-mounts.md) + +## Next steps + +The next section of this guide is an introduction to making your builds +configurable, using build arguments. + +[Build arguments](build-args.md){: .button .primary-btn } diff --git a/build/guide/multi-platform.md b/build/guide/multi-platform.md new file mode 100644 index 0000000000..66aff74c05 --- /dev/null +++ b/build/guide/multi-platform.md @@ -0,0 +1,274 @@ +--- +title: Multi-platform +description: Building for multiple operating systems and architectures +keywords: >- + build, buildkit, buildx, guide, tutorial, multi-platform, emulation, + cross-compilation +--- + +{% include_relative nav.html selected="8" %} + +Up until this point in the guide, you've built Linux binaries. This section +describes how you can support other operating systems, and architectures, using +multi-platform builds via emulation and cross-compilation. + +The easiest way to get started with building for multiple platforms is using +emulation. With emulation, you can build your app to multiple architectures +without having to make any changes to your Dockerfile. All you need to do is to +pass the `--platform` flag to the build command, specifying the OS and +architecture you want to build for. + +The following command builds the server image for the `linux/arm/v7` platform: + +```console +$ docker build --target=server --platform=linux/arm/v7 . +``` + +You can also use emulation to produce outputs for multiple platforms at once. +However, the default build driver doesn't support concurrent multi-platform +builds. So first, you need to switch to a different builder, that uses a driver +which supports concurrent multi-platform builds. + +To switch to using a different driver, you're going to need to use the Docker +Buildx. Buildx is the next generation build client, and it provides a similar +user experience to the regular `docker build` command that you’re used to, while +supporting additional features. + +## Buildx setup + +Buildx comes pre-bundled with Docker Desktop, and you can invoke this build +client using the `docker buildx` command. No need for any additional setup. If +you installed Docker Engine manually, you may need to install the Buildx plugin +separately. See +[Install Docker Buildx](https://docs.docker.com/build/buildx/install/) for +instructions. + +Verify that the Buildx client is installed on your system, and that you’re able +to run it: + +```console +$ docker buildx version +github.com/docker/buildx v0.10.3 79e156beb11f697f06ac67fa1fb958e4762c0fab +``` + +Next, create a builder that uses the `docker-container`. Run the following +`docker buildx create` command: + +```console +$ docker buildx create --driver=docker-container --name=container +``` + +This creates a new builder with the name `container`. You can list available +builders with `docker buildx ls`. + +```console +$ docker buildx ls +NAME/NODE DRIVER/ENDPOINT STATUS +container docker-container + container_0 unix:///var/run/docker.sock inactive +default * docker + default default running +desktop-linux docker + desktop-linux desktop-linux running +``` + +The status for the new `container` builder is inactive. That's fine - it's +because you haven't started using it yet. + +## Build using emulation + +To run multi-platform builds with Buildx, invoke the `docker buildx build` +command, and pass it the same arguments as you did to the regular `docker build` +command before. Only this time, also add: + +- `--builder=container` to select the new builder +- `--platform=linux/amd64,linux/arm/v7,linux/arm64/v8` to build for multiple + architectures at once + +```console +$ docker buildx build \ + --target=binaries \ + --output=bin \ + --builder=container \ + --platform=linux/amd64,linux/arm64,linux/arm/v7 . +``` + +This command uses emulation to run the same build four times, once for each +platform. The build results are exported to a `bin` directory. + +```text +bin +├── linux_amd64 +│   ├── client +│   └── server +├── linux_arm64 +│   ├── client +│   └── server +└── linux_arm_v7 + ├── client + └── server +``` + +When you build using a builder that supports multi-platform builds, the builder +runs all of the build steps under emulation for each platform that you specify. +Effectively forking the build into two concurrent processes. + +![Build pipelines using emulation](./images/emulation.png){:.invertible} + +There are, however, a few downsides to running multi-platform builds using +emulation: + +- If you tried running the command above, you may have noticed that it took a + long time to finish. Emulation can be much slower than native execution for + CPU-intensive tasks. +- Emulation only works when the architecture is supported by the base image + you’re using. The example in this guide uses the Alpine Linux version of the + `golang` image, which means you can only build Linux images this way, for a + limited set of CPU architectures, without having to change the base image. + +As an alternative to emulation, the next step explores cross-compilation. +Cross-compiling makes multi-platform builds much faster and versatile. + +## Build using cross-compilation + +Using cross-compilation means leveraging the capabilities of a compiler to build +for multiple platforms, without the need for emulation. + +The first thing you'll need to do is pinning the builder to use the node’s +native architecture as the build platform. This is to prevent emulation. Then, +from the node's native architecture, the builder cross-compiles the application +to a number of other target platforms. + +### Platform build arguments + +This approach involves using a few pre-defined build arguments that you have +access to in your Docker builds: `BUILDPLATFORM` and `TARGETPLATFORM` (and +derivatives, like `TARGETOS`). These build arguments reflect the values you pass +to the `--platform` flag. + +For example, if you invoke a build with `--platform=linux/amd64`, then the build +arguments resolve to: + +- `TARGETPLATFORM=linux/amd64` +- `TARGETOS=linux` +- `TARGETARCH=amd64` + +When you pass more than one value to the platform flag, build stages that use +the pre-defined platform arguments are forked automatically for each platform. +This is in contrast to builds running under emulation, where the entire build +pipeline runs per platform. + +![Build pipelines using cross-compilation](./images/cross-compilation.png){:.invertible} + +### Update the Dockerfile + +To build the app using the cross-compilation technique, update the Dockerfile as +follows: + +- Add `--platform=$BUILDPLATFORM` to the `FROM` instruction for the initial + `base` stage, pinning the platform of the `golang` image to match the + architecture of the host machine. +- Add `ARG` instructions for the Go compilation stages, making the `TARGETOS` + and `TARGETARCH` build arguments available to the commands in this stage. +- Set the `GOOS` and `GOARCH` environment variables to the values of `TARGETOS` + and `TARGETARCH`. The Go compiler uses these variables to do + cross-compilation. + +```diff + # syntax=docker/dockerfile:1 + ARG GO_VERSION={{site.example_go_version}} + ARG GOLANGCI_LINT_VERSION={{site.example_golangci_lint_version}} +- FROM golang:${GO_VERSION}-alpine AS base ++ FROM --platform=$BUILDPLATFORM golang:${GO_VERSION}-alpine AS base + WORKDIR /src + RUN --mount=type=cache,target=/go/pkg/mod \ + --mount=type=bind,source=go.mod,target=go.mod \ + --mount=type=bind,source=go.sum,target=go.sum \ + go mod download -x + + FROM base AS build-client ++ ARG TARGETOS ++ ARG TARGETARCH + RUN --mount=type=cache,target=/go/pkg/mod \ + --mount=type=bind,target=. \ +- go build -o /bin/client ./cmd/client ++ GOOS=${TARGETOS} GOARCH=${TARGETARCH} go build -o /bin/client ./cmd/client + + FROM base AS build-server ++ ARG TARGETOS ++ ARG TARGETARCH + RUN --mount=type=cache,target=/go/pkg/mod \ + --mount=type=bind,target=. \ +- go build -o /bin/server ./cmd/server ++ GOOS=${TARGETOS} GOARCH=${TARGETARCH} go build -o /bin/server ./cmd/server + + FROM scratch AS client + COPY --from=build-client /bin/client /bin/ + ENTRYPOINT [ "/bin/client" ] + + FROM scratch AS server + COPY --from=build-server /bin/server /bin/ + ENTRYPOINT [ "/bin/server" ] + + FROM scratch AS binaries + COPY --from=build-client /bin/client / + COPY --from=build-server /bin/server / + + FROM golangci/golangci-lint:${GOLANGCI_LINT_VERSION} as lint + WORKDIR /test + RUN --mount=type=bind,target=. \ + golangci-lint run +``` + +The only thing left to do now is to run the actual build. To run a +multi-platform build, set the `--platform` option, and specify a CSV string of +the OS and architectures that you want to build for. The following command +illustrates how to build, and export, binaries for Mac (ARM64), Windows, and +Linux: + +```console +$ docker buildx build \ + --target=binaries \ + --output=bin \ + --builder=container \ + --platform=darwin/arm64,windows/amd64,linux/amd64 . +``` + +When the build finishes, you’ll find client and server binaries for all of the +selected platforms in the `bin` directory: + +```diff +bin +├── darwin_arm64 +│   ├── client +│   └── server +├── linux_amd64 +│   ├── client +│   └── server +└── windows_amd64 + ├── client + └── server +``` + +## Summary + +This section has demonstrated how you can get started with multi-platform builds +using emulation and cross-compilation. + +Related information: + +- [Multi-platfom images](../building/multi-platform.md) +- [Drivers overview](../drivers/index.md) +- [Docker container driver](../drivers/docker-container.md) +- [`docker buildx create` CLI reference](../../engine/reference/commandline/buildx_create.md) + +You may also want to consider checking out +[xx - Dockerfile cross-compilation helpers](https://github.com/tonistiigi/xx){: target="_blank" rel="noopener" }. +`xx` is a Docker image containing utility scripts that make cross-compiling with Docker builds easier. + +## Next steps + +This section is the final part of the Build with Docker guide. The following +page contains some pointers for where to go next. + +[Next steps](next-steps.md){: .button .primary-btn } diff --git a/build/guide/multi-stage.md b/build/guide/multi-stage.md new file mode 100644 index 0000000000..36a2a516a0 --- /dev/null +++ b/build/guide/multi-stage.md @@ -0,0 +1,193 @@ +--- +title: Multi-stage +description: Faster and smaller builds with multi-stage builds +keywords: build, buildkit, buildx, guide, tutorial, multi-stage +--- + +{% include_relative nav.html selected="3" %} + +This section explores multi-stage builds. There are two main reasons for why +you’d want to use multi-stage builds: + +- They allow you to run build steps in parallel, making your build pipeline + faster and more efficient. +- They allow you to create a final image with a smaller footprint, containing + only what's needed to run your program. + +In a Dockerfile, a build stage is represented by a `FROM` instruction. The +Dockerfile from the previous section doesn’t leverage multi-stage builds. It’s +all one build stage. That means that the final image is bloated with resources +used to compile the program. + +```console +$ docker build --tag=buildme . +$ docker images buildme +REPOSITORY TAG IMAGE ID CREATED SIZE +buildme latest c021c8a7051f 5 seconds ago 150MB +``` + +The program compiles to executable binaries, so you don’t need to Go language +utilities to exist in the final image. + +## Add stages + +Using multi-stage builds, you can choose to use different base images for your +build and runtime environments. You can copy build artifacts from the build +stage over to the runtime stage. + +Modify the Dockerfile as follows. This change creates another stage using a +minimal `scratch` image as a base. In the final `scratch` stage, the binaries +built in the previous stage are copied over to the filesystem of the new stage. + +```diff + # syntax=docker/dockerfile:1 + FROM golang:{{site.example_go_version}}-alpine + WORKDIR /src + COPY go.mod go.sum . + RUN go mod download + COPY . . + RUN go build -o /bin/client ./cmd/client + RUN go build -o /bin/server ./cmd/server ++ ++ FROM scratch ++ COPY --from=0 /bin/client /bin/server /bin/ + ENTRYPOINT [ "/bin/server" ] +``` + +Now if you build the image and inspect it, you should see a significantly +smaller number: + +```console +$ docker build --tag=buildme . +$ docker images buildme +REPOSITORY TAG IMAGE ID CREATED SIZE +buildme latest 436032454dd8 7 seconds ago 8.45MB +``` + +The image went from 150MB to only just 8.45MB in size. That’s because the +resulting image only contains the binaries, and nothing else. + +## Parallelism + +You've reduced the footprint of the image. The following step shows how you can +improve build speed with multi-stage builds, using parallelism. The build +currently produces the binaries one after the other. There is no reason why you +need to build the client before building the server, or vice versa. + +You can split the binary-building steps into separate stages. In the final +`scratch` stage, copy the binaries from each corresponding build stage. By +segmenting these builds into separate stages, Docker can run them in parallel. + +The stages for building each binary both require the Go compilation tools and +application dependencies. Define these common steps as a reusable base stage. +You can do that by assigning a name to the stage using the pattern +`FROM image AS stage_name`. This allows you to reference the stage name in a +`FROM` instruction of another stage (`FROM stage_name`). + +You can also assign a name to the binary-building stages, and reference the +stage name in the `COPY --from=stage_name` instruction when copying the binaries +to the final `scratch` image. + +```diff + # syntax=docker/dockerfile:1 +- FROM golang:{{site.example_go_version}}-alpine ++ FROM golang:{{site.example_go_version}}-alpine AS base + WORKDIR /src + COPY go.mod go.sum . + RUN go mod download + COPY . . ++ ++ FROM base AS build-client + RUN go build -o /bin/client ./cmd/client ++ ++ FROM base AS build-server + RUN go build -o /bin/server ./cmd/server + + FROM scratch +- COPY --from=0 /bin/client /bin/server /bin/ ++ COPY --from=build-client /bin/client /bin/ ++ COPY --from=build-server /bin/server /bin/ + ENTRYPOINT [ "/bin/server" ] +``` + +Now, instead of first building the binaries one after the other, the +`build-client` and `build-server` stages are executed simultaneously. + +![Stages executing in parallel](./images/parallelism.gif) + +## Build targets + +The final image is now small, and you’re building it efficiently using +parallelism. But this image is slightly strange, in that it contains both the +client and the server binary in the same image. Shouldn’t these be two different +images? + +It’s possible to create multiple different images using a single Dockerfile. You +can specify a target stage of a build using the `--target` flag. Replace the +unnamed `FROM scratch` stage with two separate stages named `client` and +`server`. + +```diff + # syntax=docker/dockerfile:1 + FROM golang:{{site.example_go_version}}-alpine AS base + WORKDIR /src + COPY go.mod go.sum . + RUN go mod download + COPY . . + + FROM base AS build-client + RUN go build -o /bin/client ./cmd/client + + FROM base AS build-server + RUN go build -o /bin/server ./cmd/server + +- FROM scratch +- COPY --from=build-client /bin/client /bin/ +- COPY --from=build-server /bin/server /bin/ +- ENTRYPOINT [ "/bin/server" ] + ++ FROM scratch AS client ++ COPY --from=build-client /bin/client /bin/ ++ ENTRYPOINT [ "/bin/client" ] + ++ FROM scratch AS server ++ COPY --from=build-server /bin/server /bin/ ++ ENTRYPOINT [ "/bin/server" ] +``` + +And now you can build the client and server programs as separate Docker images +(tags): + +```console +$ docker build --tag=buildme-client --target=client . +$ docker build --tag=buildme-server --target=server . +$ docker images buildme +REPOSITORY TAG IMAGE ID CREATED SIZE +buildme-client latest 659105f8e6d7 20 seconds ago 4.25MB +buildme-server latest 666d492d9f13 5 seconds ago 4.2MB +``` + +The images are now even smaller, about 4 MB each. + +This change also avoids having to build both binaries each time. When selecting +to build the `client` target, Docker only builds the stages leading up to +that target. The `build-server` and `server` stages are skipped if they’re not +needed. Likewise, building the `server` target skips the `build-client` and +`client` stages. + +## Summary + +Multi-stage builds are useful for creating images with less bloat and a smaller +footprint, and also helps to make builds run faster. + +Related information: + +- [Multi-stage builds](../building/multi-stage.md) +- [Base images](../building/base-images.md) + +## Next steps + +The next section describes how you can use file mounts to further improve build +speeds. + +[Mounts](mounts.md){: .button .primary-btn } diff --git a/build/guide/nav.html b/build/guide/nav.html new file mode 100644 index 0000000000..69c24ed43f --- /dev/null +++ b/build/guide/nav.html @@ -0,0 +1,10 @@ + diff --git a/build/guide/next-steps.md b/build/guide/next-steps.md new file mode 100644 index 0000000000..782396b879 --- /dev/null +++ b/build/guide/next-steps.md @@ -0,0 +1,34 @@ +--- +title: Next steps +description: Next steps following the Docker Build guide +keywords: build, buildkit, buildx, guide, tutorial +--- + +This guide has demonstrated some of the build features and capabilities +that Docker provides. + +If you would like to continue learning about Docker build, consider exploring +the following resources: + +- [BuildKit](../buildkit/index.md): deep-dive into the open source build engine + that powers your Docker builds +- [Drivers](../drivers/index.md): configure for how and where your Docker builds + run +- [Exporters](../exporters/index.md): save your build results to different + output formats +- [Bake](../bake/index.md): orchestrate your build workflows +- [Attestations](../attestations/index.md): annotate your build artifacts with + metadata +- [Continuous integration](../ci/index.md): run Docker builds in CI + +## Feedback + +If you have suggestions for improving the content of this guide, you can use the +feedback widget to submit your feedback. + +If you don't see the feedback widget, try turning off your content filtering +extension or ad blocker, if you use one. + +You can also submit an issue on +[the docs GitHub repository](https://github.com/docker/docs/issues/new){: target="_blank" rel="noopener" }, +if you prefer. diff --git a/build/guide/test.md b/build/guide/test.md new file mode 100644 index 0000000000..36439a97b2 --- /dev/null +++ b/build/guide/test.md @@ -0,0 +1,117 @@ +--- +title: Test +description: Running tests with Docker Build +keywords: build, buildkit, buildx, guide, tutorial, testing +--- + +{% include_relative nav.html selected="7" %} + +This section focuses on testing. The example in this section focuses on linting, +but the same principles apply for other kinds of tests as well, such as unit +tests. Code linting is a static analysis of code that helps you detect errors, +style violations, and anti-patterns. + +The exact steps for how to test your code can vary a lot depending on the +programming language or framework that you use. The example application used in +this guide is written in Go. You will add a build step that uses +`golangci-lint`, a popular linters runner for Go. + +## Run tests + +The `golangci-lint` tool is available as an image on Docker Hub. Before you add +the lint step to the Dockerfile, you can try it out using a `docker run` +command. + +```console +$ docker run -v $PWD:/test -w /test \ + golangci/golangci-lint golangci-lint run +``` + +You will notice that `golangci-lint` works: it finds an issue in the code where +there's a missing error check. + +```text +cmd/server/main.go:23:10: Error return value of `w.Write` is not checked (errcheck) + w.Write([]byte(translated)) + ^ +``` + +Now you can add this as a step to the Dockerfile. + +```diff + # syntax=docker/dockerfile:1 + ARG GO_VERSION={{site.example_go_version}} ++ ARG GOLANGCI_LINT_VERSION={{site.example_golangci_lint_version}} + FROM golang:${GO_VERSION}-alpine AS base + WORKDIR /src + RUN --mount=type=cache,target=/go/pkg/mod/ \ + --mount=type=bind,source=go.sum,target=go.sum \ + --mount=type=bind,source=go.mod,target=go.mod \ + go mod download -x + + FROM base AS build-client + RUN --mount=type=cache,target=/go/pkg/mod/ \ + --mount=type=bind,target=. \ + go build -o /bin/client ./cmd/client + + FROM base AS build-server + ARG APP_VERSION="0.0.0+unknown" + RUN --mount=type=cache,target=/go/pkg/mod/ \ + --mount=type=bind,target=. \ + go build -ldflags "-X main.version=$APP_VERSION" -o /bin/server ./cmd/server + + FROM scratch AS client + COPY --from=build-client /bin/client /bin/ + ENTRYPOINT [ "/bin/client" ] + + FROM scratch AS server + COPY --from=build-server /bin/server /bin/ + ENTRYPOINT [ "/bin/server" ] + + FROM scratch AS binaries + COPY --from=build-client /bin/client / + COPY --from=build-server /bin/server / ++ ++ FROM golangci/golangci-lint:${GOLANGCI_LINT_VERSION} as lint ++ WORKDIR /test ++ RUN --mount=type=bind,target=. \ ++ golangci-lint run +``` + +The added `lint` stage uses the `golangci/golangci-lint` image from Docker Hub +to invoke the `golangci-lint run` command with a bind-mount for the build +context. + +The lint stage is independent of any of the other stages in the Dockerfile. +Therefore, running a regular build won’t cause the lint step to run. To lint the +code, you must specify the `lint` stage: + +```console +$ docker build --target=lint . +``` + +## Export test results + +In addition to running tests, it's sometimes useful to be able to export the +results of a test to a test report. + +Exporting test results is no different to exporting binaries, as shown in the +previous section of this guide: + +1. Save the test results to a file. +2. Create a new stage in your Dockerfile using the `scratch` base image. +3. Export that stage using the `local` exporter. + +The exact steps on how to do this is left as a reader's exercise :-) + +## Summary + +This section has shown an example on how you can use Docker builds to run tests +(or as shown in this section, linters). + +## Next steps + +The next topic in this guide is multi-platform builds, using emulation and +cross-compilation. + +[Multi-platform](multi-platform.md){: .button .primary-btn }